@paraswap/dex-lib 3.8.30 → 3.8.32

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 (237) hide show
  1. package/build/abi/AaveV1_lending_pool.json +27 -0
  2. package/build/abi/Aave_GSM.json +751 -0
  3. package/build/abi/aave-gsm/Aave_GSM.json +751 -0
  4. package/build/abi/aave-gsm/IFeeStrategy.json +78 -0
  5. package/build/abi/inception/inception-ineth-pool.json +1062 -0
  6. package/build/abi/inception/inception-ineth.json +609 -0
  7. package/build/abi/inception/inception-ratio-feed.json +93 -0
  8. package/build/abi/inception/inception-vault.json +991 -0
  9. package/build/abi/platypus/asset.json +490 -0
  10. package/build/abi/platypus/avax-pool.json +820 -0
  11. package/build/abi/platypus/oracle.json +119 -0
  12. package/build/abi/platypus/pool.json +677 -0
  13. package/build/abi/smardex/all/smardex-router.json +648 -0
  14. package/build/abi/smardex/layer-1/smardex-factory.json +242 -0
  15. package/build/abi/smardex/layer-1/smardex-pool.json +506 -0
  16. package/build/abi/smardex/layer-2/smardex-factory.json +185 -0
  17. package/build/abi/smardex/layer-2/smardex-pool.json +578 -0
  18. package/build/abi/stkGHO.json +1131 -0
  19. package/build/abi/swaap-v1/pool.json +1346 -0
  20. package/build/abi/usual-bond/usd0pp.abi.json +867 -0
  21. package/build/dex/aave-gsm/aave-gsm-pool.d.ts +28 -0
  22. package/build/dex/aave-gsm/aave-gsm-pool.js +117 -0
  23. package/build/dex/aave-gsm/aave-gsm-pool.js.map +1 -0
  24. package/build/dex/aave-gsm/aave-gsm.d.ts +43 -0
  25. package/build/dex/aave-gsm/aave-gsm.js +306 -0
  26. package/build/dex/aave-gsm/aave-gsm.js.map +1 -0
  27. package/build/dex/aave-gsm/config.d.ts +3 -0
  28. package/build/dex/aave-gsm/config.js +17 -0
  29. package/build/dex/aave-gsm/config.js.map +1 -0
  30. package/build/dex/aave-gsm/types.d.ts +18 -0
  31. package/build/dex/aave-gsm/types.js +3 -0
  32. package/build/dex/aave-gsm/types.js.map +1 -0
  33. package/build/dex/aave-v1/aave-v1.d.ts +34 -0
  34. package/build/dex/aave-v1/aave-v1.js +180 -0
  35. package/build/dex/aave-v1/aave-v1.js.map +1 -0
  36. package/build/dex/aave-v1/config.d.ts +11 -0
  37. package/build/dex/aave-v1/config.js +20 -0
  38. package/build/dex/aave-v1/config.js.map +1 -0
  39. package/build/dex/aave-v1/tokens-mainnet.json +134 -0
  40. package/build/dex/aave-v1/tokens.d.ts +3 -0
  41. package/build/dex/aave-v1/tokens.js +50 -0
  42. package/build/dex/aave-v1/tokens.js.map +1 -0
  43. package/build/dex/aave-v1/types.d.ts +12 -0
  44. package/build/dex/aave-v1/types.js +3 -0
  45. package/build/dex/aave-v1/types.js.map +1 -0
  46. package/build/dex/idle-dao/idle-dao-pool.d.ts +56 -0
  47. package/build/dex/idle-dao/idle-dao-pool.js +176 -0
  48. package/build/dex/idle-dao/idle-dao-pool.js.map +1 -0
  49. package/build/dex/idle-dao/idle-dao-pooling-pool.d.ts +16 -0
  50. package/build/dex/idle-dao/idle-dao-pooling-pool.js +57 -0
  51. package/build/dex/idle-dao/idle-dao-pooling-pool.js.map +1 -0
  52. package/build/dex/idle-dao/scripts.d.ts +9 -0
  53. package/build/dex/idle-dao/scripts.js +552 -0
  54. package/build/dex/idle-dao/scripts.js.map +1 -0
  55. package/build/dex/inception/config.d.ts +5 -0
  56. package/build/dex/inception/config.js +112 -0
  57. package/build/dex/inception/config.js.map +1 -0
  58. package/build/dex/inception/inception-event-pool.d.ts +25 -0
  59. package/build/dex/inception/inception-event-pool.js +57 -0
  60. package/build/dex/inception/inception-event-pool.js.map +1 -0
  61. package/build/dex/inception/inception-native.d.ts +43 -0
  62. package/build/dex/inception/inception-native.js +131 -0
  63. package/build/dex/inception/inception-native.js.map +1 -0
  64. package/build/dex/inception/inception-pool.d.ts +18 -0
  65. package/build/dex/inception/inception-pool.js +32 -0
  66. package/build/dex/inception/inception-pool.js.map +1 -0
  67. package/build/dex/inception/inception-price-feed.d.ts +19 -0
  68. package/build/dex/inception/inception-price-feed.js +51 -0
  69. package/build/dex/inception/inception-price-feed.js.map +1 -0
  70. package/build/dex/inception/inception.d.ts +44 -0
  71. package/build/dex/inception/inception.js +177 -0
  72. package/build/dex/inception/inception.js.map +1 -0
  73. package/build/dex/inception/tokens.d.ts +9 -0
  74. package/build/dex/inception/tokens.js +28 -0
  75. package/build/dex/inception/tokens.js.map +1 -0
  76. package/build/dex/inception/types.d.ts +22 -0
  77. package/build/dex/inception/types.js +3 -0
  78. package/build/dex/inception/types.js.map +1 -0
  79. package/build/dex/inception/utils.d.ts +7 -0
  80. package/build/dex/inception/utils.js +58 -0
  81. package/build/dex/inception/utils.js.map +1 -0
  82. package/build/dex/index.js +4 -0
  83. package/build/dex/index.js.map +1 -1
  84. package/build/dex/platypus/asset.d.ts +14 -0
  85. package/build/dex/platypus/asset.js +97 -0
  86. package/build/dex/platypus/asset.js.map +1 -0
  87. package/build/dex/platypus/config.d.ts +11 -0
  88. package/build/dex/platypus/config.js +69 -0
  89. package/build/dex/platypus/config.js.map +1 -0
  90. package/build/dex/platypus/platypus.d.ts +63 -0
  91. package/build/dex/platypus/platypus.js +473 -0
  92. package/build/dex/platypus/platypus.js.map +1 -0
  93. package/build/dex/platypus/pool-avax.d.ts +8 -0
  94. package/build/dex/platypus/pool-avax.js +54 -0
  95. package/build/dex/platypus/pool-avax.js.map +1 -0
  96. package/build/dex/platypus/pool-base.d.ts +19 -0
  97. package/build/dex/platypus/pool-base.js +86 -0
  98. package/build/dex/platypus/pool-base.js.map +1 -0
  99. package/build/dex/platypus/pool-pure.d.ts +8 -0
  100. package/build/dex/platypus/pool-pure.js +37 -0
  101. package/build/dex/platypus/pool-pure.js.map +1 -0
  102. package/build/dex/platypus/pool-subscriber.d.ts +14 -0
  103. package/build/dex/platypus/pool-subscriber.js +167 -0
  104. package/build/dex/platypus/pool-subscriber.js.map +1 -0
  105. package/build/dex/platypus/pool.d.ts +8 -0
  106. package/build/dex/platypus/pool.js +58 -0
  107. package/build/dex/platypus/pool.js.map +1 -0
  108. package/build/dex/platypus/types.d.ts +92 -0
  109. package/build/dex/platypus/types.js +10 -0
  110. package/build/dex/platypus/types.js.map +1 -0
  111. package/build/dex/quickswap/spiritswap-v3.d.ts +6 -0
  112. package/build/dex/quickswap/spiritswap-v3.js +19 -0
  113. package/build/dex/quickswap/spiritswap-v3.js.map +1 -0
  114. package/build/dex/smardex/config.d.ts +4 -0
  115. package/build/dex/smardex/config.js +64 -0
  116. package/build/dex/smardex/config.js.map +1 -0
  117. package/build/dex/smardex/constants.d.ts +18 -0
  118. package/build/dex/smardex/constants.js +33 -0
  119. package/build/dex/smardex/constants.js.map +1 -0
  120. package/build/dex/smardex/sdk/constants.d.ts +6 -0
  121. package/build/dex/smardex/sdk/constants.js +13 -0
  122. package/build/dex/smardex/sdk/constants.js.map +1 -0
  123. package/build/dex/smardex/sdk/core.d.ts +113 -0
  124. package/build/dex/smardex/sdk/core.js +499 -0
  125. package/build/dex/smardex/sdk/core.js.map +1 -0
  126. package/build/dex/smardex/sdk/errors.d.ts +15 -0
  127. package/build/dex/smardex/sdk/errors.js +22 -0
  128. package/build/dex/smardex/sdk/errors.js.map +1 -0
  129. package/build/dex/smardex/sdk/types.d.ts +62 -0
  130. package/build/dex/smardex/sdk/types.js +3 -0
  131. package/build/dex/smardex/sdk/types.js.map +1 -0
  132. package/build/dex/smardex/sdk/utils.d.ts +44 -0
  133. package/build/dex/smardex/sdk/utils.js +133 -0
  134. package/build/dex/smardex/sdk/utils.js.map +1 -0
  135. package/build/dex/smardex/smardex-event-pool.d.ts +28 -0
  136. package/build/dex/smardex/smardex-event-pool.js +119 -0
  137. package/build/dex/smardex/smardex-event-pool.js.map +1 -0
  138. package/build/dex/smardex/smardex.d.ts +65 -0
  139. package/build/dex/smardex/smardex.js +519 -0
  140. package/build/dex/smardex/smardex.js.map +1 -0
  141. package/build/dex/smardex/types.d.ts +55 -0
  142. package/build/dex/smardex/types.js +3 -0
  143. package/build/dex/smardex/types.js.map +1 -0
  144. package/build/dex/solidly/forks-override/cone.d.ts +22 -0
  145. package/build/dex/solidly/forks-override/cone.js +53 -0
  146. package/build/dex/solidly/forks-override/cone.js.map +1 -0
  147. package/build/dex/solidly/forks-override/solisnek.d.ts +8 -0
  148. package/build/dex/solidly/forks-override/solisnek.js +15 -0
  149. package/build/dex/solidly/forks-override/solisnek.js.map +1 -0
  150. package/build/dex/stkgho/config.d.ts +3 -0
  151. package/build/dex/stkgho/config.js +14 -0
  152. package/build/dex/stkgho/config.js.map +1 -0
  153. package/build/dex/stkgho/stkgho-pool.d.ts +41 -0
  154. package/build/dex/stkgho/stkgho-pool.js +81 -0
  155. package/build/dex/stkgho/stkgho-pool.js.map +1 -0
  156. package/build/dex/stkgho/stkgho.d.ts +41 -0
  157. package/build/dex/stkgho/stkgho.js +163 -0
  158. package/build/dex/stkgho/stkgho.js.map +1 -0
  159. package/build/dex/stkgho/types.d.ts +11 -0
  160. package/build/dex/stkgho/types.js +3 -0
  161. package/build/dex/stkgho/types.js.map +1 -0
  162. package/build/dex/swaap-v1/config.d.ts +17 -0
  163. package/build/dex/swaap-v1/config.js +56 -0
  164. package/build/dex/swaap-v1/config.js.map +1 -0
  165. package/build/dex/swaap-v1/constants.d.ts +6 -0
  166. package/build/dex/swaap-v1/constants.js +17 -0
  167. package/build/dex/swaap-v1/constants.js.map +1 -0
  168. package/build/dex/swaap-v1/libraries/ChainlinkUtils.d.ts +25 -0
  169. package/build/dex/swaap-v1/libraries/ChainlinkUtils.js +62 -0
  170. package/build/dex/swaap-v1/libraries/ChainlinkUtils.js.map +1 -0
  171. package/build/dex/swaap-v1/libraries/Const.d.ts +18 -0
  172. package/build/dex/swaap-v1/libraries/Const.js +26 -0
  173. package/build/dex/swaap-v1/libraries/Const.js.map +1 -0
  174. package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.d.ts +77 -0
  175. package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js +316 -0
  176. package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js.map +1 -0
  177. package/build/dex/swaap-v1/libraries/LogExpMath.d.ts +75 -0
  178. package/build/dex/swaap-v1/libraries/LogExpMath.js +418 -0
  179. package/build/dex/swaap-v1/libraries/LogExpMath.js.map +1 -0
  180. package/build/dex/swaap-v1/libraries/MathMMM.d.ts +185 -0
  181. package/build/dex/swaap-v1/libraries/MathMMM.js +453 -0
  182. package/build/dex/swaap-v1/libraries/MathMMM.js.map +1 -0
  183. package/build/dex/swaap-v1/libraries/Num.d.ts +31 -0
  184. package/build/dex/swaap-v1/libraries/Num.js +167 -0
  185. package/build/dex/swaap-v1/libraries/Num.js.map +1 -0
  186. package/build/dex/swaap-v1/libraries/PoolQuotations.d.ts +23 -0
  187. package/build/dex/swaap-v1/libraries/PoolQuotations.js +131 -0
  188. package/build/dex/swaap-v1/libraries/PoolQuotations.js.map +1 -0
  189. package/build/dex/swaap-v1/libraries/Struct.d.ts +56 -0
  190. package/build/dex/swaap-v1/libraries/Struct.js +3 -0
  191. package/build/dex/swaap-v1/libraries/Struct.js.map +1 -0
  192. package/build/dex/swaap-v1/swaap-v1-pool.d.ts +45 -0
  193. package/build/dex/swaap-v1/swaap-v1-pool.js +656 -0
  194. package/build/dex/swaap-v1/swaap-v1-pool.js.map +1 -0
  195. package/build/dex/swaap-v1/swaap-v1.d.ts +62 -0
  196. package/build/dex/swaap-v1/swaap-v1.js +379 -0
  197. package/build/dex/swaap-v1/swaap-v1.js.map +1 -0
  198. package/build/dex/swaap-v1/types.d.ts +106 -0
  199. package/build/dex/swaap-v1/types.js +9 -0
  200. package/build/dex/swaap-v1/types.js.map +1 -0
  201. package/build/dex/usual-bond/config.d.ts +3 -0
  202. package/build/dex/usual-bond/config.js +13 -0
  203. package/build/dex/usual-bond/config.js.map +1 -0
  204. package/build/dex/usual-bond/types.d.ts +7 -0
  205. package/build/dex/usual-bond/types.js +3 -0
  206. package/build/dex/usual-bond/types.js.map +1 -0
  207. package/build/dex/usual-bond/usual-bond.d.ts +35 -0
  208. package/build/dex/usual-bond/usual-bond.js +162 -0
  209. package/build/dex/usual-bond/usual-bond.js.map +1 -0
  210. package/build/dex/zerox/index.d.ts +1 -1
  211. package/build/dex/zerox/index.js.map +1 -1
  212. package/package.json +2 -3
  213. package/src/abi/aave-gsm/Aave_GSM.json +751 -0
  214. package/src/abi/aave-gsm/IFeeStrategy.json +78 -0
  215. package/src/abi/stkGHO.json +1131 -0
  216. package/src/dex/aave-gsm/aave-gsm-e2e.test.ts +109 -0
  217. package/src/dex/aave-gsm/aave-gsm-events.test.ts +79 -0
  218. package/src/dex/aave-gsm/aave-gsm-integration.test.ts +522 -0
  219. package/src/dex/aave-gsm/aave-gsm-pool.ts +178 -0
  220. package/src/dex/aave-gsm/aave-gsm.ts +410 -0
  221. package/src/dex/aave-gsm/config.ts +16 -0
  222. package/src/dex/aave-gsm/types.ts +23 -0
  223. package/src/dex/index.ts +4 -0
  224. package/src/dex/stkgho/config.ts +14 -0
  225. package/src/dex/stkgho/stkgho-e2e.test.ts +77 -0
  226. package/src/dex/stkgho/stkgho-events.test.ts +79 -0
  227. package/src/dex/stkgho/stkgho-integration.test.ts +226 -0
  228. package/src/dex/stkgho/stkgho-pool.ts +111 -0
  229. package/src/dex/stkgho/stkgho.ts +221 -0
  230. package/src/dex/stkgho/types.ts +14 -0
  231. package/tests/constants-e2e.ts +4 -0
  232. package/.idea/codeStyles/Project.xml +0 -59
  233. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  234. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  235. package/.idea/modules.xml +0 -8
  236. package/.idea/paraswap-dex-lib.iml +0 -12
  237. package/.idea/vcs.xml +0 -6
