@paraswap/dex-lib 2.47.4-hashflow-mm → 2.47.4

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 (145) hide show
  1. package/build/abi/balancer-v2/gyro-e.abi.json +1595 -0
  2. package/build/dex/balancer-v2/balancer-v2.d.ts +6 -3
  3. package/build/dex/balancer-v2/balancer-v2.js +55 -35
  4. package/build/dex/balancer-v2/balancer-v2.js.map +1 -1
  5. package/build/dex/balancer-v2/pools/gyro/Gyro3Pool.d.ts +32 -0
  6. package/build/dex/balancer-v2/pools/gyro/Gyro3Pool.js +149 -0
  7. package/build/dex/balancer-v2/pools/gyro/Gyro3Pool.js.map +1 -0
  8. package/build/dex/balancer-v2/pools/gyro/GyroEPool.d.ts +37 -0
  9. package/build/dex/balancer-v2/pools/gyro/GyroEPool.js +222 -0
  10. package/build/dex/balancer-v2/pools/gyro/GyroEPool.js.map +1 -0
  11. package/build/dex/balancer-v2/pools/gyro/gyro-helpers.d.ts +2 -0
  12. package/build/dex/balancer-v2/pools/gyro/gyro-helpers.js +19 -0
  13. package/build/dex/balancer-v2/pools/gyro/gyro-helpers.js.map +1 -0
  14. package/build/dex/balancer-v2/queryOnChain.d.ts +1 -0
  15. package/build/dex/balancer-v2/queryOnChain.js +40 -0
  16. package/build/dex/balancer-v2/queryOnChain.js.map +1 -0
  17. package/build/dex/balancer-v2/types.d.ts +24 -1
  18. package/build/dex/balancer-v2/types.js +2 -0
  19. package/build/dex/balancer-v2/types.js.map +1 -1
  20. package/build/dex/balancer-v2/utils.d.ts +8 -0
  21. package/build/dex/balancer-v2/utils.js +17 -1
  22. package/build/dex/balancer-v2/utils.js.map +1 -1
  23. package/build/dex/hashflow/constants.js +1 -1
  24. package/build/dex/hashflow/constants.js.map +1 -1
  25. package/build/dex/hashflow/hashflow.js +0 -1
  26. package/build/dex/hashflow/hashflow.js.map +1 -1
  27. package/package.json +2 -1
  28. package/src/abi/balancer-v2/gyro-e.abi.json +1595 -0
  29. package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +94 -0
  30. package/src/dex/balancer-v2/balancer-v2-gyro3.test.ts +268 -0
  31. package/src/dex/balancer-v2/balancer-v2-gyroE.test.ts +401 -0
  32. package/src/dex/balancer-v2/balancer-v2-integration.test.ts +253 -112
  33. package/src/dex/balancer-v2/balancer-v2.ts +105 -69
  34. package/src/dex/balancer-v2/pools/gyro/Gyro3Pool.ts +255 -0
  35. package/src/dex/balancer-v2/pools/gyro/GyroEPool.ts +403 -0
  36. package/src/dex/balancer-v2/pools/gyro/gyro-helpers.ts +15 -0
  37. package/src/dex/balancer-v2/queryOnChain.ts +48 -0
  38. package/src/dex/balancer-v2/types.ts +26 -0
  39. package/src/dex/balancer-v2/utils.ts +16 -0
  40. package/src/dex/hashflow/constants.ts +1 -1
  41. package/src/dex/hashflow/hashflow.ts +1 -4
  42. package/src/dex/synthetix/synthetix-state.ts +2 -2
  43. package/tests/constants-e2e.ts +26 -0
  44. package/build/abi/Redstone.json +0 -739
  45. package/build/abi/angle/stagToken.json +0 -963
  46. package/build/abi/angle-transmuter/Pyth.json +0 -1534
  47. package/build/abi/angle-transmuter/Transmuter.json +0 -1719
  48. package/build/abi/smardex/smardex-factory.json +0 -185
  49. package/build/abi/smardex/smardex-pool.json +0 -578
  50. package/build/abi/smardex/smardex-router.json +0 -648
  51. package/build/abi/trader-joe-v2_1/FactoryABI.json +0 -1208
  52. package/build/abi/trader-joe-v2_1/PairABI.json +0 -1493
  53. package/build/abi/trader-joe-v2_1/RouterABI.json +0 -1489
  54. package/build/abi/trader-joe-v2_1/StateMulticall.json +0 -193
  55. package/build/abi/wombat/pool.json +0 -1289
  56. package/build/dex/angle-staked-stable/angle-staked-stable-pool.d.ts +0 -53
  57. package/build/dex/angle-staked-stable/angle-staked-stable-pool.js +0 -175
  58. package/build/dex/angle-staked-stable/angle-staked-stable-pool.js.map +0 -1
  59. package/build/dex/angle-staked-stable/angle-staked-stable.d.ts +0 -42
  60. package/build/dex/angle-staked-stable/angle-staked-stable.js +0 -232
  61. package/build/dex/angle-staked-stable/angle-staked-stable.js.map +0 -1
  62. package/build/dex/angle-staked-stable/config.d.ts +0 -4
  63. package/build/dex/angle-staked-stable/config.js +0 -26
  64. package/build/dex/angle-staked-stable/config.js.map +0 -1
  65. package/build/dex/angle-staked-stable/types.d.ts +0 -15
  66. package/build/dex/angle-staked-stable/types.js +0 -3
  67. package/build/dex/angle-staked-stable/types.js.map +0 -1
  68. package/build/dex/angle-transmuter/angle-transmuter-pool.d.ts +0 -43
  69. package/build/dex/angle-transmuter/angle-transmuter-pool.js +0 -309
  70. package/build/dex/angle-transmuter/angle-transmuter-pool.js.map +0 -1
  71. package/build/dex/angle-transmuter/angle-transmuter.d.ts +0 -46
  72. package/build/dex/angle-transmuter/angle-transmuter.js +0 -233
  73. package/build/dex/angle-transmuter/angle-transmuter.js.map +0 -1
  74. package/build/dex/angle-transmuter/backedOracle.d.ts +0 -19
  75. package/build/dex/angle-transmuter/backedOracle.js +0 -56
  76. package/build/dex/angle-transmuter/backedOracle.js.map +0 -1
  77. package/build/dex/angle-transmuter/config.d.ts +0 -4
  78. package/build/dex/angle-transmuter/config.js +0 -20
  79. package/build/dex/angle-transmuter/config.js.map +0 -1
  80. package/build/dex/angle-transmuter/constants.d.ts +0 -4
  81. package/build/dex/angle-transmuter/constants.js +0 -8
  82. package/build/dex/angle-transmuter/constants.js.map +0 -1
  83. package/build/dex/angle-transmuter/pyth.d.ts +0 -19
  84. package/build/dex/angle-transmuter/pyth.js +0 -71
  85. package/build/dex/angle-transmuter/pyth.js.map +0 -1
  86. package/build/dex/angle-transmuter/redstone.d.ts +0 -20
  87. package/build/dex/angle-transmuter/redstone.js +0 -73
  88. package/build/dex/angle-transmuter/redstone.js.map +0 -1
  89. package/build/dex/angle-transmuter/transmuter.d.ts +0 -50
  90. package/build/dex/angle-transmuter/transmuter.js +0 -314
  91. package/build/dex/angle-transmuter/transmuter.js.map +0 -1
  92. package/build/dex/angle-transmuter/types.d.ts +0 -144
  93. package/build/dex/angle-transmuter/types.js +0 -31
  94. package/build/dex/angle-transmuter/types.js.map +0 -1
  95. package/build/dex/angle-transmuter/utils.d.ts +0 -9
  96. package/build/dex/angle-transmuter/utils.js +0 -264
  97. package/build/dex/angle-transmuter/utils.js.map +0 -1
  98. package/build/dex/smardex/subgraph-queries.d.ts +0 -1
  99. package/build/dex/smardex/subgraph-queries.js +0 -17
  100. package/build/dex/smardex/subgraph-queries.js.map +0 -1
  101. package/build/dex/smardex/usd-reserves.d.ts +0 -23
  102. package/build/dex/smardex/usd-reserves.js +0 -86
  103. package/build/dex/smardex/usd-reserves.js.map +0 -1
  104. package/build/dex/trader-joe-v2-1-2/config.d.ts +0 -4
  105. package/build/dex/trader-joe-v2-1-2/config.js +0 -47
  106. package/build/dex/trader-joe-v2-1-2/config.js.map +0 -1
  107. package/build/dex/trader-joe-v2-1-2/constants.d.ts +0 -20
  108. package/build/dex/trader-joe-v2-1-2/constants.js +0 -22
  109. package/build/dex/trader-joe-v2-1-2/constants.js.map +0 -1
  110. package/build/dex/trader-joe-v2-1-2/math/index.d.ts +0 -37
  111. package/build/dex/trader-joe-v2-1-2/math/index.js +0 -291
  112. package/build/dex/trader-joe-v2-1-2/math/index.js.map +0 -1
  113. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.d.ts +0 -60
  114. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js +0 -248
  115. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js.map +0 -1
  116. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.d.ts +0 -53
  117. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js +0 -307
  118. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js.map +0 -1
  119. package/build/dex/trader-joe-v2-1-2/types.d.ts +0 -82
  120. package/build/dex/trader-joe-v2-1-2/types.js +0 -9
  121. package/build/dex/trader-joe-v2-1-2/types.js.map +0 -1
  122. package/build/dex/trader-joe-v2_1/config.d.ts +0 -4
  123. package/build/dex/trader-joe-v2_1/config.js +0 -47
  124. package/build/dex/trader-joe-v2_1/config.js.map +0 -1
  125. package/build/dex/trader-joe-v2_1/constants.d.ts +0 -20
  126. package/build/dex/trader-joe-v2_1/constants.js +0 -22
  127. package/build/dex/trader-joe-v2_1/constants.js.map +0 -1
  128. package/build/dex/trader-joe-v2_1/math/index.d.ts +0 -37
  129. package/build/dex/trader-joe-v2_1/math/index.js +0 -291
  130. package/build/dex/trader-joe-v2_1/math/index.js.map +0 -1
  131. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.d.ts +0 -0
  132. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js +0 -384
  133. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js.map +0 -1
  134. package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.d.ts +0 -60
  135. package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.js +0 -247
  136. package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.js.map +0 -1
  137. package/build/dex/trader-joe-v2_1/trader-joe-v2_1.d.ts +0 -53
  138. package/build/dex/trader-joe-v2_1/trader-joe-v2_1.js +0 -307
  139. package/build/dex/trader-joe-v2_1/trader-joe-v2_1.js.map +0 -1
  140. package/build/dex/trader-joe-v2_1/types.d.ts +0 -82
  141. package/build/dex/trader-joe-v2_1/types.js +0 -9
  142. package/build/dex/trader-joe-v2_1/types.js.map +0 -1
  143. package/build/dex/wombat/wombat-pool-poller.d.ts +0 -22
  144. package/build/dex/wombat/wombat-pool-poller.js +0 -164
  145. package/build/dex/wombat/wombat-pool-poller.js.map +0 -1
