@marko00/routing-finder-mare 1.0.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 (173) hide show
  1. package/.idea/copilot.data.migration.agent.xml +6 -0
  2. package/.idea/copilot.data.migration.ask.xml +6 -0
  3. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  4. package/.idea/copilot.data.migration.edit.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/php.xml +19 -0
  7. package/.idea/ratex-sdk.iml +8 -0
  8. package/.idea/vcs.xml +6 -0
  9. package/LICENSE-MIT +21 -0
  10. package/README.md +209 -0
  11. package/contracts/abi/BalancerHelperAbi.ts +1 -0
  12. package/contracts/abi/CamelotHelperAbi.ts +1 -0
  13. package/contracts/abi/RateXAbi.ts +482 -0
  14. package/contracts/abi/SushiSwapHelperAbi.ts +1 -0
  15. package/contracts/abi/UniswapHelperAbi.ts +1 -0
  16. package/contracts/abi/UniswapV2HelperAbi.ts +1 -0
  17. package/contracts/addresses-arbitrum.ts +8 -0
  18. package/contracts/addresses-mainnet.ts +7 -0
  19. package/contracts/addresses-polkadot.ts +9 -0
  20. package/contracts/addresses-sei.ts +9 -0
  21. package/contracts/rateX/BalancerHelper.ts +13 -0
  22. package/contracts/rateX/CamelotHelper.ts +13 -0
  23. package/contracts/rateX/SushiSwapHelper.ts +13 -0
  24. package/contracts/rateX/UniswapHelper.ts +19 -0
  25. package/contracts/rateX/UniswapV2Helper.ts +19 -0
  26. package/dexes/dexIdsList.ts +9 -0
  27. package/dexes/graph_queries/BalancerV2.ts +150 -0
  28. package/dexes/graph_queries/CamelotV2.ts +202 -0
  29. package/dexes/graph_queries/SushiSwapV2.ts +283 -0
  30. package/dexes/graph_queries/UniswapV2.ts +252 -0
  31. package/dexes/graph_queries/UniswapV3.ts +229 -0
  32. package/dexes/graph_queries/graphQueryFilters.ts +41 -0
  33. package/dexes/graph_queries/x_template.ts +67 -0
  34. package/dexes/pools/Balancer/BalancerState.ts +34 -0
  35. package/dexes/pools/Balancer/BalancerWeightedPool.ts +96 -0
  36. package/dexes/pools/Camelot.ts +164 -0
  37. package/dexes/pools/SushiSwapV2.ts +35 -0
  38. package/dexes/pools/UniswapV2.ts +36 -0
  39. package/dexes/pools/uniswap/UniswapV3.ts +40 -0
  40. package/dexes/pools/uniswap/testUniswapOffchainQuoter.ts +169 -0
  41. package/dexes/pools/uniswap/types.ts +174 -0
  42. package/dexes/pools/uniswap/uniswapOffchainQuoter.ts +173 -0
  43. package/dexes/pools/uniswap/uniswapState.ts +56 -0
  44. package/dexes/pools/uniswap/utils.ts +71 -0
  45. package/dist/contracts/abi/BalancerHelperAbi.d.ts +25 -0
  46. package/dist/contracts/abi/BalancerHelperAbi.js +4 -0
  47. package/dist/contracts/abi/CamelotHelperAbi.d.ts +45 -0
  48. package/dist/contracts/abi/CamelotHelperAbi.js +4 -0
  49. package/dist/contracts/abi/RateXAbi.d.ts +71 -0
  50. package/dist/contracts/abi/RateXAbi.js +485 -0
  51. package/dist/contracts/abi/SushiSwapHelperAbi.d.ts +45 -0
  52. package/dist/contracts/abi/SushiSwapHelperAbi.js +4 -0
  53. package/dist/contracts/abi/UniswapHelperAbi.d.ts +39 -0
  54. package/dist/contracts/abi/UniswapHelperAbi.js +4 -0
  55. package/dist/contracts/abi/UniswapV2HelperAbi.d.ts +45 -0
  56. package/dist/contracts/abi/UniswapV2HelperAbi.js +4 -0
  57. package/dist/contracts/addresses-arbitrum.d.ts +6 -0
  58. package/dist/contracts/addresses-arbitrum.js +10 -0
  59. package/dist/contracts/addresses-mainnet.d.ts +6 -0
  60. package/dist/contracts/addresses-mainnet.js +10 -0
  61. package/dist/contracts/addresses-polkadot.d.ts +6 -0
  62. package/dist/contracts/addresses-polkadot.js +10 -0
  63. package/dist/contracts/addresses-sei.d.ts +6 -0
  64. package/dist/contracts/addresses-sei.js +10 -0
  65. package/dist/contracts/rateX/BalancerHelper.d.ts +26 -0
  66. package/dist/contracts/rateX/BalancerHelper.js +14 -0
  67. package/dist/contracts/rateX/CamelotHelper.d.ts +46 -0
  68. package/dist/contracts/rateX/CamelotHelper.js +14 -0
  69. package/dist/contracts/rateX/SushiSwapHelper.d.ts +46 -0
  70. package/dist/contracts/rateX/SushiSwapHelper.js +14 -0
  71. package/dist/contracts/rateX/UniswapHelper.d.ts +40 -0
  72. package/dist/contracts/rateX/UniswapHelper.js +22 -0
  73. package/dist/contracts/rateX/UniswapV2Helper.d.ts +46 -0
  74. package/dist/contracts/rateX/UniswapV2Helper.js +22 -0
  75. package/dist/dexes/dexIdsList.d.ts +9 -0
  76. package/dist/dexes/dexIdsList.js +12 -0
  77. package/dist/dexes/graph_queries/BalancerV2.d.ts +14 -0
  78. package/dist/dexes/graph_queries/BalancerV2.js +141 -0
  79. package/dist/dexes/graph_queries/CamelotV2.d.ts +14 -0
  80. package/dist/dexes/graph_queries/CamelotV2.js +183 -0
  81. package/dist/dexes/graph_queries/SushiSwapV2.d.ts +14 -0
  82. package/dist/dexes/graph_queries/SushiSwapV2.js +263 -0
  83. package/dist/dexes/graph_queries/UniswapV2.d.ts +14 -0
  84. package/dist/dexes/graph_queries/UniswapV2.js +217 -0
  85. package/dist/dexes/graph_queries/UniswapV3.d.ts +14 -0
  86. package/dist/dexes/graph_queries/UniswapV3.js +198 -0
  87. package/dist/dexes/graph_queries/graphQueryFilters.d.ts +19 -0
  88. package/dist/dexes/graph_queries/graphQueryFilters.js +40 -0
  89. package/dist/dexes/graph_queries/x_template.d.ts +12 -0
  90. package/dist/dexes/graph_queries/x_template.js +57 -0
  91. package/dist/dexes/pools/Balancer/BalancerState.d.ts +6 -0
  92. package/dist/dexes/pools/Balancer/BalancerState.js +32 -0
  93. package/dist/dexes/pools/Balancer/BalancerWeightedPool.d.ts +12 -0
  94. package/dist/dexes/pools/Balancer/BalancerWeightedPool.js +109 -0
  95. package/dist/dexes/pools/Camelot.d.ts +12 -0
  96. package/dist/dexes/pools/Camelot.js +135 -0
  97. package/dist/dexes/pools/SushiSwapV2.d.ts +9 -0
  98. package/dist/dexes/pools/SushiSwapV2.js +34 -0
  99. package/dist/dexes/pools/UniswapV2.d.ts +9 -0
  100. package/dist/dexes/pools/UniswapV2.js +34 -0
  101. package/dist/dexes/pools/uniswap/UniswapV3.d.ts +7 -0
  102. package/dist/dexes/pools/uniswap/UniswapV3.js +36 -0
  103. package/dist/dexes/pools/uniswap/types.d.ts +76 -0
  104. package/dist/dexes/pools/uniswap/types.js +111 -0
  105. package/dist/dexes/pools/uniswap/uniswapOffchainQuoter.d.ts +13 -0
  106. package/dist/dexes/pools/uniswap/uniswapOffchainQuoter.js +121 -0
  107. package/dist/dexes/pools/uniswap/uniswapState.d.ts +14 -0
  108. package/dist/dexes/pools/uniswap/uniswapState.js +51 -0
  109. package/dist/dexes/pools/uniswap/utils.d.ts +3 -0
  110. package/dist/dexes/pools/uniswap/utils.js +41 -0
  111. package/dist/index.d.ts +26 -0
  112. package/dist/index.js +41 -0
  113. package/dist/routes.d.ts +1 -0
  114. package/dist/routes.js +20 -0
  115. package/dist/routing/iterative_spliting/main.d.ts +3 -0
  116. package/dist/routing/iterative_spliting/main.js +104 -0
  117. package/dist/routing/iterative_spliting/multiHopSwap.d.ts +4 -0
  118. package/dist/routing/iterative_spliting/multiHopSwap.js +83 -0
  119. package/dist/routing/main.d.ts +2 -0
  120. package/dist/routing/main.js +22 -0
  121. package/dist/routing/uni_like_algo/algo_config.d.ts +2 -0
  122. package/dist/routing/uni_like_algo/algo_config.js +8 -0
  123. package/dist/routing/uni_like_algo/amount_distribution.d.ts +2 -0
  124. package/dist/routing/uni_like_algo/amount_distribution.js +17 -0
  125. package/dist/routing/uni_like_algo/compute_routes_backtrack.d.ts +3 -0
  126. package/dist/routing/uni_like_algo/compute_routes_backtrack.js +44 -0
  127. package/dist/routing/uni_like_algo/main.d.ts +2 -0
  128. package/dist/routing/uni_like_algo/main.js +49 -0
  129. package/dist/routing/uni_like_algo/routes_quoter.d.ts +21 -0
  130. package/dist/routing/uni_like_algo/routes_quoter.js +53 -0
  131. package/dist/routing/uni_like_algo/swap_finder.d.ts +25 -0
  132. package/dist/routing/uni_like_algo/swap_finder.js +154 -0
  133. package/dist/routing/uni_like_algo/types.d.ts +40 -0
  134. package/dist/routing/uni_like_algo/types.js +12 -0
  135. package/dist/swap/graph_communication.d.ts +5 -0
  136. package/dist/swap/graph_communication.js +187 -0
  137. package/dist/swap/my_local_storage.d.ts +8 -0
  138. package/dist/swap/my_local_storage.js +16 -0
  139. package/dist/utils/addresses.d.ts +24 -0
  140. package/dist/utils/addresses.js +60 -0
  141. package/dist/utils/math/fixed-points.d.ts +14 -0
  142. package/dist/utils/math/fixed-points.js +123 -0
  143. package/dist/utils/math/log-exp.d.ts +5 -0
  144. package/dist/utils/math/log-exp.js +385 -0
  145. package/dist/utils/math/math.d.ts +12 -0
  146. package/dist/utils/math/math.js +50 -0
  147. package/dist/utils/types/types.d.ts +51 -0
  148. package/dist/utils/types/types.js +25 -0
  149. package/dist/utils/utils.d.ts +20 -0
  150. package/dist/utils/utils.js +72 -0
  151. package/images/decenter_logo.png +0 -0
  152. package/index.ts +50 -0
  153. package/package.json +39 -0
  154. package/routes.ts +27 -0
  155. package/routing/iterative_spliting/main.ts +131 -0
  156. package/routing/iterative_spliting/multiHopSwap.ts +98 -0
  157. package/routing/main.ts +22 -0
  158. package/routing/uni_like_algo/algo_config.ts +7 -0
  159. package/routing/uni_like_algo/amount_distribution.ts +16 -0
  160. package/routing/uni_like_algo/compute_routes_backtrack.ts +81 -0
  161. package/routing/uni_like_algo/main.ts +65 -0
  162. package/routing/uni_like_algo/routes_quoter.ts +63 -0
  163. package/routing/uni_like_algo/swap_finder.ts +185 -0
  164. package/routing/uni_like_algo/types.ts +54 -0
  165. package/swap/graph_communication.ts +212 -0
  166. package/swap/my_local_storage.ts +27 -0
  167. package/tsconfig.json +26 -0
  168. package/utils/addresses.ts +64 -0
  169. package/utils/math/fixed-points.ts +88 -0
  170. package/utils/math/log-exp.ts +469 -0
  171. package/utils/math/math.ts +46 -0
  172. package/utils/types/types.ts +100 -0
  173. package/utils/utils.ts +125 -0
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SushiSwapV2Pool = void 0;
4
+ const types_1 = require("../../utils/types/types");
5
+ class SushiSwapV2Pool extends types_1.Pool {
6
+ constructor(poolId, dexId, tokens, reserves) {
7
+ super(poolId, dexId, tokens);
8
+ this.reserves = reserves.slice();
9
+ this.startingReserves = [...this.reserves];
10
+ }
11
+ reset() {
12
+ this.reserves = [...this.startingReserves];
13
+ }
14
+ calculateExpectedOutputAmount(tokenIn, tokenOut, amountIn) {
15
+ let reserveIn = this.reserves[0];
16
+ let reserveOut = this.reserves[1];
17
+ if (tokenIn.toLowerCase() === this.tokens[1]._address.toLowerCase()) {
18
+ reserveIn = this.reserves[1];
19
+ reserveOut = this.reserves[0];
20
+ }
21
+ return (amountIn * BigInt(997) * reserveOut) / (reserveIn * BigInt(1000) + amountIn * BigInt(997));
22
+ }
23
+ update(tokenIn, tokenOut, amountIn, amountOut) {
24
+ if (tokenIn.toLowerCase() === this.tokens[0]._address.toLowerCase()) {
25
+ this.reserves[0] += amountIn;
26
+ this.reserves[1] -= amountOut;
27
+ }
28
+ else {
29
+ this.reserves[1] += amountIn;
30
+ this.reserves[0] -= amountOut;
31
+ }
32
+ }
33
+ }
34
+ exports.SushiSwapV2Pool = SushiSwapV2Pool;
@@ -0,0 +1,9 @@
1
+ import { Pool, Token } from '../../utils/types/types';
2
+ export declare class UniswapV2Pool extends Pool {
3
+ reserves: bigint[];
4
+ startingReserves: bigint[];
5
+ constructor(poolId: string, dexId: string, tokens: Token[], reserves: bigint[]);
6
+ reset(): void;
7
+ calculateExpectedOutputAmount(tokenIn: string, tokenOut: string, amountIn: bigint): bigint;
8
+ update(tokenIn: string, tokenOut: string, amountIn: bigint, amountOut: bigint): void;
9
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UniswapV2Pool = void 0;
4
+ const types_1 = require("../../utils/types/types");
5
+ class UniswapV2Pool extends types_1.Pool {
6
+ constructor(poolId, dexId, tokens, reserves) {
7
+ super(poolId, dexId, tokens);
8
+ this.reserves = reserves.slice();
9
+ this.startingReserves = [...this.reserves];
10
+ }
11
+ reset() {
12
+ this.reserves = [...this.startingReserves];
13
+ }
14
+ calculateExpectedOutputAmount(tokenIn, tokenOut, amountIn) {
15
+ let reserveIn = this.reserves[0];
16
+ let reserveOut = this.reserves[1];
17
+ if (tokenIn.toLowerCase() === this.tokens[1]._address.toLowerCase()) {
18
+ reserveIn = this.reserves[1];
19
+ reserveOut = this.reserves[0];
20
+ }
21
+ return (amountIn * BigInt(997) * reserveOut) / (reserveIn * BigInt(1000) + amountIn * BigInt(997));
22
+ }
23
+ update(tokenIn, tokenOut, amountIn, amountOut) {
24
+ if (tokenIn.toLowerCase() === this.tokens[0]._address.toLowerCase()) {
25
+ this.reserves[0] += amountIn;
26
+ this.reserves[1] -= amountOut;
27
+ }
28
+ else {
29
+ this.reserves[1] += amountIn;
30
+ this.reserves[0] -= amountOut;
31
+ }
32
+ }
33
+ }
34
+ exports.UniswapV2Pool = UniswapV2Pool;
@@ -0,0 +1,7 @@
1
+ import { Pool, Token } from '../../../utils/types/types';
2
+ export declare class UniswapV3Pool extends Pool {
3
+ constructor(poolId: string, dexId: string, tokens: Token[]);
4
+ calculateExpectedOutputAmount(tokenIn: string, tokenOut: string, amountIn: bigint): bigint;
5
+ reset(): void;
6
+ update(tokenIn: string, tokenOut: string, amountIn: bigint): bigint;
7
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UniswapV3Pool = void 0;
4
+ const types_1 = require("../../../utils/types/types");
5
+ const uniswapState_1 = require("./uniswapState");
6
+ class UniswapV3Pool extends types_1.Pool {
7
+ constructor(poolId, dexId, tokens) {
8
+ super(poolId.toLowerCase(), dexId, tokens);
9
+ }
10
+ calculateExpectedOutputAmount(tokenIn, tokenOut, amountIn) {
11
+ const poolData = uniswapState_1.UniswapState.getPoolState(this.poolId);
12
+ if (!poolData) {
13
+ console.log('ERROR: Data for uni v3 pool: ' + this.poolId + ' not found');
14
+ return BigInt(0);
15
+ }
16
+ return uniswapState_1.UniswapState.quoter.quote(poolData, tokenIn, tokenOut, amountIn)[0];
17
+ }
18
+ reset() {
19
+ uniswapState_1.UniswapState.resetPoolState(this.poolId);
20
+ }
21
+ update(tokenIn, tokenOut, amountIn) {
22
+ const poolData = uniswapState_1.UniswapState.getPoolState(this.poolId);
23
+ if (!poolData) {
24
+ console.log('ERROR: Data for uni v3 pool: ' + this.poolId + ' not found');
25
+ return BigInt(0);
26
+ }
27
+ // lastQuote will be stored each time we call quote
28
+ const lastQuote = poolData.lastQuote;
29
+ poolData.data.currentLiquidity = lastQuote.newLiquidity;
30
+ poolData.data.currentSqrtPriceX96 = lastQuote.newSqrtPriceX96;
31
+ poolData.data.currentTickIndex = lastQuote.newTickIndex;
32
+ // we don't need this, because we don't use amountIn anyway
33
+ return BigInt(0);
34
+ }
35
+ }
36
+ exports.UniswapV3Pool = UniswapV3Pool;
@@ -0,0 +1,76 @@
1
+ export declare class PoolInfo {
2
+ pool: string;
3
+ token0: string;
4
+ token1: string;
5
+ tick: bigint;
6
+ tickLiquidityNet: bigint;
7
+ tickSpacing: bigint;
8
+ fee: bigint;
9
+ sqrtPriceX96: bigint;
10
+ liquidity: bigint;
11
+ constructor(pool: string, token0: string, token1: string, tick: bigint, tickLiquidityNet: bigint, tickSpacing: bigint, fee: bigint, sqrtPriceX96: bigint, liquidity: bigint);
12
+ }
13
+ export declare class TickData {
14
+ tick: bigint;
15
+ initialized: boolean;
16
+ liquidityNet: bigint;
17
+ clone(): TickData;
18
+ constructor(tick: bigint, initialized: boolean, liquidityNet: bigint);
19
+ }
20
+ export declare class PoolData {
21
+ info: PoolInfo;
22
+ zeroForOneTicks: TickData[];
23
+ oneForZeroTicks: TickData[];
24
+ constructor(info: PoolInfo, zeroForOneTicks: TickData[], oneForZeroTicks: TickData[]);
25
+ }
26
+ export type SwapState = {
27
+ amountSpecifiedRemaining: bigint;
28
+ amountCalculated: bigint;
29
+ sqrtPriceX96: bigint;
30
+ tick: bigint;
31
+ liquidity: bigint;
32
+ };
33
+ export type StepComputations = {
34
+ sqrtPriceStartX96: bigint;
35
+ tickNext: bigint;
36
+ initialized: boolean;
37
+ sqrtPriceNextX96: bigint;
38
+ amountIn: bigint;
39
+ amountOut: bigint;
40
+ feeAmount: bigint;
41
+ };
42
+ export declare class TradeInfo {
43
+ pool: string;
44
+ tokenIn: string;
45
+ tokenOut: string;
46
+ amountIn: bigint;
47
+ fee: bigint;
48
+ constructor(pool: string, tokenIn: string, tokenOut: string, amountIn: bigint, fee: bigint);
49
+ }
50
+ export declare class AdaptedPoolData {
51
+ pool: string;
52
+ token0: string;
53
+ token1: string;
54
+ tickSpacing: bigint;
55
+ fee: bigint;
56
+ currentLiquidity: bigint;
57
+ currentSqrtPriceX96: bigint;
58
+ ticks: TickData[];
59
+ currentTickIndex: number;
60
+ clone(): AdaptedPoolData;
61
+ constructor(poolData: PoolData | null);
62
+ getCurrTickData(): TickData;
63
+ }
64
+ export declare class LastQuote {
65
+ newLiquidity: bigint;
66
+ newSqrtPriceX96: bigint;
67
+ newTickIndex: number;
68
+ clone(): LastQuote;
69
+ constructor(newLiquidity: bigint, newSqrtPriceX96: bigint, newTickIndex: number);
70
+ }
71
+ export declare class PoolState {
72
+ data: AdaptedPoolData;
73
+ lastQuote: LastQuote;
74
+ clone(): PoolState;
75
+ constructor(currData: AdaptedPoolData, lastQuote: LastQuote);
76
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PoolState = exports.LastQuote = exports.AdaptedPoolData = exports.TradeInfo = exports.PoolData = exports.TickData = exports.PoolInfo = void 0;
4
+ class PoolInfo {
5
+ constructor(pool, token0, token1, tick, tickLiquidityNet, tickSpacing, fee, sqrtPriceX96, liquidity) {
6
+ this.pool = pool;
7
+ this.token0 = token0;
8
+ this.token1 = token1;
9
+ this.tick = tick;
10
+ this.tickLiquidityNet = tickLiquidityNet;
11
+ this.tickSpacing = tickSpacing;
12
+ this.fee = fee;
13
+ this.sqrtPriceX96 = sqrtPriceX96;
14
+ this.liquidity = liquidity;
15
+ }
16
+ }
17
+ exports.PoolInfo = PoolInfo;
18
+ class TickData {
19
+ clone() {
20
+ return new TickData(this.tick, this.initialized, this.liquidityNet);
21
+ }
22
+ constructor(tick, initialized, liquidityNet) {
23
+ this.tick = tick;
24
+ this.initialized = initialized;
25
+ this.liquidityNet = liquidityNet;
26
+ }
27
+ }
28
+ exports.TickData = TickData;
29
+ class PoolData {
30
+ constructor(info, zeroForOneTicks, oneForZeroTicks) {
31
+ this.info = info;
32
+ this.zeroForOneTicks = zeroForOneTicks;
33
+ this.oneForZeroTicks = oneForZeroTicks;
34
+ }
35
+ }
36
+ exports.PoolData = PoolData;
37
+ // helper used for test
38
+ class TradeInfo {
39
+ constructor(pool, tokenIn, tokenOut, amountIn, fee) {
40
+ this.pool = pool;
41
+ this.tokenIn = tokenIn;
42
+ this.tokenOut = tokenOut;
43
+ this.amountIn = amountIn;
44
+ this.fee = fee;
45
+ }
46
+ }
47
+ exports.TradeInfo = TradeInfo;
48
+ class AdaptedPoolData {
49
+ clone() {
50
+ const newData = new AdaptedPoolData(null);
51
+ newData.pool = this.pool;
52
+ newData.token0 = this.token0;
53
+ newData.token1 = this.token1;
54
+ newData.tickSpacing = this.tickSpacing;
55
+ newData.fee = this.fee;
56
+ newData.currentLiquidity = this.currentLiquidity;
57
+ newData.currentSqrtPriceX96 = this.currentSqrtPriceX96;
58
+ newData.ticks = this.ticks.map(e => e.clone());
59
+ newData.currentTickIndex = this.currentTickIndex;
60
+ return newData;
61
+ }
62
+ constructor(poolData) {
63
+ if (!poolData) {
64
+ this.pool = '';
65
+ this.token0 = '';
66
+ this.token1 = '';
67
+ this.tickSpacing = BigInt(0);
68
+ this.fee = BigInt(0);
69
+ this.currentLiquidity = BigInt(0);
70
+ this.currentSqrtPriceX96 = BigInt(0);
71
+ this.ticks = [];
72
+ this.currentTickIndex = 0;
73
+ return;
74
+ }
75
+ this.pool = poolData.info.pool;
76
+ this.token0 = poolData.info.token0;
77
+ this.token1 = poolData.info.token1;
78
+ this.tickSpacing = poolData.info.tickSpacing;
79
+ this.fee = poolData.info.fee;
80
+ this.currentLiquidity = poolData.info.liquidity;
81
+ this.currentSqrtPriceX96 = poolData.info.sqrtPriceX96;
82
+ const currentTickData = new TickData(poolData.info.tick, true, poolData.info.tickLiquidityNet);
83
+ this.ticks = poolData.zeroForOneTicks.reverse().concat(currentTickData).concat(poolData.oneForZeroTicks);
84
+ this.currentTickIndex = poolData.zeroForOneTicks.length;
85
+ }
86
+ getCurrTickData() {
87
+ return this.ticks[this.currentTickIndex];
88
+ }
89
+ }
90
+ exports.AdaptedPoolData = AdaptedPoolData;
91
+ class LastQuote {
92
+ clone() {
93
+ return new LastQuote(this.newLiquidity, this.newSqrtPriceX96, this.newTickIndex);
94
+ }
95
+ constructor(newLiquidity, newSqrtPriceX96, newTickIndex) {
96
+ this.newLiquidity = newLiquidity;
97
+ this.newSqrtPriceX96 = newSqrtPriceX96;
98
+ this.newTickIndex = newTickIndex;
99
+ }
100
+ }
101
+ exports.LastQuote = LastQuote;
102
+ class PoolState {
103
+ clone() {
104
+ return new PoolState(this.data.clone(), this.lastQuote.clone());
105
+ }
106
+ constructor(currData, lastQuote) {
107
+ this.data = currData;
108
+ this.lastQuote = lastQuote;
109
+ }
110
+ }
111
+ exports.PoolState = PoolState;
@@ -0,0 +1,13 @@
1
+ import { PoolState } from "./types";
2
+ export declare class UniswapOffchainQuoter {
3
+ quote(poolState: PoolState, tokenIn: string, tokenOut: string, amountIn: bigint): [bigint, bigint];
4
+ private initSwapState;
5
+ private initStepComputations;
6
+ private convertToFeeAmount;
7
+ private updateSwapIteration;
8
+ private updateSwapStep;
9
+ private calculateAmount;
10
+ private updateTickWithLiquidity;
11
+ private calculateRatioTargetX96;
12
+ private getSqrtPriceLimitX96;
13
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UniswapOffchainQuoter = void 0;
7
+ const v3_sdk_1 = require("@uniswap/v3-sdk");
8
+ const jsbi_1 = __importDefault(require("jsbi"));
9
+ const types_1 = require("./types");
10
+ class UniswapOffchainQuoter {
11
+ quote(poolState, tokenIn, tokenOut, amountIn) {
12
+ if (amountIn <= BigInt(0)) {
13
+ return [BigInt(0), BigInt(0)];
14
+ }
15
+ try {
16
+ const zeroForOne = tokenIn < tokenOut;
17
+ const sqrtPriceLimitX96 = this.getSqrtPriceLimitX96(zeroForOne);
18
+ let state = this.initSwapState(poolState, amountIn);
19
+ let tickDataIndex = zeroForOne
20
+ ? poolState.data.currentTickIndex - 1
21
+ : poolState.data.currentTickIndex + 1;
22
+ while (state.amountSpecifiedRemaining !== BigInt(0) &&
23
+ state.sqrtPriceX96 !== sqrtPriceLimitX96 &&
24
+ tickDataIndex >= 0 &&
25
+ tickDataIndex < poolState.data.ticks.length) {
26
+ const tickData = poolState.data.ticks[tickDataIndex];
27
+ let step = this.initStepComputations(state, tickData);
28
+ this.updateSwapIteration(state, step, tickData, poolState.data.fee, sqrtPriceLimitX96, zeroForOne);
29
+ tickDataIndex = zeroForOne ? tickDataIndex - 1 : tickDataIndex + 1;
30
+ }
31
+ // remember where we left off, so we can update pool later
32
+ poolState.lastQuote = new types_1.LastQuote(state.liquidity, state.sqrtPriceX96, zeroForOne ? tickDataIndex + 2 : tickDataIndex - 2);
33
+ const amountOut = state.amountCalculated > BigInt(0) ? state.amountCalculated : -state.amountCalculated;
34
+ return [amountOut, state.amountSpecifiedRemaining];
35
+ }
36
+ catch (e) {
37
+ return [BigInt(0), BigInt(0)];
38
+ }
39
+ }
40
+ initSwapState(poolState, amountIn) {
41
+ return {
42
+ amountSpecifiedRemaining: amountIn,
43
+ amountCalculated: BigInt(0),
44
+ sqrtPriceX96: poolState.data.currentSqrtPriceX96,
45
+ tick: poolState.data.getCurrTickData().tick,
46
+ liquidity: poolState.data.currentLiquidity
47
+ };
48
+ }
49
+ initStepComputations(state, tickData) {
50
+ return {
51
+ sqrtPriceStartX96: state.sqrtPriceX96,
52
+ tickNext: tickData.tick,
53
+ initialized: tickData.initialized,
54
+ sqrtPriceNextX96: BigInt(v3_sdk_1.TickMath.getSqrtRatioAtTick(Number(tickData.tick)).toString()),
55
+ amountIn: BigInt(0),
56
+ amountOut: BigInt(0),
57
+ feeAmount: BigInt(0)
58
+ };
59
+ }
60
+ convertToFeeAmount(fee) {
61
+ switch (fee.toString()) {
62
+ case "100":
63
+ return v3_sdk_1.FeeAmount.LOWEST;
64
+ case "500":
65
+ return v3_sdk_1.FeeAmount.LOW;
66
+ case "3000":
67
+ return v3_sdk_1.FeeAmount.MEDIUM;
68
+ case "10000":
69
+ return v3_sdk_1.FeeAmount.HIGH;
70
+ default:
71
+ throw new Error("Invalid fee amount");
72
+ }
73
+ }
74
+ updateSwapIteration(state, step, tickData, fee, sqrtPriceLimitX96, zeroForOne) {
75
+ this.updateSwapStep(state, step, fee, sqrtPriceLimitX96, zeroForOne);
76
+ this.calculateAmount(state, step);
77
+ this.updateTickWithLiquidity(state, step, tickData, zeroForOne);
78
+ }
79
+ updateSwapStep(state, step, fee, sqrtPriceLimitX96, zeroForOne) {
80
+ const [sqrtPriceX96, amountIn, amountOut, feeAmount] = v3_sdk_1.SwapMath.computeSwapStep(jsbi_1.default.BigInt(state.sqrtPriceX96.toString()), this.calculateRatioTargetX96(zeroForOne, step.sqrtPriceNextX96, sqrtPriceLimitX96), jsbi_1.default.BigInt(state.liquidity.toString()), jsbi_1.default.BigInt(state.amountSpecifiedRemaining.toString()), this.convertToFeeAmount(fee));
81
+ state.sqrtPriceX96 = BigInt(sqrtPriceX96.toString());
82
+ step.amountIn = BigInt(amountIn.toString());
83
+ step.amountOut = BigInt(amountOut.toString());
84
+ step.feeAmount = BigInt(feeAmount.toString());
85
+ }
86
+ calculateAmount(state, step) {
87
+ state.amountSpecifiedRemaining -= (step.amountIn + step.feeAmount);
88
+ state.amountCalculated -= step.amountOut;
89
+ }
90
+ updateTickWithLiquidity(state, step, tickData, zeroForOne) {
91
+ if (state.sqrtPriceX96 === step.sqrtPriceNextX96) {
92
+ // if the tick is initialized, run the tick transition
93
+ if (step.initialized) {
94
+ let liquidityNet = tickData.liquidityNet;
95
+ // if we're moving leftward, we interpret liquidityNet as the opposite sign
96
+ if (zeroForOne) {
97
+ liquidityNet = -liquidityNet;
98
+ }
99
+ const finalLiquidity = v3_sdk_1.LiquidityMath.addDelta(jsbi_1.default.BigInt(state.liquidity.toString()), jsbi_1.default.BigInt(liquidityNet.toString()));
100
+ state.liquidity = BigInt(finalLiquidity.toString());
101
+ }
102
+ state.tick = zeroForOne ? step.tickNext - BigInt(1) : step.tickNext;
103
+ }
104
+ else if (state.sqrtPriceX96 !== step.sqrtPriceStartX96) {
105
+ // recompute unless we're on a lower tick boundary (i.e. already transitioned ticks), and haven't moved
106
+ const tick = v3_sdk_1.TickMath.getTickAtSqrtRatio(jsbi_1.default.BigInt(state.sqrtPriceX96.toString()));
107
+ state.tick = BigInt(tick.toString());
108
+ }
109
+ }
110
+ calculateRatioTargetX96(zeroForOne, sqrtPriceNextX96, sqrtPriceLimitX96) {
111
+ return (zeroForOne ? sqrtPriceNextX96 < sqrtPriceLimitX96 : sqrtPriceNextX96 > sqrtPriceLimitX96)
112
+ ? jsbi_1.default.BigInt(sqrtPriceLimitX96.toString())
113
+ : jsbi_1.default.BigInt(sqrtPriceNextX96.toString());
114
+ }
115
+ getSqrtPriceLimitX96(zeroForOne) {
116
+ return zeroForOne ?
117
+ BigInt(jsbi_1.default.add(v3_sdk_1.TickMath.MIN_SQRT_RATIO, jsbi_1.default.BigInt("1")).toString()) :
118
+ BigInt(jsbi_1.default.subtract(v3_sdk_1.TickMath.MAX_SQRT_RATIO, jsbi_1.default.BigInt("1")).toString());
119
+ }
120
+ }
121
+ exports.UniswapOffchainQuoter = UniswapOffchainQuoter;
@@ -0,0 +1,14 @@
1
+ import { PoolState } from './types';
2
+ import { UniswapOffchainQuoter } from './uniswapOffchainQuoter';
3
+ import Web3 from 'web3';
4
+ export declare class UniswapState {
5
+ private static poolStateMap;
6
+ private static startingPoolStateMap;
7
+ static quoter: UniswapOffchainQuoter;
8
+ private static batch_size;
9
+ private constructor();
10
+ static getPoolState(poolAddress: string): PoolState | undefined;
11
+ static resetPoolState(poolAddress: string): void;
12
+ private static getPoolsDataFromContract;
13
+ static initializeFreshPoolsData(pools: string[], chainId: number, rpcProvider: Web3): Promise<void>;
14
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UniswapState = void 0;
4
+ const utils_1 = require("./utils");
5
+ const uniswapOffchainQuoter_1 = require("./uniswapOffchainQuoter");
6
+ const UniswapHelper_1 = require("../../../contracts/rateX/UniswapHelper");
7
+ class UniswapState {
8
+ constructor() { }
9
+ static getPoolState(poolAddress) {
10
+ return this.poolStateMap.get(poolAddress.toLowerCase());
11
+ }
12
+ static resetPoolState(poolAddress) {
13
+ const poolState = this.startingPoolStateMap.get(poolAddress.toLowerCase());
14
+ if (poolState) {
15
+ this.poolStateMap.set(poolAddress.toLowerCase(), poolState.clone());
16
+ }
17
+ }
18
+ static async getPoolsDataFromContract(pools, chainId, rpcProvider) {
19
+ //@ts-ignore
20
+ try {
21
+ const UniswapHelperContract = (0, UniswapHelper_1.CreateUniswapHelperContract)(chainId, rpcProvider);
22
+ const rawPoolsData = await UniswapHelperContract.methods.fetchData(pools, 15).call();
23
+ return rawPoolsData.map((rawPoolData) => (0, utils_1.convertRowPoolData)(rawPoolData));
24
+ }
25
+ catch (err) {
26
+ console.log('Error while fetching additional data from the smart contracts: ', err);
27
+ throw err;
28
+ }
29
+ }
30
+ static async initializeFreshPoolsData(pools, chainId, rpcProvider) {
31
+ const poolsSize = pools.length;
32
+ const numberOfBatches = Math.ceil(poolsSize / this.batch_size);
33
+ const promises = [];
34
+ for (let i = 0; i < numberOfBatches; i++) {
35
+ const batch = pools.slice(i * this.batch_size, (i + 1) * this.batch_size);
36
+ promises.push(this.getPoolsDataFromContract(batch, chainId, rpcProvider));
37
+ }
38
+ const allPoolsData = await Promise.all(promises);
39
+ allPoolsData.flat().forEach((poolData) => {
40
+ let poolState = (0, utils_1.convertInitialPoolDataToPoolState)(poolData);
41
+ // we will store keys as lowercase addresses
42
+ this.poolStateMap.set(poolData.info.pool.toLowerCase(), poolState);
43
+ this.startingPoolStateMap.set(poolData.info.pool.toLowerCase(), poolState.clone());
44
+ });
45
+ }
46
+ }
47
+ exports.UniswapState = UniswapState;
48
+ UniswapState.poolStateMap = new Map();
49
+ UniswapState.startingPoolStateMap = new Map();
50
+ UniswapState.quoter = new uniswapOffchainQuoter_1.UniswapOffchainQuoter();
51
+ UniswapState.batch_size = 3;
@@ -0,0 +1,3 @@
1
+ import { PoolData, PoolState } from "./types";
2
+ export declare function convertRowPoolData(poolData: any): PoolData;
3
+ export declare function convertInitialPoolDataToPoolState(poolData: PoolData): PoolState;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertRowPoolData = convertRowPoolData;
4
+ exports.convertInitialPoolDataToPoolState = convertInitialPoolDataToPoolState;
5
+ const types_1 = require("./types");
6
+ function convertRowPoolData(poolData) {
7
+ const getPoolInfo = (poolInfoRaw) => {
8
+ const pool = poolInfoRaw[0];
9
+ const token0 = poolInfoRaw[1];
10
+ const token1 = poolInfoRaw[2];
11
+ const tick = poolInfoRaw[3];
12
+ const tickLiquidityNet = poolInfoRaw[4];
13
+ const tickSpacing = poolInfoRaw[5];
14
+ const fee = poolInfoRaw[6];
15
+ const sqrtPriceX96 = poolInfoRaw[7];
16
+ const liquidity = poolInfoRaw[8];
17
+ return new types_1.PoolInfo(pool, token0, token1, tick, tickLiquidityNet, tickSpacing, fee, sqrtPriceX96, liquidity);
18
+ };
19
+ const getTickData = (tickDataRaw) => {
20
+ const tick = tickDataRaw[0];
21
+ const initialized = tickDataRaw[1];
22
+ const liquidityNet = tickDataRaw[2];
23
+ return new types_1.TickData(tick, initialized, liquidityNet);
24
+ };
25
+ const zeroForOneTicksRaw = poolData[1];
26
+ const zeroForOneTicks = [];
27
+ for (let i = 0; i < zeroForOneTicksRaw.length; i++) {
28
+ zeroForOneTicks.push(getTickData(zeroForOneTicksRaw[i]));
29
+ }
30
+ const oneForZeroTicksRaw = poolData[2];
31
+ const oneForZeroTicks = [];
32
+ for (let i = 0; i < oneForZeroTicksRaw.length; i++) {
33
+ oneForZeroTicks.push(getTickData(oneForZeroTicksRaw[i]));
34
+ }
35
+ return new types_1.PoolData(getPoolInfo(poolData[0]), zeroForOneTicks, oneForZeroTicks);
36
+ }
37
+ function convertInitialPoolDataToPoolState(poolData) {
38
+ const adaptedPoolData = new types_1.AdaptedPoolData(poolData);
39
+ const lastQuote = new types_1.LastQuote(adaptedPoolData.currentLiquidity, adaptedPoolData.currentSqrtPriceX96, adaptedPoolData.currentTickIndex);
40
+ return new types_1.PoolState(adaptedPoolData, lastQuote);
41
+ }
@@ -0,0 +1,26 @@
1
+ import Web3 from "web3";
2
+ import { Quote } from "./utils/types/types";
3
+ import { prepareSwapParams } from "./utils/utils";
4
+ export interface RateXConfig {
5
+ rpcUrl: string;
6
+ chainId: number;
7
+ dexes?: Array<Dexes>;
8
+ graphApiKey: string;
9
+ }
10
+ export declare enum Dexes {
11
+ UNISWAP_V2 = "UniswapV2",
12
+ UNISWAP_V3 = "UniswapV3",
13
+ SUSHISWAP_V2 = "Sushiswap",
14
+ BALANCER = "Balancer",
15
+ CAMELOT = "Camelot"
16
+ }
17
+ export declare class RateX {
18
+ rpcProvider: Web3;
19
+ chainId: number;
20
+ graphApiKey: string;
21
+ dexes: Array<Dexes>;
22
+ constructor(config: RateXConfig);
23
+ getQuote(tokenIn: string, tokenOut: string, amountIn: bigint): Promise<Quote>;
24
+ getSwapCalldata(tokenIn: string, tokenOut: string, amountIn: bigint, slippagePercentage: number, recipient: string, deadlineInMinutes: number): Promise<string>;
25
+ getSwapParameters(tokenIn: string, tokenOut: string, amountIn: bigint, slippagePercentage: number, recipient: string, deadlineInMinutes: number): Promise<ReturnType<typeof prepareSwapParams>>;
26
+ }
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RateX = exports.Dexes = void 0;
7
+ const web3_1 = __importDefault(require("web3"));
8
+ const main_1 = require("./routing/main");
9
+ const graph_communication_1 = require("./swap/graph_communication");
10
+ const utils_1 = require("./utils/utils");
11
+ var Dexes;
12
+ (function (Dexes) {
13
+ Dexes["UNISWAP_V2"] = "UniswapV2";
14
+ Dexes["UNISWAP_V3"] = "UniswapV3";
15
+ Dexes["SUSHISWAP_V2"] = "Sushiswap";
16
+ Dexes["BALANCER"] = "Balancer";
17
+ Dexes["CAMELOT"] = "Camelot";
18
+ })(Dexes || (exports.Dexes = Dexes = {}));
19
+ class RateX {
20
+ constructor(config) {
21
+ this.rpcProvider = new web3_1.default(new web3_1.default.providers.HttpProvider(config.rpcUrl));
22
+ this.chainId = config.chainId;
23
+ this.graphApiKey = config.graphApiKey;
24
+ this.dexes = config.dexes || [Dexes.SUSHISWAP_V2, Dexes.UNISWAP_V2, Dexes.UNISWAP_V3, Dexes.BALANCER, Dexes.CAMELOT];
25
+ }
26
+ ;
27
+ async getQuote(tokenIn, tokenOut, amountIn) {
28
+ const pools = await (0, graph_communication_1.fetchPoolsData)(tokenIn, tokenOut, 5, 5, this.chainId, this.rpcProvider, this.graphApiKey, this.dexes);
29
+ const route = await (0, main_1.findRoute)(tokenIn, tokenOut, amountIn, pools, this.chainId);
30
+ return route;
31
+ }
32
+ async getSwapCalldata(tokenIn, tokenOut, amountIn, slippagePercentage, recipient, deadlineInMinutes) {
33
+ let quote = await this.getQuote(tokenIn, tokenOut, amountIn);
34
+ return (0, utils_1.generateCalldata)(quote, slippagePercentage, deadlineInMinutes, tokenIn, tokenOut, amountIn, recipient);
35
+ }
36
+ async getSwapParameters(tokenIn, tokenOut, amountIn, slippagePercentage, recipient, deadlineInMinutes) {
37
+ let quote = await this.getQuote(tokenIn, tokenOut, amountIn);
38
+ return (0, utils_1.prepareSwapParams)(quote, slippagePercentage, deadlineInMinutes, tokenIn, tokenOut, amountIn, recipient);
39
+ }
40
+ }
41
+ exports.RateX = RateX;
@@ -0,0 +1 @@
1
+ export {};
package/dist/routes.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("./index");
4
+ async function main() {
5
+ const rateX = new index_1.RateX({
6
+ rpcUrl: "https://tiniest-cold-general.sei-pacific.quiknode.pro/dfa7ceb1fbe6d4fdbce164d5e52201488999dd15",
7
+ chainId: 1329,
8
+ dexes: [index_1.Dexes.UNISWAP_V2, index_1.Dexes.UNISWAP_V3],
9
+ graphApiKey: "",
10
+ });
11
+ const tokenIn = "0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"; // real Sei token
12
+ const tokenOut = "0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392"; // real Sei token
13
+ const amountIn = BigInt("1000000000000000000");
14
+ const quote = await rateX.getQuote(tokenIn, tokenOut, amountIn);
15
+ const swapParams = await rateX.getSwapParameters(tokenIn, tokenOut, amountIn, 1, // 1% slippage
16
+ "0xEC744EA7c6792c2D78abdd3E1B1254fdCd32E6fe", 30 // 30 minutes deadline
17
+ );
18
+ console.log("Swap parameters:", swapParams);
19
+ }
20
+ main().catch(console.error);
@@ -0,0 +1,3 @@
1
+ import { Quote, Pool } from "../../utils/types/types";
2
+ declare function findRouteWithIterativeSplitting(tokenA: string, tokenB: string, amountIn: bigint, pools: Pool[], chainId: number): Promise<Quote>;
3
+ export { findRouteWithIterativeSplitting };