@@ -0,0 +1,109 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { testE2E } from '../../../tests/utils-e2e';
6
+ import { Tokens, Holders } from '../../../tests/constants-e2e';
7
+ import { Network, ContractMethod, SwapSide } from '../../constants';
8
+ import { StaticJsonRpcProvider } from '@ethersproject/providers';
9
+ import { generateConfig } from '../../config';
10
+
11
+ function testForNetwork(
12
+ network: Network,
13
+ dexKey: string,
14
+ tokenASymbol: string,
15
+ tokenBSymbol: string,
16
+ tokenAAmount: string,
17
+ tokenBAmount: string,
18
+ ) {
19
+ const provider = new StaticJsonRpcProvider(
20
+ generateConfig(network).privateHttpProvider,
21
+ network,
22
+ );
23
+ const tokens = Tokens[network];
24
+ const holders = Holders[network];
25
+
26
+ const sideToContractMethods = new Map([
27
+ [SwapSide.SELL, [ContractMethod.swapExactAmountIn]],
28
+ [SwapSide.BUY, [ContractMethod.swapExactAmountOut]],
29
+ ]);
30
+
31
+ describe.only(`${network}`, () => {
32
+ sideToContractMethods.forEach((contractMethods, side) =>
33
+ describe(`${side}`, () => {
34
+ contractMethods.forEach((contractMethod: ContractMethod) => {
35
+ describe(`${contractMethod}`, () => {
36
+ it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
37
+ await testE2E(
38
+ tokens[tokenASymbol],
39
+ tokens[tokenBSymbol],
40
+ holders[tokenASymbol],
41
+ side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
42
+ side,
43
+ dexKey,
44
+ contractMethod,
45
+ network,
46
+ provider,
47
+ );
48
+ });
49
+ it(`${tokenBSymbol} -> ${tokenASymbol}`, async () => {
50
+ await testE2E(
51
+ tokens[tokenBSymbol],
52
+ tokens[tokenASymbol],
53
+ holders[tokenBSymbol],
54
+ side === SwapSide.SELL ? tokenBAmount : tokenAAmount,
55
+ side,
56
+ dexKey,
57
+ contractMethod,
58
+ network,
59
+ provider,
60
+ );
61
+ });
62
+ });
63
+ });
64
+ }),
65
+ );
66
+ });
67
+ }
68
+
69
+ describe('AaveGsm E2E', () => {
70
+ const dexKey = 'AaveGsm';
71
+
72
+ describe('Mainnet GHO -> USDT', () => {
73
+ const network = Network.MAINNET;
74
+
75
+ const tokenASymbol: string = 'GHO';
76
+ const tokenBSymbol: string = 'USDT';
77
+
78
+ const tokenAAmount: string = '1000000000000000000';
79
+ const tokenBAmount: string = '1000000';
80
+
81
+ testForNetwork(
82
+ network,
83
+ dexKey,
84
+ tokenASymbol,
85
+ tokenBSymbol,
86
+ tokenAAmount,
87
+ tokenBAmount,
88
+ );
89
+ });
90
+
91
+ describe('Mainnet GHO -> USDC', () => {
92
+ const network = Network.MAINNET;
93
+
94
+ const tokenASymbol: string = 'GHO';
95
+ const tokenBSymbol: string = 'USDC';
96
+
97
+ const tokenAAmount: string = '1000000000000000000';
98
+ const tokenBAmount: string = '1000000';
99
+
100
+ testForNetwork(
101
+ network,
102
+ dexKey,
103
+ tokenASymbol,
104
+ tokenBSymbol,
105
+ tokenAAmount,
106
+ tokenBAmount,
107
+ );
108
+ });
109
+ });
@@ -0,0 +1,79 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { AaveGsmEventPool } from './aave-gsm-pool';
6
+ import { Network } from '../../constants';
7
+ import { Address } from '../../types';
8
+ import { DummyDexHelper } from '../../dex-helper/index';
9
+ import { testEventSubscriber } from '../../../tests/utils-events';
10
+ import { PoolState } from './types';
11
+ import { AaveGsmConfig } from './config';
12
+
13
+ jest.setTimeout(50 * 1000);
14
+
15
+ async function fetchPoolState(
16
+ aaveGsmPool: AaveGsmEventPool,
17
+ blockNumber: number,
18
+ poolAddress: string,
19
+ ): Promise<PoolState> {
20
+ const eventState = aaveGsmPool.getState(blockNumber);
21
+ if (eventState) return eventState;
22
+ const onChainState = await aaveGsmPool.generateState(blockNumber);
23
+ aaveGsmPool.setState(onChainState, blockNumber);
24
+ return onChainState;
25
+ }
26
+
27
+ // eventName -> blockNumbers
28
+ type EventMappings = Record<string, number[]>;
29
+
30
+ describe('AaveGsm EventPool Mainnet', function () {
31
+ const dexKey = 'AaveGsm';
32
+ const network = Network.MAINNET;
33
+ const dexHelper = new DummyDexHelper(network);
34
+ const logger = dexHelper.getLogger(dexKey);
35
+ let aaveGsmPool: AaveGsmEventPool;
36
+
37
+ // poolAddress -> EventMappings
38
+ const eventsToTest: Record<Address, EventMappings> = {
39
+ [AaveGsmConfig[dexKey][network].GSM_USDT]: {
40
+ FeeStrategyUpdated: [], // Hasn't been emitted yet
41
+ },
42
+ };
43
+
44
+ beforeEach(async () => {
45
+ aaveGsmPool = new AaveGsmEventPool(
46
+ AaveGsmConfig[dexKey][network].GSM_USDT,
47
+ dexKey,
48
+ network,
49
+ dexHelper,
50
+ logger,
51
+ );
52
+ });
53
+
54
+ Object.entries(eventsToTest).forEach(
55
+ ([poolAddress, events]: [string, EventMappings]) => {
56
+ describe(`Events for ${poolAddress}`, () => {
57
+ Object.entries(events).forEach(
58
+ ([eventName, blockNumbers]: [string, number[]]) => {
59
+ describe(`${eventName}`, () => {
60
+ blockNumbers.forEach((blockNumber: number) => {
61
+ it(`State after ${blockNumber}`, async function () {
62
+ await testEventSubscriber(
63
+ aaveGsmPool,
64
+ aaveGsmPool.addressesSubscribed,
65
+ (_blockNumber: number) =>
66
+ fetchPoolState(aaveGsmPool, _blockNumber, poolAddress),
67
+ blockNumber,
68
+ `${dexKey}_${poolAddress}`,
69
+ dexHelper.provider,
70
+ );
71
+ });
72
+ });
73
+ });
74
+ },
75
+ );
76
+ });
77
+ },
78
+ );
79
+ });
@@ -0,0 +1,522 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { Interface, Result } from '@ethersproject/abi';
6
+ import { DummyDexHelper } from '../../dex-helper/index';
7
+ import { Network, SwapSide } from '../../constants';
8
+ import { BI_POWS } from '../../bigint-constants';
9
+ import { AaveGsm } from './aave-gsm';
10
+ import {
11
+ checkPoolPrices,
12
+ checkPoolsLiquidity,
13
+ checkConstantPoolPrices,
14
+ } from '../../../tests/utils';
15
+ import { Tokens } from '../../../tests/constants-e2e';
16
+ import GSM_ABI from '../../abi/aave-gsm/Aave_GSM.json';
17
+
18
+ function getReaderCalldata(
19
+ exchangeAddress: string,
20
+ readerIface: Interface,
21
+ amounts: bigint[],
22
+ funcName: string,
23
+ ) {
24
+ return amounts.map(amount => ({
25
+ target: exchangeAddress,
26
+ callData: readerIface.encodeFunctionData(funcName, [amount]),
27
+ }));
28
+ }
29
+
30
+ function decodeReaderResult(
31
+ results: Result,
32
+ readerIface: Interface,
33
+ funcName: string,
34
+ index: number,
35
+ ) {
36
+ return results.map(result => {
37
+ const parsed = readerIface.decodeFunctionResult(funcName, result);
38
+ return BigInt(parsed[index]._hex);
39
+ });
40
+ }
41
+
42
+ async function checkOnChainPricing(
43
+ aaveGsm: AaveGsm,
44
+ funcName: string,
45
+ blockNumber: number,
46
+ prices: bigint[],
47
+ amounts: bigint[],
48
+ ) {
49
+ const exchangeAddress = '0x686F8D21520f4ecEc7ba577be08354F4d1EB8262'; // TODO: Put here the real exchange address
50
+ const readerIface = new Interface(GSM_ABI);
51
+
52
+ const readerCallData = getReaderCalldata(
53
+ exchangeAddress,
54
+ readerIface,
55
+ amounts.slice(1),
56
+ funcName,
57
+ );
58
+ const readerResult = (
59
+ await aaveGsm.dexHelper.multiContract.methods
60
+ .aggregate(readerCallData)
61
+ .call({}, blockNumber)
62
+ ).returnData;
63
+
64
+ const expectedPrices = [0n].concat(
65
+ decodeReaderResult(
66
+ readerResult,
67
+ readerIface,
68
+ funcName,
69
+ funcName.indexOf('getGho') == 0 ? 1 : 0,
70
+ ),
71
+ );
72
+
73
+ expect(prices).toEqual(expectedPrices);
74
+ }
75
+
76
+ async function testPricingOnNetwork(
77
+ aaveGsm: AaveGsm,
78
+ network: Network,
79
+ dexKey: string,
80
+ blockNumber: number,
81
+ srcTokenSymbol: string,
82
+ destTokenSymbol: string,
83
+ side: SwapSide,
84
+ amounts: bigint[],
85
+ funcNameToCheck: string,
86
+ ) {
87
+ const networkTokens = Tokens[network];
88
+
89
+ const pools = await aaveGsm.getPoolIdentifiers(
90
+ networkTokens[srcTokenSymbol],
91
+ networkTokens[destTokenSymbol],
92
+ side,
93
+ blockNumber,
94
+ );
95
+ console.log(
96
+ `${srcTokenSymbol} <> ${destTokenSymbol} Pool Identifiers: `,
97
+ pools,
98
+ );
99
+
100
+ expect(pools.length).toBeGreaterThan(0);
101
+
102
+ const poolPrices = await aaveGsm.getPricesVolume(
103
+ networkTokens[srcTokenSymbol],
104
+ networkTokens[destTokenSymbol],
105
+ amounts,
106
+ side,
107
+ blockNumber,
108
+ pools,
109
+ );
110
+ console.log(
111
+ `${srcTokenSymbol} <> ${destTokenSymbol} Pool Prices: `,
112
+ poolPrices,
113
+ );
114
+
115
+ expect(poolPrices).not.toBeNull();
116
+ if (aaveGsm.hasConstantPriceLargeAmounts) {
117
+ checkConstantPoolPrices(poolPrices!, amounts, dexKey);
118
+ } else {
119
+ checkPoolPrices(poolPrices!, amounts, side, dexKey);
120
+ }
121
+
122
+ // Check if onchain pricing equals to calculated ones
123
+ await checkOnChainPricing(
124
+ aaveGsm,
125
+ funcNameToCheck,
126
+ blockNumber,
127
+ poolPrices![0].prices,
128
+ amounts,
129
+ );
130
+ }
131
+
132
+ describe('AaveGsm', function () {
133
+ const dexKey = 'AaveGsm';
134
+ let blockNumber: number;
135
+ let aaveGsm: AaveGsm;
136
+
137
+ describe('Mainnet GSM_USDT: USDT -> GHO', () => {
138
+ const network = Network.MAINNET;
139
+ const dexHelper = new DummyDexHelper(network);
140
+
141
+ const tokens = Tokens[network];
142
+
143
+ const srcTokenSymbol = 'USDT';
144
+ const destTokenSymbol = 'GHO';
145
+
146
+ const amountsForSell = [
147
+ 0n,
148
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
149
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
150
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
151
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
152
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
153
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
154
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
155
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
156
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
157
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
158
+ ];
159
+
160
+ const amountsForBuy = [
161
+ 0n,
162
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
163
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
164
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
165
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
166
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
167
+ 6n * BI_POWS[tokens[destTokenSymbol].decimals],
168
+ 7n * BI_POWS[tokens[destTokenSymbol].decimals],
169
+ 8n * BI_POWS[tokens[destTokenSymbol].decimals],
170
+ 9n * BI_POWS[tokens[destTokenSymbol].decimals],
171
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
172
+ ];
173
+
174
+ beforeAll(async () => {
175
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
176
+ aaveGsm = new AaveGsm(network, dexKey, dexHelper);
177
+ if (aaveGsm.initializePricing) {
178
+ await aaveGsm.initializePricing(blockNumber);
179
+ }
180
+ });
181
+
182
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
183
+ await testPricingOnNetwork(
184
+ aaveGsm,
185
+ network,
186
+ dexKey,
187
+ blockNumber,
188
+ srcTokenSymbol,
189
+ destTokenSymbol,
190
+ SwapSide.SELL,
191
+ amountsForSell,
192
+ 'getGhoAmountForSellAsset',
193
+ );
194
+ });
195
+
196
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
197
+ await testPricingOnNetwork(
198
+ aaveGsm,
199
+ network,
200
+ dexKey,
201
+ blockNumber,
202
+ srcTokenSymbol,
203
+ destTokenSymbol,
204
+ SwapSide.BUY,
205
+ amountsForBuy,
206
+ 'getAssetAmountForSellAsset',
207
+ );
208
+ });
209
+
210
+ it('getTopPoolsForToken', async function () {
211
+ // We have to check without calling initializePricing, because
212
+ // pool-tracker is not calling that function
213
+ const newAaveGsm = new AaveGsm(network, dexKey, dexHelper);
214
+ if (newAaveGsm.updatePoolState) {
215
+ await newAaveGsm.updatePoolState();
216
+ }
217
+ const poolLiquidity = await newAaveGsm.getTopPoolsForToken(
218
+ tokens[srcTokenSymbol].address,
219
+ 10,
220
+ );
221
+ console.log(`${srcTokenSymbol} Top Pools:`, poolLiquidity);
222
+
223
+ if (!newAaveGsm.hasConstantPriceLargeAmounts) {
224
+ checkPoolsLiquidity(
225
+ poolLiquidity,
226
+ Tokens[network][srcTokenSymbol].address,
227
+ dexKey,
228
+ );
229
+ }
230
+ });
231
+ });
232
+
233
+ describe('Mainnet GSM_USDT: GHO -> USDT', () => {
234
+ const network = Network.MAINNET;
235
+ const dexHelper = new DummyDexHelper(network);
236
+
237
+ const tokens = Tokens[network];
238
+
239
+ const srcTokenSymbol = 'GHO';
240
+ const destTokenSymbol = 'USDT';
241
+
242
+ const amountsForSell = [
243
+ 0n,
244
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
245
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
246
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
247
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
248
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
249
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
250
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
251
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
252
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
253
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
254
+ ];
255
+
256
+ const amountsForBuy = [
257
+ 0n,
258
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
259
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
260
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
261
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
262
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
263
+ 6n * BI_POWS[tokens[destTokenSymbol].decimals],
264
+ 7n * BI_POWS[tokens[destTokenSymbol].decimals],
265
+ 8n * BI_POWS[tokens[destTokenSymbol].decimals],
266
+ 9n * BI_POWS[tokens[destTokenSymbol].decimals],
267
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
268
+ ];
269
+
270
+ beforeAll(async () => {
271
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
272
+ aaveGsm = new AaveGsm(network, dexKey, dexHelper);
273
+ if (aaveGsm?.initializePricing) {
274
+ await aaveGsm.initializePricing(blockNumber);
275
+ }
276
+ });
277
+
278
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
279
+ await testPricingOnNetwork(
280
+ aaveGsm,
281
+ network,
282
+ dexKey,
283
+ blockNumber,
284
+ srcTokenSymbol,
285
+ destTokenSymbol,
286
+ SwapSide.SELL,
287
+ amountsForSell,
288
+ 'getAssetAmountForBuyAsset',
289
+ );
290
+ });
291
+
292
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
293
+ await testPricingOnNetwork(
294
+ aaveGsm,
295
+ network,
296
+ dexKey,
297
+ blockNumber,
298
+ srcTokenSymbol,
299
+ destTokenSymbol,
300
+ SwapSide.BUY,
301
+ amountsForBuy,
302
+ 'getGhoAmountForBuyAsset',
303
+ );
304
+ });
305
+
306
+ it('getTopPoolsForToken', async function () {
307
+ // We have to check without calling initializePricing, because
308
+ // pool-tracker is not calling that function
309
+ const newAaveGsm = new AaveGsm(network, dexKey, dexHelper);
310
+ if (newAaveGsm.updatePoolState) {
311
+ await newAaveGsm.updatePoolState();
312
+ }
313
+ const poolLiquidity = await newAaveGsm.getTopPoolsForToken(
314
+ tokens[srcTokenSymbol].address,
315
+ 10,
316
+ );
317
+ console.log(`${srcTokenSymbol} Top Pools:`, poolLiquidity);
318
+
319
+ if (!newAaveGsm.hasConstantPriceLargeAmounts) {
320
+ checkPoolsLiquidity(
321
+ poolLiquidity,
322
+ Tokens[network][srcTokenSymbol].address,
323
+ dexKey,
324
+ );
325
+ }
326
+ });
327
+ });
328
+
329
+ describe('Mainnet GSM_USDC: USDC -> GHO', () => {
330
+ const network = Network.MAINNET;
331
+ const dexHelper = new DummyDexHelper(network);
332
+
333
+ const tokens = Tokens[network];
334
+
335
+ // Don't forget to update relevant tokens in constant-e2e.ts
336
+ const srcTokenSymbol = 'USDC';
337
+ const destTokenSymbol = 'GHO';
338
+
339
+ const amountsForSell = [
340
+ 0n,
341
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
342
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
343
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
344
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
345
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
346
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
347
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
348
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
349
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
350
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
351
+ ];
352
+
353
+ const amountsForBuy = [
354
+ 0n,
355
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
356
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
357
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
358
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
359
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
360
+ 6n * BI_POWS[tokens[destTokenSymbol].decimals],
361
+ 7n * BI_POWS[tokens[destTokenSymbol].decimals],
362
+ 8n * BI_POWS[tokens[destTokenSymbol].decimals],
363
+ 9n * BI_POWS[tokens[destTokenSymbol].decimals],
364
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
365
+ ];
366
+
367
+ beforeAll(async () => {
368
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
369
+ aaveGsm = new AaveGsm(network, dexKey, dexHelper);
370
+ if (aaveGsm.initializePricing) {
371
+ await aaveGsm.initializePricing(blockNumber);
372
+ }
373
+ });
374
+
375
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
376
+ await testPricingOnNetwork(
377
+ aaveGsm,
378
+ network,
379
+ dexKey,
380
+ blockNumber,
381
+ srcTokenSymbol,
382
+ destTokenSymbol,
383
+ SwapSide.SELL,
384
+ amountsForSell,
385
+ 'getGhoAmountForSellAsset',
386
+ );
387
+ });
388
+
389
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
390
+ await testPricingOnNetwork(
391
+ aaveGsm,
392
+ network,
393
+ dexKey,
394
+ blockNumber,
395
+ srcTokenSymbol,
396
+ destTokenSymbol,
397
+ SwapSide.BUY,
398
+ amountsForBuy,
399
+ 'getAssetAmountForSellAsset',
400
+ );
401
+ });
402
+
403
+ it('getTopPoolsForToken', async function () {
404
+ // We have to check without calling initializePricing, because
405
+ // pool-tracker is not calling that function
406
+ const newAaveGsm = new AaveGsm(network, dexKey, dexHelper);
407
+ if (newAaveGsm.updatePoolState) {
408
+ await newAaveGsm.updatePoolState();
409
+ }
410
+ const poolLiquidity = await newAaveGsm.getTopPoolsForToken(
411
+ tokens[srcTokenSymbol].address,
412
+ 10,
413
+ );
414
+ console.log(`${srcTokenSymbol} Top Pools:`, poolLiquidity);
415
+
416
+ if (!newAaveGsm.hasConstantPriceLargeAmounts) {
417
+ checkPoolsLiquidity(
418
+ poolLiquidity,
419
+ Tokens[network][srcTokenSymbol].address,
420
+ dexKey,
421
+ );
422
+ }
423
+ });
424
+ });
425
+
426
+ describe('Mainnet GSM_USDC: GHO -> USDC', () => {
427
+ const network = Network.MAINNET;
428
+ const dexHelper = new DummyDexHelper(network);
429
+
430
+ const tokens = Tokens[network];
431
+
432
+ // Don't forget to update relevant tokens in constant-e2e.ts
433
+ const srcTokenSymbol = 'GHO';
434
+ const destTokenSymbol = 'USDC';
435
+
436
+ const amountsForSell = [
437
+ 0n,
438
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
439
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
440
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
441
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
442
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
443
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
444
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
445
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
446
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
447
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
448
+ ];
449
+
450
+ const amountsForBuy = [
451
+ 0n,
452
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
453
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
454
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
455
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
456
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
457
+ 6n * BI_POWS[tokens[destTokenSymbol].decimals],
458
+ 7n * BI_POWS[tokens[destTokenSymbol].decimals],
459
+ 8n * BI_POWS[tokens[destTokenSymbol].decimals],
460
+ 9n * BI_POWS[tokens[destTokenSymbol].decimals],
461
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
462
+ ];
463
+
464
+ beforeAll(async () => {
465
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
466
+ aaveGsm = new AaveGsm(network, dexKey, dexHelper);
467
+ if (aaveGsm.initializePricing) {
468
+ await aaveGsm.initializePricing(blockNumber);
469
+ }
470
+ });
471
+
472
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
473
+ await testPricingOnNetwork(
474
+ aaveGsm,
475
+ network,
476
+ dexKey,
477
+ blockNumber,
478
+ srcTokenSymbol,
479
+ destTokenSymbol,
480
+ SwapSide.SELL,
481
+ amountsForSell,
482
+ 'getAssetAmountForBuyAsset',
483
+ );
484
+ });
485
+
486
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
487
+ await testPricingOnNetwork(
488
+ aaveGsm,
489
+ network,
490
+ dexKey,
491
+ blockNumber,
492
+ srcTokenSymbol,
493
+ destTokenSymbol,
494
+ SwapSide.BUY,
495
+ amountsForBuy,
496
+ 'getGhoAmountForBuyAsset',
497
+ );
498
+ });
499
+
500
+ it('getTopPoolsForToken', async function () {
501
+ // We have to check without calling initializePricing, because
502
+ // pool-tracker is not calling that function
503
+ const newAaveGsm = new AaveGsm(network, dexKey, dexHelper);
504
+ if (newAaveGsm.updatePoolState) {
505
+ await newAaveGsm.updatePoolState();
506
+ }
507
+ const poolLiquidity = await newAaveGsm.getTopPoolsForToken(
508
+ tokens[srcTokenSymbol].address,
509
+ 10,
510
+ );
511
+ console.log(`${srcTokenSymbol} Top Pools:`, poolLiquidity);
512
+
513
+ if (!newAaveGsm.hasConstantPriceLargeAmounts) {
514
+ checkPoolsLiquidity(
515
+ poolLiquidity,
516
+ Tokens[network][srcTokenSymbol].address,
517
+ dexKey,
518
+ );
519
+ }
520
+ });
521
+ });
522
+ });