@paraswap/dex-lib 2.47.3 → 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.
- package/build/abi/balancer-v2/gyro-e.abi.json +1595 -0
- package/build/dex/balancer-v2/balancer-v2.d.ts +6 -3
- package/build/dex/balancer-v2/balancer-v2.js +55 -35
- package/build/dex/balancer-v2/balancer-v2.js.map +1 -1
- package/build/dex/balancer-v2/pools/gyro/Gyro3Pool.d.ts +32 -0
- package/build/dex/balancer-v2/pools/gyro/Gyro3Pool.js +149 -0
- package/build/dex/balancer-v2/pools/gyro/Gyro3Pool.js.map +1 -0
- package/build/dex/balancer-v2/pools/gyro/GyroEPool.d.ts +37 -0
- package/build/dex/balancer-v2/pools/gyro/GyroEPool.js +222 -0
- package/build/dex/balancer-v2/pools/gyro/GyroEPool.js.map +1 -0
- package/build/dex/balancer-v2/pools/gyro/gyro-helpers.d.ts +2 -0
- package/build/dex/balancer-v2/pools/gyro/gyro-helpers.js +19 -0
- package/build/dex/balancer-v2/pools/gyro/gyro-helpers.js.map +1 -0
- package/build/dex/balancer-v2/queryOnChain.d.ts +1 -0
- package/build/dex/balancer-v2/queryOnChain.js +40 -0
- package/build/dex/balancer-v2/queryOnChain.js.map +1 -0
- package/build/dex/balancer-v2/types.d.ts +24 -1
- package/build/dex/balancer-v2/types.js +2 -0
- package/build/dex/balancer-v2/types.js.map +1 -1
- package/build/dex/balancer-v2/utils.d.ts +8 -0
- package/build/dex/balancer-v2/utils.js +17 -1
- package/build/dex/balancer-v2/utils.js.map +1 -1
- package/package.json +2 -1
- package/src/abi/balancer-v2/gyro-e.abi.json +1595 -0
- package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +94 -0
- package/src/dex/balancer-v2/balancer-v2-gyro3.test.ts +268 -0
- package/src/dex/balancer-v2/balancer-v2-gyroE.test.ts +401 -0
- package/src/dex/balancer-v2/balancer-v2-integration.test.ts +253 -112
- package/src/dex/balancer-v2/balancer-v2.ts +105 -69
- package/src/dex/balancer-v2/pools/gyro/Gyro3Pool.ts +255 -0
- package/src/dex/balancer-v2/pools/gyro/GyroEPool.ts +403 -0
- package/src/dex/balancer-v2/pools/gyro/gyro-helpers.ts +15 -0
- package/src/dex/balancer-v2/queryOnChain.ts +48 -0
- package/src/dex/balancer-v2/types.ts +26 -0
- package/src/dex/balancer-v2/utils.ts +16 -0
- package/src/dex/synthetix/synthetix-state.ts +2 -2
- package/tests/constants-e2e.ts +26 -0
- package/build/abi/Redstone.json +0 -739
- package/build/abi/angle/stagToken.json +0 -963
- package/build/abi/angle-transmuter/Pyth.json +0 -1534
- package/build/abi/angle-transmuter/Transmuter.json +0 -1719
- package/build/abi/smardex/smardex-factory.json +0 -185
- package/build/abi/smardex/smardex-pool.json +0 -578
- package/build/abi/smardex/smardex-router.json +0 -648
- package/build/abi/trader-joe-v2_1/FactoryABI.json +0 -1208
- package/build/abi/trader-joe-v2_1/PairABI.json +0 -1493
- package/build/abi/trader-joe-v2_1/RouterABI.json +0 -1489
- package/build/abi/trader-joe-v2_1/StateMulticall.json +0 -193
- package/build/abi/wombat/pool.json +0 -1289
- package/build/dex/angle-staked-stable/angle-staked-stable-pool.d.ts +0 -53
- package/build/dex/angle-staked-stable/angle-staked-stable-pool.js +0 -175
- package/build/dex/angle-staked-stable/angle-staked-stable-pool.js.map +0 -1
- package/build/dex/angle-staked-stable/angle-staked-stable.d.ts +0 -42
- package/build/dex/angle-staked-stable/angle-staked-stable.js +0 -232
- package/build/dex/angle-staked-stable/angle-staked-stable.js.map +0 -1
- package/build/dex/angle-staked-stable/config.d.ts +0 -4
- package/build/dex/angle-staked-stable/config.js +0 -26
- package/build/dex/angle-staked-stable/config.js.map +0 -1
- package/build/dex/angle-staked-stable/types.d.ts +0 -15
- package/build/dex/angle-staked-stable/types.js +0 -3
- package/build/dex/angle-staked-stable/types.js.map +0 -1
- package/build/dex/angle-transmuter/angle-transmuter-pool.d.ts +0 -43
- package/build/dex/angle-transmuter/angle-transmuter-pool.js +0 -309
- package/build/dex/angle-transmuter/angle-transmuter-pool.js.map +0 -1
- package/build/dex/angle-transmuter/angle-transmuter.d.ts +0 -46
- package/build/dex/angle-transmuter/angle-transmuter.js +0 -233
- package/build/dex/angle-transmuter/angle-transmuter.js.map +0 -1
- package/build/dex/angle-transmuter/backedOracle.d.ts +0 -19
- package/build/dex/angle-transmuter/backedOracle.js +0 -56
- package/build/dex/angle-transmuter/backedOracle.js.map +0 -1
- package/build/dex/angle-transmuter/config.d.ts +0 -4
- package/build/dex/angle-transmuter/config.js +0 -20
- package/build/dex/angle-transmuter/config.js.map +0 -1
- package/build/dex/angle-transmuter/constants.d.ts +0 -4
- package/build/dex/angle-transmuter/constants.js +0 -8
- package/build/dex/angle-transmuter/constants.js.map +0 -1
- package/build/dex/angle-transmuter/pyth.d.ts +0 -19
- package/build/dex/angle-transmuter/pyth.js +0 -71
- package/build/dex/angle-transmuter/pyth.js.map +0 -1
- package/build/dex/angle-transmuter/redstone.d.ts +0 -20
- package/build/dex/angle-transmuter/redstone.js +0 -73
- package/build/dex/angle-transmuter/redstone.js.map +0 -1
- package/build/dex/angle-transmuter/transmuter.d.ts +0 -50
- package/build/dex/angle-transmuter/transmuter.js +0 -314
- package/build/dex/angle-transmuter/transmuter.js.map +0 -1
- package/build/dex/angle-transmuter/types.d.ts +0 -144
- package/build/dex/angle-transmuter/types.js +0 -31
- package/build/dex/angle-transmuter/types.js.map +0 -1
- package/build/dex/angle-transmuter/utils.d.ts +0 -9
- package/build/dex/angle-transmuter/utils.js +0 -264
- package/build/dex/angle-transmuter/utils.js.map +0 -1
- package/build/dex/smardex/subgraph-queries.d.ts +0 -1
- package/build/dex/smardex/subgraph-queries.js +0 -17
- package/build/dex/smardex/subgraph-queries.js.map +0 -1
- package/build/dex/smardex/usd-reserves.d.ts +0 -23
- package/build/dex/smardex/usd-reserves.js +0 -86
- package/build/dex/smardex/usd-reserves.js.map +0 -1
- package/build/dex/trader-joe-v2-1-2/config.d.ts +0 -4
- package/build/dex/trader-joe-v2-1-2/config.js +0 -47
- package/build/dex/trader-joe-v2-1-2/config.js.map +0 -1
- package/build/dex/trader-joe-v2-1-2/constants.d.ts +0 -20
- package/build/dex/trader-joe-v2-1-2/constants.js +0 -22
- package/build/dex/trader-joe-v2-1-2/constants.js.map +0 -1
- package/build/dex/trader-joe-v2-1-2/math/index.d.ts +0 -37
- package/build/dex/trader-joe-v2-1-2/math/index.js +0 -291
- package/build/dex/trader-joe-v2-1-2/math/index.js.map +0 -1
- package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.d.ts +0 -60
- package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js +0 -248
- package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js.map +0 -1
- package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.d.ts +0 -53
- package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js +0 -307
- package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js.map +0 -1
- package/build/dex/trader-joe-v2-1-2/types.d.ts +0 -82
- package/build/dex/trader-joe-v2-1-2/types.js +0 -9
- package/build/dex/trader-joe-v2-1-2/types.js.map +0 -1
- package/build/dex/trader-joe-v2_1/config.d.ts +0 -4
- package/build/dex/trader-joe-v2_1/config.js +0 -47
- package/build/dex/trader-joe-v2_1/config.js.map +0 -1
- package/build/dex/trader-joe-v2_1/constants.d.ts +0 -20
- package/build/dex/trader-joe-v2_1/constants.js +0 -22
- package/build/dex/trader-joe-v2_1/constants.js.map +0 -1
- package/build/dex/trader-joe-v2_1/math/index.d.ts +0 -37
- package/build/dex/trader-joe-v2_1/math/index.js +0 -291
- package/build/dex/trader-joe-v2_1/math/index.js.map +0 -1
- package/build/dex/trader-joe-v2_1/trader-joe-v2.1.d.ts +0 -0
- package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js +0 -384
- package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js.map +0 -1
- package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.d.ts +0 -60
- package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.js +0 -247
- package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.js.map +0 -1
- package/build/dex/trader-joe-v2_1/trader-joe-v2_1.d.ts +0 -53
- package/build/dex/trader-joe-v2_1/trader-joe-v2_1.js +0 -307
- package/build/dex/trader-joe-v2_1/trader-joe-v2_1.js.map +0 -1
- package/build/dex/trader-joe-v2_1/types.d.ts +0 -82
- package/build/dex/trader-joe-v2_1/types.js +0 -9
- package/build/dex/trader-joe-v2_1/types.js.map +0 -1
- package/build/dex/wombat/wombat-pool-poller.d.ts +0 -22
- package/build/dex/wombat/wombat-pool-poller.js +0 -164
- package/build/dex/wombat/wombat-pool-poller.js.map +0 -1
|
@@ -5,15 +5,15 @@ import {
|
|
|
5
5
|
AdapterExchangeParam,
|
|
6
6
|
Address,
|
|
7
7
|
ExchangePrices,
|
|
8
|
+
ExchangeTxInfo,
|
|
8
9
|
Log,
|
|
9
10
|
Logger,
|
|
10
|
-
TxInfo,
|
|
11
|
-
PreprocessTransactionOptions,
|
|
12
|
-
ExchangeTxInfo,
|
|
13
11
|
PoolLiquidity,
|
|
14
12
|
PoolPrices,
|
|
13
|
+
PreprocessTransactionOptions,
|
|
15
14
|
SimpleExchangeParam,
|
|
16
15
|
Token,
|
|
16
|
+
TxInfo,
|
|
17
17
|
} from '../../types';
|
|
18
18
|
import {
|
|
19
19
|
ETHER_ADDRESS,
|
|
@@ -29,12 +29,14 @@ import { StablePool } from './pools/stable/StablePool';
|
|
|
29
29
|
import { WeightedPool } from './pools/weighted/WeightedPool';
|
|
30
30
|
import { PhantomStablePool } from './pools/phantom-stable/PhantomStablePool';
|
|
31
31
|
import { LinearPool } from './pools/linear/LinearPool';
|
|
32
|
+
import { Gyro3Pool } from './pools/gyro/Gyro3Pool';
|
|
33
|
+
import { GyroEPool } from './pools/gyro/GyroEPool';
|
|
32
34
|
import VaultABI from '../../abi/balancer-v2/vault.json';
|
|
33
35
|
import DirectSwapABI from '../../abi/DirectSwap.json';
|
|
34
36
|
import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
|
|
35
37
|
import {
|
|
36
|
-
getDexKeysWithNetwork,
|
|
37
38
|
getBigIntPow,
|
|
39
|
+
getDexKeysWithNetwork,
|
|
38
40
|
uuidToBytes16,
|
|
39
41
|
} from '../../utils';
|
|
40
42
|
import { IDex } from '../../dex/idex';
|
|
@@ -44,12 +46,12 @@ import {
|
|
|
44
46
|
BalancerPoolTypes,
|
|
45
47
|
BalancerSwap,
|
|
46
48
|
BalancerV2Data,
|
|
49
|
+
BalancerV2DirectParam,
|
|
47
50
|
OptimizedBalancerV2Data,
|
|
48
51
|
PoolState,
|
|
49
52
|
PoolStateCache,
|
|
50
53
|
PoolStateMap,
|
|
51
54
|
SubgraphPoolAddressDictionary,
|
|
52
|
-
BalancerV2DirectParam,
|
|
53
55
|
SubgraphPoolBase,
|
|
54
56
|
SwapTypes,
|
|
55
57
|
} from './types';
|
|
@@ -57,7 +59,7 @@ import {
|
|
|
57
59
|
getLocalDeadlineAsFriendlyPlaceholder,
|
|
58
60
|
SimpleExchange,
|
|
59
61
|
} from '../simple-exchange';
|
|
60
|
-
import {
|
|
62
|
+
import { Adapters, BalancerConfig } from './config';
|
|
61
63
|
import {
|
|
62
64
|
getAllPoolsUsedInPaths,
|
|
63
65
|
isSameAddress,
|
|
@@ -91,6 +93,8 @@ const enabledPoolTypes = [
|
|
|
91
93
|
BalancerPoolTypes.SiloLinear,
|
|
92
94
|
BalancerPoolTypes.TetuLinear,
|
|
93
95
|
BalancerPoolTypes.YearnLinear,
|
|
96
|
+
BalancerPoolTypes.GyroE,
|
|
97
|
+
BalancerPoolTypes.Gyro3,
|
|
94
98
|
];
|
|
95
99
|
|
|
96
100
|
const disabledPoolIds = [
|
|
@@ -186,12 +190,15 @@ const fetchAllPools = `query ($count: Int) {
|
|
|
186
190
|
id
|
|
187
191
|
address
|
|
188
192
|
poolType
|
|
193
|
+
poolTypeVersion
|
|
189
194
|
tokens (orderBy: index) {
|
|
190
195
|
address
|
|
191
196
|
decimals
|
|
192
197
|
}
|
|
193
198
|
mainIndex
|
|
194
199
|
wrappedIndex
|
|
200
|
+
|
|
201
|
+
root3Alpha
|
|
195
202
|
}
|
|
196
203
|
}`;
|
|
197
204
|
// skipping low liquidity composableStablePool (0xbd482ffb3e6e50dc1c437557c3bea2b68f3683ee0000000000000000000003c6) with oracle issues. Experimental.
|
|
@@ -224,12 +231,23 @@ export class BalancerV2EventPool extends StatefulEventSubscriber<PoolStateMap> {
|
|
|
224
231
|
} = {};
|
|
225
232
|
|
|
226
233
|
pools: {
|
|
227
|
-
[type: string]:
|
|
234
|
+
[type: string]:
|
|
235
|
+
| WeightedPool
|
|
236
|
+
| StablePool
|
|
237
|
+
| LinearPool
|
|
238
|
+
| PhantomStablePool
|
|
239
|
+
| Gyro3Pool
|
|
240
|
+
| GyroEPool;
|
|
228
241
|
};
|
|
229
242
|
|
|
230
243
|
public allPools: SubgraphPoolBase[] = [];
|
|
231
244
|
vaultDecoder: (log: Log) => any;
|
|
232
245
|
|
|
246
|
+
buySupportedPoolTypes: BalancerPoolTypes[] = [
|
|
247
|
+
BalancerPoolTypes.Weighted,
|
|
248
|
+
BalancerPoolTypes.GyroE,
|
|
249
|
+
];
|
|
250
|
+
|
|
233
251
|
eventSupportedPoolTypes: BalancerPoolTypes[] = [
|
|
234
252
|
BalancerPoolTypes.Stable,
|
|
235
253
|
BalancerPoolTypes.Weighted,
|
|
@@ -287,6 +305,8 @@ export class BalancerV2EventPool extends StatefulEventSubscriber<PoolStateMap> {
|
|
|
287
305
|
true,
|
|
288
306
|
);
|
|
289
307
|
const linearPool = new LinearPool(this.vaultAddress, this.vaultInterface);
|
|
308
|
+
const gyro3Pool = new Gyro3Pool(this.vaultAddress, this.vaultInterface);
|
|
309
|
+
const gyroEPool = new GyroEPool(this.vaultAddress, this.vaultInterface);
|
|
290
310
|
|
|
291
311
|
this.pools = {};
|
|
292
312
|
this.pools[BalancerPoolTypes.Weighted] = weightedPool;
|
|
@@ -308,6 +328,10 @@ export class BalancerV2EventPool extends StatefulEventSubscriber<PoolStateMap> {
|
|
|
308
328
|
this.pools[BalancerPoolTypes.BeefyLinear] = linearPool;
|
|
309
329
|
// Beets uses "Linear" generically for all linear pool types
|
|
310
330
|
this.pools[BalancerPoolTypes.Linear] = linearPool;
|
|
331
|
+
|
|
332
|
+
this.pools[BalancerPoolTypes.Gyro3] = gyro3Pool;
|
|
333
|
+
this.pools[BalancerPoolTypes.GyroE] = gyroEPool;
|
|
334
|
+
|
|
311
335
|
this.vaultDecoder = (log: Log) => this.vaultInterface.parseLog(log);
|
|
312
336
|
this.addressesSubscribed = [vaultAddress];
|
|
313
337
|
|
|
@@ -363,9 +387,6 @@ export class BalancerV2EventPool extends StatefulEventSubscriber<PoolStateMap> {
|
|
|
363
387
|
return allPools;
|
|
364
388
|
}
|
|
365
389
|
|
|
366
|
-
this.logger.info(
|
|
367
|
-
`Fetching ${this.parentName}_${this.network} Pools from subgraph`,
|
|
368
|
-
);
|
|
369
390
|
const variables = {
|
|
370
391
|
count: MAX_POOL_CNT,
|
|
371
392
|
};
|
|
@@ -401,6 +422,7 @@ export class BalancerV2EventPool extends StatefulEventSubscriber<PoolStateMap> {
|
|
|
401
422
|
this.logger.info(
|
|
402
423
|
`Got ${allPools.length} ${this.parentName}_${this.network} pools from subgraph`,
|
|
403
424
|
);
|
|
425
|
+
|
|
404
426
|
return allPools;
|
|
405
427
|
}
|
|
406
428
|
|
|
@@ -464,7 +486,7 @@ export class BalancerV2EventPool extends StatefulEventSubscriber<PoolStateMap> {
|
|
|
464
486
|
}
|
|
465
487
|
|
|
466
488
|
if (
|
|
467
|
-
subgraphPool.poolType
|
|
489
|
+
!this.buySupportedPoolTypes.includes(subgraphPool.poolType) &&
|
|
468
490
|
side === SwapSide.BUY
|
|
469
491
|
) {
|
|
470
492
|
return null;
|
|
@@ -802,6 +824,7 @@ export class BalancerV2
|
|
|
802
824
|
}
|
|
803
825
|
|
|
804
826
|
const allPools = this.getPoolsWithTokenPair(_from, _to);
|
|
827
|
+
|
|
805
828
|
const allowedPools = limitPools
|
|
806
829
|
? allPools.filter(({ address }) =>
|
|
807
830
|
limitPools.includes(`${this.dexKey}_${address.toLowerCase()}`),
|
|
@@ -853,72 +876,85 @@ export class BalancerV2
|
|
|
853
876
|
|
|
854
877
|
const poolPrices = allowedPools
|
|
855
878
|
.map((pool: SubgraphPoolBase) => {
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
);
|
|
865
|
-
|
|
866
|
-
let pathAmounts = amounts;
|
|
867
|
-
let resOut: { unit: bigint; prices: bigint[] } | null = null;
|
|
868
|
-
|
|
869
|
-
for (let i = 0; i < path.length; i++) {
|
|
870
|
-
const poolAddress = path[i].pool.address.toLowerCase();
|
|
871
|
-
const poolState = (eventPoolStates[poolAddress] ||
|
|
872
|
-
nonEventPoolStates[poolAddress]) as PoolState | undefined;
|
|
873
|
-
if (!poolState) {
|
|
874
|
-
this.logger.error(`Unable to find the poolState ${poolAddress}`);
|
|
875
|
-
return null;
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
const unitVolume = getBigIntPow(
|
|
879
|
-
(side === SwapSide.SELL ? path[i].tokenIn : path[i].tokenOut)
|
|
880
|
-
.decimals,
|
|
881
|
-
);
|
|
882
|
-
|
|
883
|
-
const res = this.eventPools.getPricesPool(
|
|
884
|
-
path[i].tokenIn,
|
|
885
|
-
path[i].tokenOut,
|
|
886
|
-
path[i].pool,
|
|
887
|
-
poolState,
|
|
888
|
-
pathAmounts,
|
|
889
|
-
unitVolume,
|
|
879
|
+
try {
|
|
880
|
+
const poolAddress = pool.address.toLowerCase();
|
|
881
|
+
|
|
882
|
+
const path = poolGetPathForTokenInOut(
|
|
883
|
+
_from.address,
|
|
884
|
+
_to.address,
|
|
885
|
+
pool,
|
|
886
|
+
this.poolAddressMap,
|
|
890
887
|
side,
|
|
891
888
|
);
|
|
892
889
|
|
|
893
|
-
|
|
894
|
-
|
|
890
|
+
let pathAmounts = amounts;
|
|
891
|
+
let resOut: { unit: bigint; prices: bigint[] } | null = null;
|
|
892
|
+
|
|
893
|
+
for (let i = 0; i < path.length; i++) {
|
|
894
|
+
const poolAddress = path[i].pool.address.toLowerCase();
|
|
895
|
+
const poolState = (eventPoolStates[poolAddress] ||
|
|
896
|
+
nonEventPoolStates[poolAddress]) as PoolState | undefined;
|
|
897
|
+
if (!poolState) {
|
|
898
|
+
this.logger.error(
|
|
899
|
+
`Unable to find the poolState ${poolAddress}`,
|
|
900
|
+
);
|
|
901
|
+
return null;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
const unitVolume = getBigIntPow(
|
|
905
|
+
(side === SwapSide.SELL ? path[i].tokenIn : path[i].tokenOut)
|
|
906
|
+
.decimals,
|
|
907
|
+
);
|
|
908
|
+
|
|
909
|
+
const res = this.eventPools.getPricesPool(
|
|
910
|
+
path[i].tokenIn,
|
|
911
|
+
path[i].tokenOut,
|
|
912
|
+
path[i].pool,
|
|
913
|
+
poolState,
|
|
914
|
+
pathAmounts,
|
|
915
|
+
unitVolume,
|
|
916
|
+
side,
|
|
917
|
+
);
|
|
918
|
+
|
|
919
|
+
if (!res) {
|
|
920
|
+
return null;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
pathAmounts = res.prices;
|
|
924
|
+
|
|
925
|
+
if (i === path.length - 1) {
|
|
926
|
+
resOut = res;
|
|
927
|
+
}
|
|
895
928
|
}
|
|
896
929
|
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
if (i === path.length - 1) {
|
|
900
|
-
resOut = res;
|
|
930
|
+
if (!resOut) {
|
|
931
|
+
return null;
|
|
901
932
|
}
|
|
902
|
-
}
|
|
903
933
|
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
934
|
+
return {
|
|
935
|
+
unit: resOut.unit,
|
|
936
|
+
prices: resOut.prices,
|
|
937
|
+
data: {
|
|
938
|
+
poolId: pool.id,
|
|
939
|
+
},
|
|
940
|
+
poolAddresses: [poolAddress],
|
|
941
|
+
exchange: this.dexKey,
|
|
942
|
+
gasCost:
|
|
943
|
+
STABLE_GAS_COST + VARIABLE_GAS_COST_PER_CYCLE * path.length,
|
|
944
|
+
poolIdentifier: `${this.dexKey}_${poolAddress}`,
|
|
945
|
+
};
|
|
946
|
+
|
|
947
|
+
// TODO: re-check what should be the current block time stamp
|
|
948
|
+
} catch (e) {
|
|
949
|
+
this.logger.warn(
|
|
950
|
+
`Error_getPrices ${from.symbol || from.address}, ${
|
|
951
|
+
to.symbol || to.address
|
|
952
|
+
}, ${side}, ${pool.address}:`,
|
|
953
|
+
e,
|
|
954
|
+
);
|
|
907
955
|
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
prices: resOut.prices,
|
|
911
|
-
data: {
|
|
912
|
-
poolId: pool.id,
|
|
913
|
-
},
|
|
914
|
-
poolAddresses: [poolAddress],
|
|
915
|
-
exchange: this.dexKey,
|
|
916
|
-
gasCost:
|
|
917
|
-
STABLE_GAS_COST + VARIABLE_GAS_COST_PER_CYCLE * path.length,
|
|
918
|
-
poolIdentifier: `${this.dexKey}_${poolAddress}`,
|
|
919
|
-
};
|
|
920
|
-
|
|
921
|
-
// TODO: re-check what should be the current block time stamp
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
922
958
|
})
|
|
923
959
|
.filter(p => !!p);
|
|
924
960
|
return poolPrices as ExchangePrices<BalancerV2Data>;
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { Interface } from '@ethersproject/abi';
|
|
2
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
3
|
+
|
|
4
|
+
import { BasePool } from '../balancer-v2-pool';
|
|
5
|
+
import { SwapSide } from '../../../../constants';
|
|
6
|
+
import {
|
|
7
|
+
decodeThrowError,
|
|
8
|
+
getTokenScalingFactor,
|
|
9
|
+
safeParseFixed,
|
|
10
|
+
} from '../../utils';
|
|
11
|
+
import { callData, SubgraphPoolBase, PoolState, TokenState } from '../../types';
|
|
12
|
+
import { MathSol } from '../../balancer-v2-math';
|
|
13
|
+
import { Gyro3Maths } from '@balancer-labs/sor';
|
|
14
|
+
import { _addFee, _reduceFee } from './gyro-helpers';
|
|
15
|
+
|
|
16
|
+
// Swap Limit factor
|
|
17
|
+
const SWAP_LIMIT_FACTOR = BigInt('999999000000000000');
|
|
18
|
+
|
|
19
|
+
// All values should be normalised to 18 decimals. e.g. 1USDC = 1e18 not 1e6
|
|
20
|
+
export type Gyro3PoolPairData = {
|
|
21
|
+
balances: BigNumber[];
|
|
22
|
+
indexIn: number;
|
|
23
|
+
indexOut: number;
|
|
24
|
+
swapFee: bigint;
|
|
25
|
+
balanceTertiary: BigNumber; // Balance of the unchanged asset
|
|
26
|
+
decimalsTertiary: number; // Decimals of the unchanged asset
|
|
27
|
+
scalingFactors: bigint[];
|
|
28
|
+
root3Alpha: BigNumber;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export class Gyro3Pool extends BasePool {
|
|
32
|
+
vaultAddress: string;
|
|
33
|
+
vaultInterface: Interface;
|
|
34
|
+
poolInterface = new Interface([
|
|
35
|
+
'function getSwapFeePercentage() view returns (uint256)',
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
constructor(vaultAddress: string, vaultInterface: Interface) {
|
|
39
|
+
super();
|
|
40
|
+
this.vaultAddress = vaultAddress;
|
|
41
|
+
this.vaultInterface = vaultInterface;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
parsePoolPairData(
|
|
45
|
+
pool: SubgraphPoolBase,
|
|
46
|
+
poolState: PoolState,
|
|
47
|
+
tokenIn: string,
|
|
48
|
+
tokenOut: string,
|
|
49
|
+
): Gyro3PoolPairData {
|
|
50
|
+
// All values should be normalised to 18 decimals. e.g. 1USDC = 1e18 not 1e6
|
|
51
|
+
let indexIn = 0,
|
|
52
|
+
indexOut = 0,
|
|
53
|
+
indexTertiary = 0;
|
|
54
|
+
const scalingFactors: bigint[] = [];
|
|
55
|
+
const balances = pool.tokens.map((t, i) => {
|
|
56
|
+
if (t.address.toLowerCase() === tokenIn.toLowerCase()) {
|
|
57
|
+
indexIn = i;
|
|
58
|
+
} else if (t.address.toLowerCase() === tokenOut.toLowerCase()) {
|
|
59
|
+
indexOut = i;
|
|
60
|
+
} else {
|
|
61
|
+
indexTertiary = i;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const scalingFactor = getTokenScalingFactor(t.decimals);
|
|
65
|
+
scalingFactors.push(scalingFactor);
|
|
66
|
+
|
|
67
|
+
return BigNumber.from(
|
|
68
|
+
this._upscale(
|
|
69
|
+
BigInt(poolState.tokens[t.address.toLowerCase()].balance),
|
|
70
|
+
scalingFactor,
|
|
71
|
+
),
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const balanceTertiary = balances[indexTertiary];
|
|
76
|
+
const decimalsTertiary = pool.tokens[indexTertiary].decimals;
|
|
77
|
+
|
|
78
|
+
const poolPairData: Gyro3PoolPairData = {
|
|
79
|
+
balances,
|
|
80
|
+
indexIn,
|
|
81
|
+
indexOut,
|
|
82
|
+
scalingFactors,
|
|
83
|
+
swapFee: poolState.swapFee,
|
|
84
|
+
balanceTertiary,
|
|
85
|
+
decimalsTertiary,
|
|
86
|
+
root3Alpha: safeParseFixed(pool.root3Alpha, 18),
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
return poolPairData;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getSwapMaxAmount(poolPairData: Gyro3PoolPairData, side: SwapSide): bigint {
|
|
93
|
+
if (side === SwapSide.SELL) {
|
|
94
|
+
// Approximation - similar to traditional stable pools
|
|
95
|
+
return this._downscaleDown(
|
|
96
|
+
MathSol.mulDownFixed(
|
|
97
|
+
poolPairData.balances[poolPairData.indexOut].toBigInt(),
|
|
98
|
+
SWAP_LIMIT_FACTOR,
|
|
99
|
+
),
|
|
100
|
+
poolPairData.scalingFactors[poolPairData.indexIn],
|
|
101
|
+
);
|
|
102
|
+
} else {
|
|
103
|
+
return this._downscaleDown(
|
|
104
|
+
MathSol.mulDownFixed(
|
|
105
|
+
poolPairData.balances[poolPairData.indexIn].toBigInt(),
|
|
106
|
+
SWAP_LIMIT_FACTOR,
|
|
107
|
+
),
|
|
108
|
+
poolPairData.scalingFactors[poolPairData.indexOut],
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
Helper function to construct onchain multicall data for Pool.
|
|
115
|
+
*/
|
|
116
|
+
getOnChainCalls(pool: SubgraphPoolBase): callData[] {
|
|
117
|
+
const poolCallData: callData[] = [
|
|
118
|
+
{
|
|
119
|
+
target: this.vaultAddress,
|
|
120
|
+
callData: this.vaultInterface.encodeFunctionData('getPoolTokens', [
|
|
121
|
+
pool.id,
|
|
122
|
+
]),
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
target: pool.address,
|
|
126
|
+
callData: this.poolInterface.encodeFunctionData('getSwapFeePercentage'),
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
return poolCallData;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
Helper function to decode multicall data for Pool.
|
|
134
|
+
data must contain returnData
|
|
135
|
+
startIndex is where to start in returnData. Allows this decode function to be called along with other pool types.
|
|
136
|
+
*/
|
|
137
|
+
decodeOnChainCalls(
|
|
138
|
+
pool: SubgraphPoolBase,
|
|
139
|
+
data: { success: boolean; returnData: any }[],
|
|
140
|
+
startIndex: number,
|
|
141
|
+
): [{ [address: string]: PoolState }, number] {
|
|
142
|
+
const pools = {} as { [address: string]: PoolState };
|
|
143
|
+
|
|
144
|
+
const poolTokens = decodeThrowError(
|
|
145
|
+
this.vaultInterface,
|
|
146
|
+
'getPoolTokens',
|
|
147
|
+
data[startIndex++],
|
|
148
|
+
pool.address,
|
|
149
|
+
);
|
|
150
|
+
const swapFee = decodeThrowError(
|
|
151
|
+
this.poolInterface,
|
|
152
|
+
'getSwapFeePercentage',
|
|
153
|
+
data[startIndex++],
|
|
154
|
+
pool.address,
|
|
155
|
+
)[0];
|
|
156
|
+
|
|
157
|
+
const poolState: PoolState = {
|
|
158
|
+
swapFee: BigInt(swapFee.toString()),
|
|
159
|
+
orderedTokens: poolTokens.tokens,
|
|
160
|
+
tokens: poolTokens.tokens.reduce(
|
|
161
|
+
(ptAcc: { [address: string]: TokenState }, pt: string, j: number) => {
|
|
162
|
+
const tokenState: TokenState = {
|
|
163
|
+
balance: BigInt(poolTokens.balances[j].toString()),
|
|
164
|
+
};
|
|
165
|
+
ptAcc[pt.toLowerCase()] = tokenState;
|
|
166
|
+
return ptAcc;
|
|
167
|
+
},
|
|
168
|
+
{},
|
|
169
|
+
),
|
|
170
|
+
};
|
|
171
|
+
pools[pool.address] = poolState;
|
|
172
|
+
return [pools, startIndex];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
onSell(amounts: bigint[], poolPairData: Gyro3PoolPairData): bigint[] {
|
|
176
|
+
try {
|
|
177
|
+
const invariant = Gyro3Maths._calculateInvariant(
|
|
178
|
+
poolPairData.balances,
|
|
179
|
+
poolPairData.root3Alpha,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
const virtualOffsetInOut = MathSol.mulDownFixed(
|
|
183
|
+
invariant.toBigInt(),
|
|
184
|
+
poolPairData.root3Alpha.toBigInt(),
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const tokenAmountsInWithFee = amounts.map(a => {
|
|
188
|
+
const withFee = _reduceFee(a, poolPairData.swapFee);
|
|
189
|
+
return this._upscale(
|
|
190
|
+
withFee,
|
|
191
|
+
poolPairData.scalingFactors[poolPairData.indexIn],
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
return tokenAmountsInWithFee.map(amount => {
|
|
196
|
+
try {
|
|
197
|
+
const amountOut = Gyro3Maths._calcOutGivenIn(
|
|
198
|
+
poolPairData.balances[poolPairData.indexIn],
|
|
199
|
+
poolPairData.balances[poolPairData.indexOut],
|
|
200
|
+
BigNumber.from(amount),
|
|
201
|
+
BigNumber.from(virtualOffsetInOut),
|
|
202
|
+
).toBigInt();
|
|
203
|
+
|
|
204
|
+
return this._downscaleDown(
|
|
205
|
+
amountOut,
|
|
206
|
+
poolPairData.scalingFactors[poolPairData.indexOut],
|
|
207
|
+
);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
return BigInt(0);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
} catch (error) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
onBuy(amounts: bigint[], poolPairData: Gyro3PoolPairData): bigint[] {
|
|
218
|
+
try {
|
|
219
|
+
const invariant = Gyro3Maths._calculateInvariant(
|
|
220
|
+
poolPairData.balances,
|
|
221
|
+
poolPairData.root3Alpha,
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
const virtualOffsetInOut = MathSol.mulDownFixed(
|
|
225
|
+
invariant.toBigInt(),
|
|
226
|
+
poolPairData.root3Alpha.toBigInt(),
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
const tokenAmountsUpscaled = amounts.map(a =>
|
|
230
|
+
this._upscale(a, poolPairData.scalingFactors[poolPairData.indexOut]),
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
return tokenAmountsUpscaled.map(amount => {
|
|
234
|
+
try {
|
|
235
|
+
const amountIn = Gyro3Maths._calcInGivenOut(
|
|
236
|
+
poolPairData.balances[poolPairData.indexIn],
|
|
237
|
+
poolPairData.balances[poolPairData.indexOut],
|
|
238
|
+
BigNumber.from(amount),
|
|
239
|
+
BigNumber.from(virtualOffsetInOut),
|
|
240
|
+
).toBigInt();
|
|
241
|
+
|
|
242
|
+
const downScaledAmount = this._downscaleUp(
|
|
243
|
+
amountIn,
|
|
244
|
+
poolPairData.scalingFactors[poolPairData.indexIn],
|
|
245
|
+
);
|
|
246
|
+
return _addFee(downScaledAmount, poolPairData.swapFee);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
return BigInt(0);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
} catch (error) {
|
|
252
|
+
return [];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|