@@ -469,6 +469,70 @@ describe('BalancerV2 E2E', () => {
469
469
  );
470
470
  });
471
471
 
472
+ describe('GyroE pool', () => {
473
+ const sideToContractMethods = new Map([
474
+ [
475
+ SwapSide.SELL,
476
+ [
477
+ ContractMethod.simpleSwap,
478
+ // ContractMethod.multiSwap,
479
+ // ContractMethod.megaSwap,
480
+ ],
481
+ ],
482
+ // [
483
+ // SwapSide.BUY,
484
+ // [
485
+ // ContractMethod.simpleBuy,
486
+ // ContractMethod.buy
487
+ // ],
488
+ // ],
489
+ ]);
490
+
491
+ const pairs: { name: string; amount: string }[][] = [
492
+ [
493
+ { name: 'GYD', amount: '10000000000000000000' },
494
+ { name: 'sDAI', amount: '10000000000000000000' },
495
+ ],
496
+ ];
497
+
498
+ sideToContractMethods.forEach((contractMethods, side) =>
499
+ describe(`${side}`, () => {
500
+ contractMethods.forEach((contractMethod: ContractMethod) => {
501
+ pairs.forEach(pair => {
502
+ describe(`${contractMethod}`, () => {
503
+ it(`${pair[0].name} -> ${pair[1].name}`, async () => {
504
+ await testE2E(
505
+ tokens[pair[0].name],
506
+ tokens[pair[1].name],
507
+ holders[pair[0].name],
508
+ pair[0].amount,
509
+ side,
510
+ dexKey,
511
+ contractMethod,
512
+ network,
513
+ provider,
514
+ );
515
+ });
516
+ it(`${pair[1].name} -> ${pair[0].name}`, async () => {
517
+ await testE2E(
518
+ tokens[pair[1].name],
519
+ tokens[pair[0].name],
520
+ holders[pair[1].name],
521
+ pair[1].amount,
522
+ side,
523
+ dexKey,
524
+ contractMethod,
525
+ network,
526
+ provider,
527
+ );
528
+ });
529
+ });
530
+ });
531
+ });
532
+ }),
533
+ );
534
+ });
535
+
472
536
  //daniel: BPT swaps are currently not supported, we've refactored to focus on mainToken paths
