@paraswap/dex-lib 2.31.5 → 2.31.6-sushi-v3

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 (162) hide show
  1. package/.idea/aws.xml +17 -0
  2. package/.idea/codeStyles/Project.xml +19 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/misc.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/paraswap-dex-lib.iml +9 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/build/abi/curve-v1/StableSwapFRXETH.json +889 -0
  9. package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
  10. package/build/abi/sushiswap-v3/QuoterV2.json +267 -0
  11. package/build/abi/sushiswap-v3/RouterProcessor3.json +289 -0
  12. package/build/abi/uniswap-v3/pancakeswap-v3/PancakeswapV3QuoterV2.abi.json +285 -0
  13. package/build/abi/uniswap-v3/pancakeswap-v3/PancakeswapV3Router.abi.json +583 -0
  14. package/build/abi/wBETH.json +1527 -0
  15. package/build/abi/woo-fi/WooFeeManager.abi.json +318 -0
  16. package/build/abi/woo-fi/WooPP.abi.json +548 -0
  17. package/build/abi/woo-fi/Wooracle.abi.json +260 -0
  18. package/build/dex/aave-v3/tokens/arbitrum.json +50 -0
  19. package/build/dex/aave-v3/tokens/avalanche.json +74 -0
  20. package/build/dex/aave-v3/tokens/fantom.json +62 -0
  21. package/build/dex/aave-v3/tokens/optimism.json +50 -0
  22. package/build/dex/aave-v3/tokens/polygon.json +116 -0
  23. package/build/dex/balancer-v2/LinearMath.d.ts +19 -0
  24. package/build/dex/balancer-v2/LinearMath.js +179 -0
  25. package/build/dex/balancer-v2/LinearMath.js.map +1 -0
  26. package/build/dex/balancer-v2/LinearPool.d.ts +47 -0
  27. package/build/dex/balancer-v2/LinearPool.js +324 -0
  28. package/build/dex/balancer-v2/LinearPool.js.map +1 -0
  29. package/build/dex/balancer-v2/PhantomStablePool.d.ts +47 -0
  30. package/build/dex/balancer-v2/PhantomStablePool.js +294 -0
  31. package/build/dex/balancer-v2/PhantomStablePool.js.map +1 -0
  32. package/build/dex/balancer-v2/StableMath.d.ts +9 -0
  33. package/build/dex/balancer-v2/StableMath.js +272 -0
  34. package/build/dex/balancer-v2/StableMath.js.map +1 -0
  35. package/build/dex/balancer-v2/balancer-v2-pool.d.ts +75 -0
  36. package/build/dex/balancer-v2/balancer-v2-pool.js +417 -0
  37. package/build/dex/balancer-v2/balancer-v2-pool.js.map +1 -0
  38. package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
  39. package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
  40. package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
  41. package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
  42. package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
  43. package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
  44. package/build/dex/pancakeswap-v3/types.d.ts +14 -0
  45. package/build/dex/pancakeswap-v3/types.js +3 -0
  46. package/build/dex/pancakeswap-v3/types.js.map +1 -0
  47. package/build/dex/quickswap-v3.d.ts +21 -0
  48. package/build/dex/quickswap-v3.js +40 -0
  49. package/build/dex/quickswap-v3.js.map +1 -0
  50. package/build/dex/ramses-v2/config.d.ts +4 -0
  51. package/build/dex/ramses-v2/config.js +28 -0
  52. package/build/dex/ramses-v2/config.js.map +1 -0
  53. package/build/dex/ramses-v2/constants.d.ts +28 -0
  54. package/build/dex/ramses-v2/constants.js +35 -0
  55. package/build/dex/ramses-v2/constants.js.map +1 -0
  56. package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
  57. package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
  58. package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
  59. package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
  60. package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
  61. package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
  62. package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
  63. package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
  64. package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
  65. package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
  66. package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
  67. package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
  68. package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
  69. package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
  70. package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
  71. package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
  72. package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
  73. package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
  74. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
  75. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
  76. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
  77. package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
  78. package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
  79. package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
  80. package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
  81. package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
  82. package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
  83. package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
  84. package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
  85. package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
  86. package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
  87. package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
  88. package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
  89. package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
  90. package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
  91. package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
  92. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
  93. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
  94. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
  95. package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
  96. package/build/dex/ramses-v2/contract-math/utils.js +16 -0
  97. package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
  98. package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
  99. package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
  100. package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
  101. package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
  102. package/build/dex/ramses-v2/ramses-v2.js +690 -0
  103. package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
  104. package/build/dex/ramses-v2/types.d.ts +154 -0
  105. package/build/dex/ramses-v2/types.js +9 -0
  106. package/build/dex/ramses-v2/types.js.map +1 -0
  107. package/build/dex/ramses-v2/utils.d.ts +6 -0
  108. package/build/dex/ramses-v2/utils.js +71 -0
  109. package/build/dex/ramses-v2/utils.js.map +1 -0
  110. package/build/dex/sushiswap-v3/config.d.ts +4 -0
  111. package/build/dex/sushiswap-v3/config.js +132 -0
  112. package/build/dex/sushiswap-v3/config.js.map +1 -0
  113. package/build/dex/sushiswap-v3/constants.d.ts +4 -0
  114. package/build/dex/sushiswap-v3/constants.js +32 -0
  115. package/build/dex/sushiswap-v3/constants.js.map +1 -0
  116. package/build/dex/sushiswap-v3/sushiswap-v3-original.d.ts +56 -0
  117. package/build/dex/sushiswap-v3/sushiswap-v3-original.js +598 -0
  118. package/build/dex/sushiswap-v3/sushiswap-v3-original.js.map +1 -0
  119. package/build/dex/sushiswap-v3/sushiswap-v3-pool.d.ts +1 -0
  120. package/build/dex/sushiswap-v3/sushiswap-v3-pool.js +6 -0
  121. package/build/dex/sushiswap-v3/sushiswap-v3-pool.js.map +1 -0
  122. package/build/dex/sushiswap-v3/sushiswap-v3.d.ts +21 -0
  123. package/build/dex/sushiswap-v3/sushiswap-v3.js +58 -0
  124. package/build/dex/sushiswap-v3/sushiswap-v3.js.map +1 -0
  125. package/build/dex/sushiswap-v3/token.d.ts +6 -0
  126. package/build/dex/sushiswap-v3/token.js +23 -0
  127. package/build/dex/sushiswap-v3/token.js.map +1 -0
  128. package/build/dex/sushiswap-v3/types.d.ts +15 -0
  129. package/build/dex/sushiswap-v3/types.js +18 -0
  130. package/build/dex/sushiswap-v3/types.js.map +1 -0
  131. package/build/dex/uniswap-v3/config.js +86 -0
  132. package/build/dex/uniswap-v3/config.js.map +1 -1
  133. package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.d.ts +12 -0
  134. package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.js +23 -0
  135. package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.js.map +1 -0
  136. package/build/dex/uniswap-v3/uniswap-v3.js +1 -1
  137. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  138. package/build/dex/woo-fi/config.d.ts +4 -0
  139. package/build/dex/woo-fi/config.js +141 -0
  140. package/build/dex/woo-fi/config.js.map +1 -0
  141. package/build/dex/woo-fi/constants.d.ts +5 -0
  142. package/build/dex/woo-fi/constants.js +20 -0
  143. package/build/dex/woo-fi/constants.js.map +1 -0
  144. package/build/dex/woo-fi/types.d.ts +48 -0
  145. package/build/dex/woo-fi/types.js +3 -0
  146. package/build/dex/woo-fi/types.js.map +1 -0
  147. package/build/dex/woo-fi/woo-fi-decimal-math.d.ts +14 -0
  148. package/build/dex/woo-fi/woo-fi-decimal-math.js +42 -0
  149. package/build/dex/woo-fi/woo-fi-decimal-math.js.map +1 -0
  150. package/build/dex/woo-fi/woo-fi-math.d.ts +31 -0
  151. package/build/dex/woo-fi/woo-fi-math.js +300 -0
  152. package/build/dex/woo-fi/woo-fi-math.js.map +1 -0
  153. package/build/dex/woo-fi/woo-fi.d.ts +65 -0
  154. package/build/dex/woo-fi/woo-fi.js +480 -0
  155. package/build/dex/woo-fi/woo-fi.js.map +1 -0
  156. package/package.json +1 -1
  157. package/src/dex/generic-rfq/example-api.test.ts +1 -1
  158. package/src/dex/uniswap-v3/config.ts +91 -0
  159. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +404 -0
  160. package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +222 -0
  161. package/src/dex/uniswap-v3/uniswap-v3.ts +1 -1
  162. package/tests/constants-e2e.ts +1 -1
