@paraswap/dex-lib 3.8.30 → 3.8.31
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/AaveV1_lending_pool.json +27 -0
- package/build/abi/Aave_GSM.json +751 -0
- package/build/abi/aave-gsm/Aave_GSM.json +751 -0
- package/build/abi/aave-gsm/IFeeStrategy.json +78 -0
- package/build/abi/inception/inception-ineth-pool.json +1062 -0
- package/build/abi/inception/inception-ineth.json +609 -0
- package/build/abi/inception/inception-ratio-feed.json +93 -0
- package/build/abi/inception/inception-vault.json +991 -0
- package/build/abi/platypus/asset.json +490 -0
- package/build/abi/platypus/avax-pool.json +820 -0
- package/build/abi/platypus/oracle.json +119 -0
- package/build/abi/platypus/pool.json +677 -0
- package/build/abi/smardex/all/smardex-router.json +648 -0
- package/build/abi/smardex/layer-1/smardex-factory.json +242 -0
- package/build/abi/smardex/layer-1/smardex-pool.json +506 -0
- package/build/abi/smardex/layer-2/smardex-factory.json +185 -0
- package/build/abi/smardex/layer-2/smardex-pool.json +578 -0
- package/build/abi/stkGHO.json +1131 -0
- package/build/abi/swaap-v1/pool.json +1346 -0
- package/build/abi/usual-bond/usd0pp.abi.json +867 -0
- package/build/dex/aave-gsm/aave-gsm-pool.d.ts +28 -0
- package/build/dex/aave-gsm/aave-gsm-pool.js +117 -0
- package/build/dex/aave-gsm/aave-gsm-pool.js.map +1 -0
- package/build/dex/aave-gsm/aave-gsm.d.ts +43 -0
- package/build/dex/aave-gsm/aave-gsm.js +306 -0
- package/build/dex/aave-gsm/aave-gsm.js.map +1 -0
- package/build/dex/aave-gsm/config.d.ts +3 -0
- package/build/dex/aave-gsm/config.js +17 -0
- package/build/dex/aave-gsm/config.js.map +1 -0
- package/build/dex/aave-gsm/types.d.ts +18 -0
- package/build/dex/aave-gsm/types.js +3 -0
- package/build/dex/aave-gsm/types.js.map +1 -0
- package/build/dex/aave-v1/aave-v1.d.ts +34 -0
- package/build/dex/aave-v1/aave-v1.js +180 -0
- package/build/dex/aave-v1/aave-v1.js.map +1 -0
- package/build/dex/aave-v1/config.d.ts +11 -0
- package/build/dex/aave-v1/config.js +20 -0
- package/build/dex/aave-v1/config.js.map +1 -0
- package/build/dex/aave-v1/tokens-mainnet.json +134 -0
- package/build/dex/aave-v1/tokens.d.ts +3 -0
- package/build/dex/aave-v1/tokens.js +50 -0
- package/build/dex/aave-v1/tokens.js.map +1 -0
- package/build/dex/aave-v1/types.d.ts +12 -0
- package/build/dex/aave-v1/types.js +3 -0
- package/build/dex/aave-v1/types.js.map +1 -0
- package/build/dex/idle-dao/idle-dao-pool.d.ts +56 -0
- package/build/dex/idle-dao/idle-dao-pool.js +176 -0
- package/build/dex/idle-dao/idle-dao-pool.js.map +1 -0
- package/build/dex/idle-dao/idle-dao-pooling-pool.d.ts +16 -0
- package/build/dex/idle-dao/idle-dao-pooling-pool.js +57 -0
- package/build/dex/idle-dao/idle-dao-pooling-pool.js.map +1 -0
- package/build/dex/idle-dao/scripts.d.ts +9 -0
- package/build/dex/idle-dao/scripts.js +552 -0
- package/build/dex/idle-dao/scripts.js.map +1 -0
- package/build/dex/inception/config.d.ts +5 -0
- package/build/dex/inception/config.js +112 -0
- package/build/dex/inception/config.js.map +1 -0
- package/build/dex/inception/inception-event-pool.d.ts +25 -0
- package/build/dex/inception/inception-event-pool.js +57 -0
- package/build/dex/inception/inception-event-pool.js.map +1 -0
- package/build/dex/inception/inception-native.d.ts +43 -0
- package/build/dex/inception/inception-native.js +131 -0
- package/build/dex/inception/inception-native.js.map +1 -0
- package/build/dex/inception/inception-pool.d.ts +18 -0
- package/build/dex/inception/inception-pool.js +32 -0
- package/build/dex/inception/inception-pool.js.map +1 -0
- package/build/dex/inception/inception-price-feed.d.ts +19 -0
- package/build/dex/inception/inception-price-feed.js +51 -0
- package/build/dex/inception/inception-price-feed.js.map +1 -0
- package/build/dex/inception/inception.d.ts +44 -0
- package/build/dex/inception/inception.js +177 -0
- package/build/dex/inception/inception.js.map +1 -0
- package/build/dex/inception/tokens.d.ts +9 -0
- package/build/dex/inception/tokens.js +28 -0
- package/build/dex/inception/tokens.js.map +1 -0
- package/build/dex/inception/types.d.ts +22 -0
- package/build/dex/inception/types.js +3 -0
- package/build/dex/inception/types.js.map +1 -0
- package/build/dex/inception/utils.d.ts +7 -0
- package/build/dex/inception/utils.js +58 -0
- package/build/dex/inception/utils.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/platypus/asset.d.ts +14 -0
- package/build/dex/platypus/asset.js +97 -0
- package/build/dex/platypus/asset.js.map +1 -0
- package/build/dex/platypus/config.d.ts +11 -0
- package/build/dex/platypus/config.js +69 -0
- package/build/dex/platypus/config.js.map +1 -0
- package/build/dex/platypus/platypus.d.ts +63 -0
- package/build/dex/platypus/platypus.js +473 -0
- package/build/dex/platypus/platypus.js.map +1 -0
- package/build/dex/platypus/pool-avax.d.ts +8 -0
- package/build/dex/platypus/pool-avax.js +54 -0
- package/build/dex/platypus/pool-avax.js.map +1 -0
- package/build/dex/platypus/pool-base.d.ts +19 -0
- package/build/dex/platypus/pool-base.js +86 -0
- package/build/dex/platypus/pool-base.js.map +1 -0
- package/build/dex/platypus/pool-pure.d.ts +8 -0
- package/build/dex/platypus/pool-pure.js +37 -0
- package/build/dex/platypus/pool-pure.js.map +1 -0
- package/build/dex/platypus/pool-subscriber.d.ts +14 -0
- package/build/dex/platypus/pool-subscriber.js +167 -0
- package/build/dex/platypus/pool-subscriber.js.map +1 -0
- package/build/dex/platypus/pool.d.ts +8 -0
- package/build/dex/platypus/pool.js +58 -0
- package/build/dex/platypus/pool.js.map +1 -0
- package/build/dex/platypus/types.d.ts +92 -0
- package/build/dex/platypus/types.js +10 -0
- package/build/dex/platypus/types.js.map +1 -0
- package/build/dex/quickswap/spiritswap-v3.d.ts +6 -0
- package/build/dex/quickswap/spiritswap-v3.js +19 -0
- package/build/dex/quickswap/spiritswap-v3.js.map +1 -0
- package/build/dex/smardex/config.d.ts +4 -0
- package/build/dex/smardex/config.js +64 -0
- package/build/dex/smardex/config.js.map +1 -0
- package/build/dex/smardex/constants.d.ts +18 -0
- package/build/dex/smardex/constants.js +33 -0
- package/build/dex/smardex/constants.js.map +1 -0
- package/build/dex/smardex/sdk/constants.d.ts +6 -0
- package/build/dex/smardex/sdk/constants.js +13 -0
- package/build/dex/smardex/sdk/constants.js.map +1 -0
- package/build/dex/smardex/sdk/core.d.ts +113 -0
- package/build/dex/smardex/sdk/core.js +499 -0
- package/build/dex/smardex/sdk/core.js.map +1 -0
- package/build/dex/smardex/sdk/errors.d.ts +15 -0
- package/build/dex/smardex/sdk/errors.js +22 -0
- package/build/dex/smardex/sdk/errors.js.map +1 -0
- package/build/dex/smardex/sdk/types.d.ts +62 -0
- package/build/dex/smardex/sdk/types.js +3 -0
- package/build/dex/smardex/sdk/types.js.map +1 -0
- package/build/dex/smardex/sdk/utils.d.ts +44 -0
- package/build/dex/smardex/sdk/utils.js +133 -0
- package/build/dex/smardex/sdk/utils.js.map +1 -0
- package/build/dex/smardex/smardex-event-pool.d.ts +28 -0
- package/build/dex/smardex/smardex-event-pool.js +119 -0
- package/build/dex/smardex/smardex-event-pool.js.map +1 -0
- package/build/dex/smardex/smardex.d.ts +65 -0
- package/build/dex/smardex/smardex.js +519 -0
- package/build/dex/smardex/smardex.js.map +1 -0
- package/build/dex/smardex/types.d.ts +55 -0
- package/build/dex/smardex/types.js +3 -0
- package/build/dex/smardex/types.js.map +1 -0
- package/build/dex/solidly/forks-override/cone.d.ts +22 -0
- package/build/dex/solidly/forks-override/cone.js +53 -0
- package/build/dex/solidly/forks-override/cone.js.map +1 -0
- package/build/dex/solidly/forks-override/solisnek.d.ts +8 -0
- package/build/dex/solidly/forks-override/solisnek.js +15 -0
- package/build/dex/solidly/forks-override/solisnek.js.map +1 -0
- package/build/dex/stkgho/config.d.ts +3 -0
- package/build/dex/stkgho/config.js +14 -0
- package/build/dex/stkgho/config.js.map +1 -0
- package/build/dex/stkgho/stkgho-pool.d.ts +41 -0
- package/build/dex/stkgho/stkgho-pool.js +81 -0
- package/build/dex/stkgho/stkgho-pool.js.map +1 -0
- package/build/dex/stkgho/stkgho.d.ts +41 -0
- package/build/dex/stkgho/stkgho.js +159 -0
- package/build/dex/stkgho/stkgho.js.map +1 -0
- package/build/dex/stkgho/types.d.ts +11 -0
- package/build/dex/stkgho/types.js +3 -0
- package/build/dex/stkgho/types.js.map +1 -0
- package/build/dex/swaap-v1/config.d.ts +17 -0
- package/build/dex/swaap-v1/config.js +56 -0
- package/build/dex/swaap-v1/config.js.map +1 -0
- package/build/dex/swaap-v1/constants.d.ts +6 -0
- package/build/dex/swaap-v1/constants.js +17 -0
- package/build/dex/swaap-v1/constants.js.map +1 -0
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.d.ts +25 -0
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.js +62 -0
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.js.map +1 -0
- package/build/dex/swaap-v1/libraries/Const.d.ts +18 -0
- package/build/dex/swaap-v1/libraries/Const.js +26 -0
- package/build/dex/swaap-v1/libraries/Const.js.map +1 -0
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.d.ts +77 -0
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js +316 -0
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js.map +1 -0
- package/build/dex/swaap-v1/libraries/LogExpMath.d.ts +75 -0
- package/build/dex/swaap-v1/libraries/LogExpMath.js +418 -0
- package/build/dex/swaap-v1/libraries/LogExpMath.js.map +1 -0
- package/build/dex/swaap-v1/libraries/MathMMM.d.ts +185 -0
- package/build/dex/swaap-v1/libraries/MathMMM.js +453 -0
- package/build/dex/swaap-v1/libraries/MathMMM.js.map +1 -0
- package/build/dex/swaap-v1/libraries/Num.d.ts +31 -0
- package/build/dex/swaap-v1/libraries/Num.js +167 -0
- package/build/dex/swaap-v1/libraries/Num.js.map +1 -0
- package/build/dex/swaap-v1/libraries/PoolQuotations.d.ts +23 -0
- package/build/dex/swaap-v1/libraries/PoolQuotations.js +131 -0
- package/build/dex/swaap-v1/libraries/PoolQuotations.js.map +1 -0
- package/build/dex/swaap-v1/libraries/Struct.d.ts +56 -0
- package/build/dex/swaap-v1/libraries/Struct.js +3 -0
- package/build/dex/swaap-v1/libraries/Struct.js.map +1 -0
- package/build/dex/swaap-v1/swaap-v1-pool.d.ts +45 -0
- package/build/dex/swaap-v1/swaap-v1-pool.js +656 -0
- package/build/dex/swaap-v1/swaap-v1-pool.js.map +1 -0
- package/build/dex/swaap-v1/swaap-v1.d.ts +62 -0
- package/build/dex/swaap-v1/swaap-v1.js +379 -0
- package/build/dex/swaap-v1/swaap-v1.js.map +1 -0
- package/build/dex/swaap-v1/types.d.ts +106 -0
- package/build/dex/swaap-v1/types.js +9 -0
- package/build/dex/swaap-v1/types.js.map +1 -0
- package/build/dex/usual-bond/config.d.ts +3 -0
- package/build/dex/usual-bond/config.js +13 -0
- package/build/dex/usual-bond/config.js.map +1 -0
- package/build/dex/usual-bond/types.d.ts +7 -0
- package/build/dex/usual-bond/types.js +3 -0
- package/build/dex/usual-bond/types.js.map +1 -0
- package/build/dex/usual-bond/usual-bond.d.ts +35 -0
- package/build/dex/usual-bond/usual-bond.js +162 -0
- package/build/dex/usual-bond/usual-bond.js.map +1 -0
- package/build/dex/zerox/index.d.ts +1 -1
- package/build/dex/zerox/index.js.map +1 -1
- package/package.json +2 -3
- package/src/abi/aave-gsm/Aave_GSM.json +751 -0
- package/src/abi/aave-gsm/IFeeStrategy.json +78 -0
- package/src/dex/aave-gsm/aave-gsm-e2e.test.ts +109 -0
- package/src/dex/aave-gsm/aave-gsm-events.test.ts +79 -0
- package/src/dex/aave-gsm/aave-gsm-integration.test.ts +522 -0
- package/src/dex/aave-gsm/aave-gsm-pool.ts +178 -0
- package/src/dex/aave-gsm/aave-gsm.ts +410 -0
- package/src/dex/aave-gsm/config.ts +16 -0
- package/src/dex/aave-gsm/types.ts +23 -0
- package/src/dex/index.ts +2 -0
- package/.idea/codeStyles/Project.xml +0 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/paraswap-dex-lib.iml +0 -12
- package/.idea/vcs.xml +0 -6
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { Interface } from '@ethersproject/abi';
|
|
2
|
+
import { DeepReadonly } from 'ts-essentials';
|
|
3
|
+
import { Log, Logger } from '../../types';
|
|
4
|
+
import { catchParseLogError } from '../../utils';
|
|
5
|
+
import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
|
|
6
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
7
|
+
import { PoolState } from './types';
|
|
8
|
+
import GSM_ABI from '../../abi/aave-gsm/Aave_GSM.json';
|
|
9
|
+
import FEE_STRATEGY_ABI from '../../abi/aave-gsm/IFeeStrategy.json';
|
|
10
|
+
import {
|
|
11
|
+
addressDecode,
|
|
12
|
+
booleanDecode,
|
|
13
|
+
uint256ToBigInt,
|
|
14
|
+
} from '../../lib/decoders';
|
|
15
|
+
|
|
16
|
+
export class AaveGsmEventPool extends StatefulEventSubscriber<PoolState> {
|
|
17
|
+
handlers: {
|
|
18
|
+
[event: string]: (
|
|
19
|
+
event: any,
|
|
20
|
+
state: DeepReadonly<PoolState>,
|
|
21
|
+
log: Readonly<Log>,
|
|
22
|
+
) => Promise<DeepReadonly<PoolState> | null>;
|
|
23
|
+
} = {};
|
|
24
|
+
|
|
25
|
+
logDecoder: (log: Log) => any;
|
|
26
|
+
|
|
27
|
+
addressesSubscribed: string[];
|
|
28
|
+
|
|
29
|
+
constructor(
|
|
30
|
+
readonly gsm: string,
|
|
31
|
+
readonly parentName: string,
|
|
32
|
+
protected network: number,
|
|
33
|
+
protected dexHelper: IDexHelper,
|
|
34
|
+
logger: Logger,
|
|
35
|
+
protected aaveGsmIface = new Interface(GSM_ABI),
|
|
36
|
+
protected feeStrategyIface = new Interface(FEE_STRATEGY_ABI),
|
|
37
|
+
protected PERCENT_FACTOR = 10_000n,
|
|
38
|
+
) {
|
|
39
|
+
super(parentName, `${parentName}_${gsm}`, dexHelper, logger);
|
|
40
|
+
|
|
41
|
+
this.logDecoder = (log: Log) => this.aaveGsmIface.parseLog(log);
|
|
42
|
+
this.addressesSubscribed = [gsm];
|
|
43
|
+
|
|
44
|
+
// Add handlers
|
|
45
|
+
this.handlers['FeeStrategyUpdated'] =
|
|
46
|
+
this.handleFeeStrategyUpdated.bind(this);
|
|
47
|
+
|
|
48
|
+
this.handlers['SwapFreeze'] = this.handleSwapFreeze.bind(this);
|
|
49
|
+
this.handlers['Seized'] = this.handleSeized.bind(this);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
getIdentifier(): string {
|
|
53
|
+
return `${this.parentName}_${this.gsm}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected async processLog(
|
|
57
|
+
state: DeepReadonly<PoolState>,
|
|
58
|
+
log: Readonly<Log>,
|
|
59
|
+
): Promise<DeepReadonly<PoolState> | null> {
|
|
60
|
+
try {
|
|
61
|
+
const event = this.logDecoder(log);
|
|
62
|
+
if (event.name in this.handlers) {
|
|
63
|
+
return await this.handlers[event.name](event, state, log);
|
|
64
|
+
}
|
|
65
|
+
} catch (e) {
|
|
66
|
+
catchParseLogError(e, this.logger);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async getOnChainState(
|
|
73
|
+
address: string,
|
|
74
|
+
blockNumber: number | string = 'latest',
|
|
75
|
+
): Promise<PoolState> {
|
|
76
|
+
const callData = [
|
|
77
|
+
{
|
|
78
|
+
target: address,
|
|
79
|
+
callData: this.feeStrategyIface.encodeFunctionData('getBuyFee', [
|
|
80
|
+
this.PERCENT_FACTOR,
|
|
81
|
+
]),
|
|
82
|
+
decodeFunction: uint256ToBigInt,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
target: address,
|
|
86
|
+
callData: this.feeStrategyIface.encodeFunctionData('getSellFee', [
|
|
87
|
+
this.PERCENT_FACTOR,
|
|
88
|
+
]),
|
|
89
|
+
decodeFunction: uint256ToBigInt,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
target: this.gsm,
|
|
93
|
+
callData: this.aaveGsmIface.encodeFunctionData(
|
|
94
|
+
'getAvailableLiquidity',
|
|
95
|
+
[],
|
|
96
|
+
),
|
|
97
|
+
decodeFunction: uint256ToBigInt,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
target: this.gsm,
|
|
101
|
+
callData: this.aaveGsmIface.encodeFunctionData('getIsFrozen', []),
|
|
102
|
+
decodeFunction: booleanDecode,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
target: this.gsm,
|
|
106
|
+
callData: this.aaveGsmIface.encodeFunctionData('getIsSeized', []),
|
|
107
|
+
decodeFunction: booleanDecode,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
|
|
111
|
+
const results = await this.dexHelper.multiWrapper.tryAggregate<
|
|
112
|
+
bigint | boolean
|
|
113
|
+
>(true, callData, blockNumber);
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
buyFee: results[0].returnData as bigint,
|
|
117
|
+
sellFee: results[1].returnData as bigint,
|
|
118
|
+
underlyingLiquidity: results[2].returnData as bigint,
|
|
119
|
+
isFrozen: results[3].returnData as boolean,
|
|
120
|
+
isSeized: results[4].returnData as boolean,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async generateState(
|
|
125
|
+
blockNumber: number | string = 'latest',
|
|
126
|
+
): Promise<DeepReadonly<PoolState>> {
|
|
127
|
+
const callData = [
|
|
128
|
+
{
|
|
129
|
+
target: this.gsm,
|
|
130
|
+
callData: this.aaveGsmIface.encodeFunctionData('getFeeStrategy', []),
|
|
131
|
+
decodeFunction: addressDecode,
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
const feeStrategy = await this.dexHelper.multiWrapper.tryAggregate<string>(
|
|
136
|
+
true,
|
|
137
|
+
callData,
|
|
138
|
+
blockNumber,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const result = await this.getOnChainState(
|
|
142
|
+
feeStrategy[0].returnData,
|
|
143
|
+
blockNumber,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async handleFeeStrategyUpdated(
|
|
150
|
+
event: any,
|
|
151
|
+
state: DeepReadonly<PoolState>,
|
|
152
|
+
log: Readonly<Log>,
|
|
153
|
+
): Promise<DeepReadonly<PoolState> | null> {
|
|
154
|
+
return await this.getOnChainState(event.args.newFeeStrategy);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async handleSwapFreeze(
|
|
158
|
+
event: any,
|
|
159
|
+
state: DeepReadonly<PoolState>,
|
|
160
|
+
log: Readonly<Log>,
|
|
161
|
+
): Promise<DeepReadonly<PoolState> | null> {
|
|
162
|
+
return {
|
|
163
|
+
...state,
|
|
164
|
+
isFrozen: event.args.enabled,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async handleSeized(
|
|
169
|
+
event: any,
|
|
170
|
+
state: DeepReadonly<PoolState>,
|
|
171
|
+
log: Readonly<Log>,
|
|
172
|
+
): Promise<DeepReadonly<PoolState> | null> {
|
|
173
|
+
return {
|
|
174
|
+
...state,
|
|
175
|
+
isSeized: true,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|