473
537
  /*it('MAIN TOKEN -> BPT, LinearPool', async () => {
474
538
  // Linear Pools allow swaps between main token (i.e. USDT) and pools BPT
@@ -721,6 +785,36 @@ describe('BalancerV2 E2E', () => {
721
785
  });
722
786
  }),
723
787
  );
788
+
789
+ it('USDC -> USDT through Gyro3', async () => {
790
+ await testE2E(
791
+ tokens['USDC'],
792
+ tokens['USDT'],
793
+ holders['USDC'],
794
+ '10000000', // 10 * 1e6
795
+ SwapSide.SELL,
796
+ dexKey,
797
+ ContractMethod.multiSwap,
798
+ network,
799
+ provider,
800
+ [`${dexKey}_0x17f1ef81707811ea15d9ee7c741179bbe2a63887`],
801
+ );
802
+ });
803
+
804
+ it('USDC -> USDT through Gyro3 (BUY)', async () => {
805
+ await testE2E(
806
+ tokens['USDC'],
807
+ tokens['USDT'],
808
+ holders['USDC'],
809
+ '10000000', // 10 * 1e6
810
+ SwapSide.BUY,
811
+ dexKey,
812
+ ContractMethod.multiSwap,
813
+ network,
814
+ provider,
815
+ [`${dexKey}_0x17f1ef81707811ea15d9ee7c741179bbe2a63887`],
816
+ );
817
+ });
724
818
  });
725
819
 
726
820
  describe('BalancerV2 ARBITRUM', () => {
@@ -0,0 +1,268 @@
1
+ // npx jest src/dex/balancer-v2/balancer-v2-gyro3.test.ts
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { Interface } from '@ethersproject/abi';
6
+ import { BigNumber } from '@ethersproject/bignumber';
7
+
8
+ import { Tokens } from '../../../tests/constants-e2e';
9
+ import { DummyDexHelper } from '../../dex-helper/index';
10
+ import { Network, SwapSide } from '../../constants';
11
+ import { BalancerV2EventPool } from './balancer-v2';
12
+ import { BalancerConfig } from './config';
13
+ import { PoolState, SubgraphPoolBase } from './types';
14
+ import { Gyro3Pool, Gyro3PoolPairData } from './pools/gyro/Gyro3Pool';
15
+ import { queryOnChain } from './queryOnChain';
16
+
17
+ import VaultABI from '../../abi/balancer-v2/vault.json';
18
+
19
+ const rpcUrl = process.env.HTTP_PROVIDER_137 as string;
20
+
21
+ describe('BalancerV2', () => {
22
+ const dexKey = 'BalancerV2';
23
+ const network = Network.POLYGON;
24
+ const config = BalancerConfig[dexKey][network];
25
+ const vaultInterface = new Interface(VaultABI);
26
+ const gyro3Pool = new Gyro3Pool(config.vaultAddress, vaultInterface);
27
+ const tokens = Tokens[network];
28
+
29
+ const dexHelper = new DummyDexHelper(network);
30
+ const logger = dexHelper.getLogger(dexKey);
31
+ const balancerPools = new BalancerV2EventPool(
32
+ dexKey,
33
+ network,
34
+ config.vaultAddress,
35
+ config.subgraphURL,
36
+ dexHelper,
37
+ logger,
38
+ );
39
+
40
+ describe('Gyro3 Pool', () => {
41
+ describe('Pool Fetching', () => {
42
+ let Gyro3PoolSg: SubgraphPoolBase;
43
+ let Gyro3PoolState: PoolState;
44
+
45
+ it('should be supported pool type', async function () {
46
+ expect(balancerPools.isSupportedPool('Gyro3')).toBe(true);
47
+ });
48
+
49
+ it('should fetch Gyro3 Pool with correct fields from Subgraph', async function () {
50
+ const pools = await balancerPools.fetchAllSubgraphPools();
51
+ // USDC/BUSD/USDT
52
+ const Gyro3PoolId =
53
+ '0x17f1ef81707811ea15d9ee7c741179bbe2a63887000100000000000000000799';
54
+ const Gyro3 = pools.filter(p => p.id === Gyro3PoolId);
55
+ expect(Gyro3.length).toBe(1);
56
+ Gyro3PoolSg = Gyro3[0];
57
+ expect(Gyro3PoolSg.tokens.length).toBe(3);
58
+ const root3Alpha = parseFloat(Gyro3PoolSg.root3Alpha);
59
+ expect(root3Alpha > 0).toBe(true);
60
+ Gyro3PoolSg = { ...Gyro3PoolSg };
61
+ Gyro3PoolSg.root3Alpha = '0.9995';
62
+ });
63
+
64
+ it('getOnChainState', async function () {
65
+ const blocknumber = 40038397;
66
+ const state = await balancerPools.getOnChainState(
67
+ [Gyro3PoolSg],
68
+ blocknumber,
69
+ );
70
+ Gyro3PoolState = state[Gyro3PoolSg.address];
71
+ expect(Gyro3PoolState.swapFee).toBe(BigInt('300000000000000'));
72
+ expect(Gyro3PoolState.tokens[tokens.USDC.address].balance).toBe(
73
+ BigInt('25755475662'),
74
+ );
75
+ expect(
76
+ Gyro3PoolState.tokens[tokens.BUSD.address.toLowerCase()].balance,
77
+ ).toBe(BigInt('41279070738726640173873'));
78
+ expect(
79
+ Gyro3PoolState.tokens[tokens.USDT.address.toLowerCase()].balance,
80
+ ).toBe(BigInt('25601127342'));
81
+ });
82
+
83
+ it('parsePoolPairData', async function () {
84
+ const tokenIn = tokens.BUSD.address;
85
+ const tokenOut = tokens.USDT.address;
86
+ const pairData = gyro3Pool.parsePoolPairData(
87
+ Gyro3PoolSg,
88
+ Gyro3PoolState,
89
+ tokenIn,
90
+ tokenOut,
91
+ );
92
+ expect(pairData.indexIn).toBe(1);
93
+ expect(pairData.indexOut).toBe(2);
94
+ expect(pairData.swapFee).toBe(BigInt('300000000000000'));
95
+ expect(pairData.balanceTertiary.toString()).toBe(
96
+ '25755475662000000000000',
97
+ );
98
+ expect(pairData.decimalsTertiary.toString()).toBe('6');
99
+ expect(pairData.balances).toStrictEqual([
100
+ BigNumber.from('25755475662000000000000'),
101
+ BigNumber.from('41279070738726640173873'),
102
+ BigNumber.from('25601127342000000000000'),
103
+ ]);
104
+ expect(pairData.root3Alpha.toString()).toBe('999500000000000000');
105
+ });
106
+ });
107
+
108
+ describe('Swap Functions', () => {
109
+ describe('Swap Functions - 6decimals>18decimals', () => {
110
+ const pairData: Gyro3PoolPairData = {
111
+ balances: [
112
+ BigNumber.from('25755475662000000000000'),
113
+ BigNumber.from('41279070738726640173873'),
114
+ BigNumber.from('25601127342000000000000'),
115
+ ],
116
+ indexIn: 0,
117
+ indexOut: 1,
118
+ swapFee: BigInt('300000000000000'),
119
+ scalingFactors: [
120
+ BigInt('1000000000000000000000000000000'),
121
+ BigInt('1000000000000000000'),
122
+ BigInt('1000000000000000000000000000000'),
123
+ ],
124
+ balanceTertiary: BigNumber.from('25601127342000000000000'),
125
+ decimalsTertiary: 6,
126
+ root3Alpha: BigNumber.from('999500000000000000'),
127
+ };
128
+
129
+ it('getSwapMaxAmount (SELL)', async () => {
130
+ const swapMaxAmount = gyro3Pool.getSwapMaxAmount(
131
+ pairData,
132
+ SwapSide.SELL,
133
+ );
134
+ expect(swapMaxAmount).toBe(BigInt('41279029459'));
135
+ });
136
+
137
+ it('swap', async function () {
138
+ const amountIn = BigInt('13500000');
139
+ const amountOut = gyro3Pool.onSell([amountIn], pairData);
140
+ expect(amountOut.length).toBe(1);
141
+ expect(amountOut[0].toString()).toBe('13499339792532290017');
142
+ });
143
+
144
+ it('buy', async function () {
145
+ const amountOut = BigInt('13500000');
146
+ const amountIn = gyro3Pool.onBuy([amountOut], pairData);
147
+ expect(amountIn.length).toBe(1);
148
+ });
149
+ });
150
+
151
+ describe('Swap Functions - 18decimals>6decimals', () => {
152
+ const pairData: Gyro3PoolPairData = {
153
+ balances: [
154
+ BigNumber.from('25755475662000000000000'),
155
+ BigNumber.from('41279070738726640173873'),
156
+ BigNumber.from('25601127342000000000000'),
157
+ ],
158
+ indexIn: 1,
159
+ indexOut: 2,
160
+ swapFee: BigInt('300000000000000'),
161
+ scalingFactors: [
162
+ BigInt('1000000000000000000000000000000'),
163
+ BigInt('1000000000000000000'),
164
+ BigInt('1000000000000000000000000000000'),
165
+ ],
166
+ balanceTertiary: BigNumber.from('25601127342000000000000'),
167
+ decimalsTertiary: 6,
168
+ root3Alpha: BigNumber.from('999500000000000000'),
169
+ };
170
+
171
+ it('getSwapMaxAmount', async () => {
172
+ const swapMaxAmount = gyro3Pool.getSwapMaxAmount(
173
+ pairData,
174
+ SwapSide.SELL,
175
+ );
176
+ expect(swapMaxAmount).toBe(BigInt('25601101740872658000000'));
177
+ });
178
+
179
+ it('swap', async function () {
180
+ const amountIn = BigInt('13500000000000000000');
181
+ const amountOut = gyro3Pool.onSell([amountIn], pairData);
182
+ expect(amountOut.length).toBe(1);
183
+ expect(amountOut[0].toString()).toBe('13492521');
184
+ });
185
+ });
186
+ });
187
+
188
+ describe('Onchain Compare', () => {
189
+ it('_exactTokenInForTokenOut', async function () {
190
+ const blocknumber = 55433090;
191
+ // usdc/busd/usdt
192
+ const poolId =
193
+ '0x17f1ef81707811ea15d9ee7c741179bbe2a63887000100000000000000000799';
194
+ const tokenIn = tokens.USDC.address;
195
+ const tokenOut = tokens.BUSD.address;
196
+ const amountIn = BigInt('1000400');
197
+
198
+ const pools = await balancerPools.fetchAllSubgraphPools();
199
+ const poolSg = pools.filter(p => p.id === poolId)[0];
200
+ const state = await balancerPools.getOnChainState(
201
+ [poolSg],
202
+ blocknumber,
203
+ );
204
+ const poolState = state[poolSg.address];
205
+
206
+ const pairData = gyro3Pool.parsePoolPairData(
207
+ poolSg,
208
+ poolState,
209
+ tokenIn,
210
+ tokenOut,
211
+ );
212
+ const amountOut = gyro3Pool.onSell([amountIn], pairData);
213
+ const deltas = await queryOnChain(
214
+ rpcUrl,
215
+ blocknumber,
216
+ poolId,
217
+ 0,
218
+ tokenIn,
219
+ tokenOut,
220
+ amountIn,
221
+ );
222
+ expect(amountIn).toEqual(deltas[0]);
223
+ expect(amountOut[0] + deltas[1]).toEqual(0n);
224
+ });
225
+
226
+ it('_exactTokenOutForTokenIn', async function () {
227
+ const blocknumber = 54571344;
228
+ const poolId =
229
+ '0x17f1ef81707811ea15d9ee7c741179bbe2a63887000100000000000000000799';
230
+
231
+ const tokenIn = tokens.USDT.address;
232
+ const tokenOut = tokens.USDC.address;
233
+
234
+ const amountOut = BigInt('11000000');
235
+
236
+ const pools = await balancerPools.fetchAllSubgraphPools();
237
+ const poolSg = pools.filter(p => p.id === poolId)[0];
238
+ const state = await balancerPools.getOnChainState(
239
+ [poolSg],
240
+ blocknumber,
241
+ );
242
+ const poolState = state[poolSg.address];
243
+
244
+ const pairData = gyro3Pool.parsePoolPairData(
245
+ poolSg,
246
+ poolState,
247
+ tokenIn,
248
+ tokenOut,
249
+ );
250
+
251
+ const amountIn = gyro3Pool.onBuy([amountOut], pairData);
252
+
253
+ const deltas = await queryOnChain(
254
+ rpcUrl,
255
+ blocknumber,
256
+ poolId,
257
+ 1,
258
+ tokenIn,
259
+ tokenOut,
260
+ amountOut,
261
+ );
262
+
263
+ expect(amountIn[0]).toEqual(deltas[0]); // amountIn should equal deltas[0]
264
+ expect(deltas[1] + amountOut).toEqual(0n); // deltas[1] (consumed) + amountOut should equal 0
265
+ });
266
+ });
267
+ });
268
+ });