@@ -11,7 +11,110 @@ import { Network, ContractMethod, SwapSide } from '../../constants';
11
11
  import { StaticJsonRpcProvider } from '@ethersproject/providers';
12
12
  import { generateConfig } from '../../config';
13
13
 
14
+ function testForNetwork(
15
+ network: Network,
16
+ dexKey: string,
17
+ tokenASymbol: string,
18
+ tokenBSymbol: string,
19
+ tokenAAmount: string,
20
+ tokenBAmount: string,
21
+ nativeTokenAmount: string,
22
+ slippage?: number | undefined,
23
+ ) {
24
+ const provider = new StaticJsonRpcProvider(
25
+ generateConfig(network).privateHttpProvider,
26
+ network,
27
+ );
28
+ const tokens = Tokens[network];
29
+ const holders = Holders[network];
30
+ const nativeTokenSymbol = NativeTokenSymbols[network];
31
+
32
+ const sideToContractMethods = new Map([
33
+ [
34
+ SwapSide.SELL,
35
+ [
36
+ ContractMethod.simpleSwap,
37
+ ContractMethod.multiSwap,
38
+ ContractMethod.megaSwap,
39
+ ContractMethod.directUniV3Swap,
40
+ ],
41
+ ],
42
+ [
43
+ SwapSide.BUY,
44
+ [
45
+ ContractMethod.simpleBuy,
46
+ ContractMethod.buy,
47
+ ContractMethod.directUniV3Buy,
48
+ ],
49
+ ],
50
+ ]);
51
+
52
+ describe(`${network}`, () => {
53
+ sideToContractMethods.forEach((contractMethods, side) =>
54
+ describe(`${side}`, () => {
55
+ contractMethods.forEach((contractMethod: ContractMethod) => {
56
+ describe(`${contractMethod}`, () => {
57
+ it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
58
+ await testE2E(
59
+ tokens[nativeTokenSymbol],
60
+ tokens[tokenASymbol],
61
+ holders[nativeTokenSymbol],
62
+ side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
63
+ side,
64
+ dexKey,
65
+ contractMethod,
66
+ network,
67
+ provider,
68
+ undefined,
69
+ undefined,
70
+ undefined,
71
+ slippage,
72
+ );
73
+ });
74
+ it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
75
+ await testE2E(
76
+ tokens[tokenASymbol],
77
+ tokens[nativeTokenSymbol],
78
+ holders[tokenASymbol],
79
+ side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
80
+ side,
81
+ dexKey,
82
+ contractMethod,
83
+ network,
84
+ provider,
85
+ undefined,
86
+ undefined,
87
+ undefined,
88
+ slippage,
89
+ );
90
+ });
91
+ it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
92
+ await testE2E(
93
+ tokens[tokenASymbol],
94
+ tokens[tokenBSymbol],
95
+ holders[tokenASymbol],
96
+ side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
97
+ side,
98
+ dexKey,
99
+ contractMethod,
100
+ network,
101
+ provider,
102
+ undefined,
103
+ undefined,
104
+ undefined,
105
+ slippage,
106
+ );
107
+ });
108
+ });
109
+ });
110
+ }),
111
+ );
112
+ });
113
+ }
114
+
115
+
14
116
  describe('UniswapV3 E2E', () => {
117
+
15
118
  describe('UniswapV3', () => {
16
119
  const dexKey = 'UniswapV3';
17
120
 
@@ -592,4 +695,305 @@ describe('UniswapV3 E2E', () => {
592
695
  );
593
696
  });
594
697
  });
698
+
699
+ describe('SushiSwapV3 E2E', () => {
700
+ const dexKey = 'SushiSwapV3';
701
+
702
+ describe('MAINNET', () => {
703
+ const network = Network.MAINNET;
704
+
705
+ const tokenASymbol: string = 'USDC';
706
+ const tokenBSymbol: string = 'USDT';
707
+
708
+ const tokenAAmount: string = '111110000';
709
+ const tokenBAmount: string = '1100000000';
710
+ const nativeTokenAmount = '11000000000000000';
711
+
712
+ testForNetwork(
713
+ network,
714
+ dexKey,
715
+ tokenASymbol,
716
+ tokenBSymbol,
717
+ tokenAAmount,
718
+ tokenBAmount,
719
+ nativeTokenAmount,
720
+ );
721
+ });
722
+
723
+ describe('ARBITRUM', () => {
724
+ const network = Network.ARBITRUM;
725
+
726
+ const tokenASymbol: string = 'USDC';
727
+ const tokenBSymbol: string = 'USDCe';
728
+
729
+ const tokenAAmount: string = '10000000';
730
+ const tokenBAmount: string = '10000000';
731
+ const nativeTokenAmount = '900000000000000';
732
+
733
+ testForNetwork(
734
+ network,
735
+ dexKey,
736
+ tokenASymbol,
737
+ tokenBSymbol,
738
+ tokenAAmount,
739
+ tokenBAmount,
740
+ nativeTokenAmount,
741
+ );
742
+ });
743
+
744
+ describe('POLYGON', () => {
745
+ const network = Network.POLYGON;
746
+
747
+ const tokenASymbol: string = 'USDC';
748
+ const tokenBSymbol: string = 'USDT';
749
+
750
+ const tokenAAmount: string = '21111000';
751
+ const tokenBAmount: string = '200000000';
752
+ const nativeTokenAmount = '110000000000000000';
753
+
754
+ testForNetwork(
755
+ network,
756
+ dexKey,
757
+ tokenASymbol,
758
+ tokenBSymbol,
759
+ tokenAAmount,
760
+ tokenBAmount,
761
+ nativeTokenAmount,
762
+ );
763
+ });
764
+
765
+ describe('BSC', () => {
766
+ const network = Network.BSC;
767
+ const tokens = Tokens[network];
768
+ const holders = Holders[network];
769
+ const provider = new StaticJsonRpcProvider(
770
+ generateConfig(network).privateHttpProvider,
771
+ network,
772
+ );
773
+
774
+ const sideToContractMethods = new Map([
775
+ [
776
+ SwapSide.SELL,
777
+ [
778
+ ContractMethod.simpleSwap,
779
+ ContractMethod.multiSwap,
780
+ ContractMethod.megaSwap,
781
+ ContractMethod.directUniV3Swap,
782
+ ],
783
+ ],
784
+ [
785
+ SwapSide.BUY,
786
+ [
787
+ ContractMethod.simpleBuy,
788
+ ContractMethod.buy,
789
+ ContractMethod.directUniV3Buy,
790
+ ],
791
+ ],
792
+ ]);
793
+
794
+ const pairs: { name: string; sellAmount: string; buyAmount: string }[][] = [
795
+ [
796
+ {
797
+ name: 'USDC',
798
+ sellAmount: '100000000000000000000',
799
+ buyAmount: '100000000000000000000',
800
+ },
801
+ {
802
+ name: 'USDT',
803
+ sellAmount: '100000000000000000000',
804
+ buyAmount: '100000000000000000000',
805
+ },
806
+ ],
807
+ [
808
+ {
809
+ name: 'BNB',
810
+ sellAmount: '1000000000000000000',
811
+ buyAmount: '10000000000000000000',
812
+ },
813
+ {
814
+ name: 'USDT',
815
+ sellAmount: '1000000000000000000000',
816
+ buyAmount: '20000000000000000',
817
+ },
818
+ ],
819
+ ];
820
+
821
+ sideToContractMethods.forEach((contractMethods, side) =>
822
+ describe(`${side}`, () => {
823
+ contractMethods.forEach((contractMethod: ContractMethod) => {
824
+ pairs.forEach(pair => {
825
+ describe(`${contractMethod}`, () => {
826
+ it(`${pair[0].name} -> ${pair[1].name}`, async () => {
827
+ await testE2E(
828
+ tokens[pair[0].name],
829
+ tokens[pair[1].name],
830
+ holders[pair[0].name],
831
+ side === SwapSide.SELL
832
+ ? pair[0].sellAmount
833
+ : pair[0].buyAmount,
834
+ side,
835
+ dexKey,
836
+ contractMethod,
837
+ network,
838
+ provider,
839
+ );
840
+ });
841
+ it(`${pair[1].name} -> ${pair[0].name}`, async () => {
842
+ await testE2E(
843
+ tokens[pair[1].name],
844
+ tokens[pair[0].name],
845
+ holders[pair[1].name],
846
+ side === SwapSide.SELL
847
+ ? pair[1].sellAmount
848
+ : pair[1].buyAmount,
849
+ side,
850
+ dexKey,
851
+ contractMethod,
852
+ network,
853
+ provider,
854
+ );
855
+ });
856
+ });
857
+ });
858
+ });
859
+ }),
860
+ );
861
+ });
862
+
863
+ describe('AVALANCHE', () => {
864
+ const network = Network.AVALANCHE;
865
+
866
+ const tokenASymbol: string = 'USDT';
867
+ const tokenBSymbol: string = 'USDC';
868
+
869
+ const tokenAAmount: string = '111110';
870
+ const tokenBAmount: string = '100000';
871
+ const nativeTokenAmount = '11000000000000000';
872
+
873
+ testForNetwork(
874
+ network,
875
+ dexKey,
876
+ tokenASymbol,
877
+ tokenBSymbol,
878
+ tokenAAmount,
879
+ tokenBAmount,
880
+ nativeTokenAmount,
881
+ );
882
+ });
883
+
884
+ describe('FANTOM', () => {
885
+ const network = Network.FANTOM;
886
+ const tokens = Tokens[network];
887
+ const holders = Holders[network];
888
+ const provider = new StaticJsonRpcProvider(
889
+ generateConfig(network).privateHttpProvider,
890
+ network,
891
+ );
892
+
893
+ const sideToContractMethods = new Map([
894
+ [
895
+ SwapSide.SELL,
896
+ [
897
+ ContractMethod.simpleSwap,
898
+ ContractMethod.multiSwap,
899
+ ContractMethod.megaSwap,
900
+ ContractMethod.directUniV3Swap,
901
+ ],
902
+ ],
903
+ [
904
+ SwapSide.BUY,
905
+ [
906
+ ContractMethod.simpleBuy,
907
+ ContractMethod.buy,
908
+ ContractMethod.directUniV3Buy,
909
+ ],
910
+ ],
911
+ ]);
912
+
913
+ const pairs: { name: string; sellAmount: string; buyAmount: string }[][] = [
914
+ [
915
+ {
916
+ name: 'FTM',
917
+ sellAmount: '100000000000000000',
918
+ buyAmount: '100000000',
919
+ },
920
+ {
921
+ name: 'USDC',
922
+ sellAmount: '100000000',
923
+ buyAmount: '100000000000000000',
924
+ },
925
+ ],
926
+ [
927
+ {
928
+ name: 'WFTM',
929
+ sellAmount: '100000000000000',
930
+ buyAmount: '1000000000000000',
931
+ },
932
+ { name: 'WETH', sellAmount: '1000000000000000', buyAmount: '100000000000000' },
933
+ ],
934
+ ];
935
+
936
+ sideToContractMethods.forEach((contractMethods, side) =>
937
+ describe(`${side}`, () => {
938
+ contractMethods.forEach((contractMethod: ContractMethod) => {
939
+ pairs.forEach(pair => {
940
+ describe(`${contractMethod}`, () => {
941
+ it(`${pair[0].name} -> ${pair[1].name}`, async () => {
942
+ await testE2E(
943
+ tokens[pair[0].name],
944
+ tokens[pair[1].name],
945
+ holders[pair[0].name],
946
+ side === SwapSide.SELL
947
+ ? pair[0].sellAmount
948
+ : pair[0].buyAmount,
949
+ side,
950
+ dexKey,
951
+ contractMethod,
952
+ network,
953
+ provider,
954
+ );
955
+ });
956
+ it(`${pair[1].name} -> ${pair[0].name}`, async () => {
957
+ await testE2E(
958
+ tokens[pair[1].name],
959
+ tokens[pair[0].name],
960
+ holders[pair[1].name],
961
+ side === SwapSide.SELL
962
+ ? pair[1].sellAmount
963
+ : pair[1].buyAmount,
964
+ side,
965
+ dexKey,
966
+ contractMethod,
967
+ network,
968
+ provider,
969
+ );
970
+ });
971
+ });
972
+ });
973
+ });
974
+ }),
975
+ );
976
+ });
977
+
978
+ describe('OPTIMISM', () => {
979
+ const network = Network.OPTIMISM;
980
+
981
+ const tokenASymbol: string = 'USDC';
982
+ const tokenBSymbol: string = 'USDT';
983
+
984
+ const tokenAAmount: string = '111110000';
985
+ const tokenBAmount: string = '10000000';
986
+ const nativeTokenAmount = '11000000000000000';
987
+
988
+ testForNetwork(
989
+ network,
990
+ dexKey,
991
+ tokenASymbol,
992
+ tokenBSymbol,
993
+ tokenAAmount,
994
+ tokenBAmount,
995
+ nativeTokenAmount,
996
+ );
997
+ });
998
+ });
595
999
  });
@@ -746,3 +746,225 @@ describe('ChronosV3', () => {
746
746
  checkPoolsLiquidity(poolLiquidity, TokenB.address, dexKey);
747
747
  });
748
748
  });
749
+
750
+ describe('SushiSwapV3', () => {
751
+ const dexKey = 'SushiSwapV3';
752
+
753
+ describe('Mainnet', () => {
754
+ let blockNumber: number;
755
+ let sushiSwapV3: UniswapV3;
756
+ let sushiSwapV3Mainnet: UniswapV3;
757
+
758
+ const network = Network.MAINNET;
759
+ const dexHelper = new DummyDexHelper(network);
760
+ const TokenASymbol = 'USDC';
761
+ const TokenA = Tokens[network][TokenASymbol];
762
+
763
+ const TokenBSymbol = 'USDT';
764
+ const TokenB = Tokens[network][TokenBSymbol];
765
+
766
+ beforeEach(async () => {
767
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
768
+ sushiSwapV3 = new UniswapV3(network, dexKey, dexHelper);
769
+ sushiSwapV3Mainnet = new UniswapV3(Network.MAINNET, dexKey, dexHelper);
770
+ });
771
+
772
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
773
+ const amounts = [0n, BI_POWS[6], 2000000n];
774
+
775
+ const pools = await sushiSwapV3.getPoolIdentifiers(
776
+ TokenA,
777
+ TokenB,
778
+ SwapSide.SELL,
779
+ blockNumber,
780
+ );
781
+ console.log(
782
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
783
+ pools,
784
+ );
785
+
786
+ expect(pools.length).toBeGreaterThan(0);
787
+
788
+ const poolPrices = await sushiSwapV3.getPricesVolume(
789
+ TokenA,
790
+ TokenB,
791
+ amounts,
792
+ SwapSide.SELL,
793
+ blockNumber,
794
+ pools,
795
+ );
796
+ console.log(
797
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
798
+ poolPrices,
799
+ );
800
+
801
+ expect(poolPrices).not.toBeNull();
802
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
803
+
804
+ let falseChecksCounter = 0;
805
+ await Promise.all(
806
+ poolPrices!.map(async price => {
807
+ const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
808
+ const res = await checkOnChainPricing(
809
+ dexHelper,
810
+ sushiSwapV3,
811
+ 'quoteExactInputSingle',
812
+ blockNumber,
813
+ '0x64e8802FE490fa7cc61d3463958199161Bb608A7',
814
+ price.prices,
815
+ TokenA.address,
816
+ TokenB.address,
817
+ fee,
818
+ amounts,
819
+ );
820
+ if (res === false) falseChecksCounter++;
821
+ }),
822
+ );
823
+
824
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
825
+ });
826
+
827
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
828
+ const amounts = [0n, BI_POWS[6], 2000000n];
829
+
830
+ const pools = await sushiSwapV3.getPoolIdentifiers(
831
+ TokenA,
832
+ TokenB,
833
+ SwapSide.BUY,
834
+ blockNumber,
835
+ );
836
+ console.log(
837
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
838
+ pools,
839
+ );
840
+
841
+ expect(pools.length).toBeGreaterThan(0);
842
+
843
+ const poolPrices = await sushiSwapV3.getPricesVolume(
844
+ TokenA,
845
+ TokenB,
846
+ amounts,
847
+ SwapSide.BUY,
848
+ blockNumber,
849
+ pools,
850
+ );
851
+ console.log(
852
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
853
+ poolPrices,
854
+ );
855
+
856
+ expect(poolPrices).not.toBeNull();
857
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
858
+
859
+ let falseChecksCounter = 0;
860
+ await Promise.all(
861
+ poolPrices!.map(async price => {
862
+ const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
863
+ const res = await checkOnChainPricing(
864
+ dexHelper,
865
+ sushiSwapV3,
866
+ 'quoteExactOutputSingle',
867
+ blockNumber,
868
+ '0x64e8802FE490fa7cc61d3463958199161Bb608A7',
869
+ price.prices,
870
+ TokenA.address,
871
+ TokenB.address,
872
+ fee,
873
+ amounts,
874
+ );
875
+ if (res === false) falseChecksCounter++;
876
+ }),
877
+ );
878
+
879
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
880
+ });
881
+
882
+ it('getTopPoolsForToken', async function () {
883
+ const poolLiquidity = await sushiSwapV3.getTopPoolsForToken(
884
+ TokenB.address,
885
+ 10,
886
+ );
887
+ console.log(`${TokenASymbol} Top Pools:`, poolLiquidity);
888
+
889
+ checkPoolsLiquidity(poolLiquidity, TokenB.address, dexKey);
890
+ });
891
+ });
892
+
893
+ describe('Arbitrum', () => {
894
+ let blockNumber: number;
895
+ let sushiSwapV3: UniswapV3;
896
+ let sushiSwapV3Mainnet: UniswapV3;
897
+
898
+ const network = Network.ARBITRUM;
899
+ const dexHelper = new DummyDexHelper(network);
900
+ const TokenASymbol = 'USDCe';
901
+ const TokenA = Tokens[network][TokenASymbol];
902
+
903
+ const TokenBSymbol = 'USDT';
904
+ const TokenB = Tokens[network][TokenBSymbol];
905
+
906
+ beforeEach(async () => {
907
+ // blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
908
+ blockNumber = 125789437;
909
+ sushiSwapV3 = new UniswapV3(network, dexKey, dexHelper);
910
+ sushiSwapV3Mainnet = new UniswapV3(Network.ARBITRUM, dexKey, dexHelper);
911
+ });
912
+
913
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
914
+ const amounts = [0n, 100000000n, 200000000n];
915
+
916
+ const pools = await sushiSwapV3.getPoolIdentifiers(
917
+ TokenA,
918
+ TokenB,
919
+ SwapSide.BUY,
920
+ blockNumber,
921
+ );
922
+ console.log(
923
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
924
+ pools,
925
+ );
926
+
927
+ expect(pools.length).toBeGreaterThan(0);
928
+
929
+ const poolPrices = await sushiSwapV3.getPricesVolume(
930
+ TokenA,
931
+ TokenB,
932
+ amounts,
933
+ SwapSide.BUY,
934
+ blockNumber,
935
+ pools,
936
+ );
937
+ console.log(
938
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
939
+ poolPrices,
940
+ );
941
+
942
+ expect(poolPrices).not.toBeNull();
943
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
944
+
945
+ let falseChecksCounter = 0;
946
+ await Promise.all(
947
+ poolPrices!.map(async price => {
948
+ const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
949
+ const res = await checkOnChainPricing(
950
+ dexHelper,
951
+ sushiSwapV3,
952
+ 'quoteExactOutputSingle',
953
+ blockNumber,
954
+ '0x0524E833cCD057e4d7A296e3aaAb9f7675964Ce1',
955
+ price.prices,
956
+ TokenA.address,
957
+ TokenB.address,
958
+ fee,
959
+ amounts,
960
+ );
961
+ if (res === false) falseChecksCounter++;
962
+ }),
963
+ );
964
+
965
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
966
+ });
967
+
968
+ });
969
+ });
970
+
@@ -91,7 +91,7 @@ export class UniswapV3
91
91
 
92
92
  public static dexKeysWithNetwork: { key: string; networks: Network[] }[] =
93
93
  getDexKeysWithNetwork(
94
- _.pick(UniswapV3Config, ['UniswapV3', 'QuickSwapV3.1', 'RamsesV2', 'ChronosV3']),
94
+ _.pick(UniswapV3Config, ['UniswapV3', 'SushiSwapV3', 'QuickSwapV3.1', 'RamsesV2', 'ChronosV3']),
95
95
  );
96
96
 
97
97
  logger: Logger;
@@ -963,7 +963,7 @@ export const Holders: {
963
963
  DAI: '0x370f4b2dcf75c94d8d4450b493661a9c6170d0b5',
964
964
  FTM: '0x431e81E5dfB5A24541b5Ff8762bDEF3f32F96354',
965
965
  WFTM: '0x3e923747ca2675e096d812c3b24846ac39aed645',
966
- USDC: '0xe48793b1533b351ae184e1c3119d0955dde7b330',
966
+ USDC: '0xf53feaeb035361c046e5669745695e450ebb4028',
967
967
  FUSDT: '0x9ade1c17d25246c405604344f89E8F23F8c1c632',
968
968
  POPS: '0x4b78b52e7de4d8b7d367297cb8a87c1875a9d591',
969
969
  aFanUSDT: '0x8EBc96fF91A30059E447bFC7C0a7394f8A5793E6',