@paraswap/dex-lib 4.1.3 → 4.1.4-bal-v3-hooks.0
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-v3/directionalFeeHook.json +684 -0
- package/build/abi/balancer-v3/stableSurgeHook.json +976 -0
- package/build/dex/balancer-v3/balancer-test-helpers.d.ts +5 -0
- package/build/dex/balancer-v3/balancer-test-helpers.js +122 -0
- package/build/dex/balancer-v3/balancer-test-helpers.js.map +1 -0
- package/build/dex/balancer-v3/balancer-v3-pool.d.ts +4 -1
- package/build/dex/balancer-v3/balancer-v3-pool.js +20 -13
- package/build/dex/balancer-v3/balancer-v3-pool.js.map +1 -1
- package/build/dex/balancer-v3/balancer-v3.d.ts +4 -0
- package/build/dex/balancer-v3/balancer-v3.js +29 -3
- package/build/dex/balancer-v3/balancer-v3.js.map +1 -1
- package/build/dex/balancer-v3/config.js +39 -0
- package/build/dex/balancer-v3/config.js.map +1 -1
- package/build/dex/balancer-v3/getOnChainState.d.ts +1 -2
- package/build/dex/balancer-v3/getOnChainState.js +0 -2
- package/build/dex/balancer-v3/getOnChainState.js.map +1 -1
- package/build/dex/balancer-v3/getPoolsApi.d.ts +2 -1
- package/build/dex/balancer-v3/getPoolsApi.js +17 -10
- package/build/dex/balancer-v3/getPoolsApi.js.map +1 -1
- package/build/dex/balancer-v3/getTopPoolsApi.d.ts +5 -1
- package/build/dex/balancer-v3/getTopPoolsApi.js +6 -3
- package/build/dex/balancer-v3/getTopPoolsApi.js.map +1 -1
- package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.d.ts +54 -0
- package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.js +153 -0
- package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.js.map +1 -0
- package/build/dex/balancer-v3/hooks/directionalFeeHook.d.ts +26 -0
- package/build/dex/balancer-v3/hooks/directionalFeeHook.js +41 -0
- package/build/dex/balancer-v3/hooks/directionalFeeHook.js.map +1 -0
- package/build/dex/balancer-v3/hooks/loadHooksConfig.d.ts +2 -0
- package/build/dex/balancer-v3/hooks/loadHooksConfig.js +11 -0
- package/build/dex/balancer-v3/hooks/loadHooksConfig.js.map +1 -0
- package/build/dex/balancer-v3/hooks/stableSurgeHook.d.ts +39 -0
- package/build/dex/balancer-v3/hooks/stableSurgeHook.js +99 -0
- package/build/dex/balancer-v3/hooks/stableSurgeHook.js.map +1 -0
- package/build/dex/balancer-v3/types.d.ts +4 -1
- package/package.json +2 -2
- package/scripts/run-dex-integration-v3.ts +4 -4
- package/src/abi/balancer-v3/directionalFeeHook.json +684 -0
- package/src/abi/balancer-v3/stableSurgeHook.json +976 -0
- package/src/dex/balancer-v3/balancer-hooks-events.test.ts +99 -0
- package/src/dex/balancer-v3/balancer-stableSurge.test.ts +110 -0
- package/src/dex/balancer-v3/balancer-test-helpers.ts +199 -0
- package/src/dex/balancer-v3/balancer-v3-e2e.test.ts +20 -0
- package/src/dex/balancer-v3/balancer-v3-integration.test.ts +2 -197
- package/src/dex/balancer-v3/balancer-v3-pool.ts +37 -13
- package/src/dex/balancer-v3/balancer-v3.ts +42 -1
- package/src/dex/balancer-v3/config.ts +39 -0
- package/src/dex/balancer-v3/getOnChainState.ts +1 -4
- package/src/dex/balancer-v3/getPoolsApi.ts +42 -23
- package/src/dex/balancer-v3/getTopPoolsApi.ts +13 -2
- package/src/dex/balancer-v3/hooks/balancer-hook-event-subscriber.ts +226 -0
- package/src/dex/balancer-v3/hooks/directionalFeeHook.ts +51 -0
- package/src/dex/balancer-v3/hooks/loadHooksConfig.ts +12 -0
- package/src/dex/balancer-v3/hooks/stableSurgeHook.ts +163 -0
- package/src/dex/balancer-v3/types.ts +4 -2
- package/tests/constants-e2e.ts +6 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StableSurge = void 0;
|
|
7
|
+
exports.getStableSurgeHookState = getStableSurgeHookState;
|
|
8
|
+
exports.thresholdSurgePercentageChangedEvent = thresholdSurgePercentageChangedEvent;
|
|
9
|
+
exports.maxSurgeFeePercentageChangedEvent = maxSurgeFeePercentageChangedEvent;
|
|
10
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
11
|
+
const ethers_1 = require("ethers");
|
|
12
|
+
const getOnChainState_1 = require("../getOnChainState");
|
|
13
|
+
exports.StableSurge = {
|
|
14
|
+
type: 'StableSurge',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Retrieve any initial hook state required.
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
async function getStableSurgeHookState(hookInterface, hookAddress, factoryAddress, dexHelper, blockNumber) {
|
|
21
|
+
// Find all pools with hook
|
|
22
|
+
const resolverContract = new ethers_1.Contract(factoryAddress, ['function getPools() external view returns (address[])'], dexHelper.provider);
|
|
23
|
+
const pools = (await resolverContract.callStatic.getPools({
|
|
24
|
+
blockTag: blockNumber,
|
|
25
|
+
}));
|
|
26
|
+
const surgeThresholdCallData = pools.flatMap(pool => {
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
target: hookAddress,
|
|
30
|
+
callData: hookInterface.encodeFunctionData('getSurgeThresholdPercentage', [pool]),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
target: hookAddress,
|
|
34
|
+
callData: hookInterface.encodeFunctionData('getMaxSurgeFeePercentage', [
|
|
35
|
+
pool,
|
|
36
|
+
]),
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
});
|
|
40
|
+
// 500 is an arbitrary number chosen based on the blockGasLimit
|
|
41
|
+
const slicedMultiCallData = lodash_1.default.chunk(surgeThresholdCallData, 500);
|
|
42
|
+
const multicallDataResult = (await Promise.all(slicedMultiCallData.map(async (_multiCallData) => dexHelper.multiContract.methods
|
|
43
|
+
.tryAggregate(false, _multiCallData)
|
|
44
|
+
.call({}, blockNumber)))).flat();
|
|
45
|
+
return mapPoolsToDecodedData(hookInterface, pools, multicallDataResult);
|
|
46
|
+
}
|
|
47
|
+
function mapPoolsToDecodedData(hookInterface, pools, data) {
|
|
48
|
+
return pools.reduce((acc, pool, index) => {
|
|
49
|
+
const dataIndex = index * 2;
|
|
50
|
+
// Ensure we have enough data
|
|
51
|
+
if (dataIndex + 1 >= data.length) {
|
|
52
|
+
throw new Error(`Insufficient data for pool ${pool}`);
|
|
53
|
+
}
|
|
54
|
+
// Decode the corresponding data pairs
|
|
55
|
+
const decodedX = (0, getOnChainState_1.decodeThrowError)(hookInterface, 'getSurgeThresholdPercentage', data[dataIndex], 'n/a');
|
|
56
|
+
const decodedY = (0, getOnChainState_1.decodeThrowError)(hookInterface, 'getMaxSurgeFeePercentage', data[dataIndex + 1], 'n/a');
|
|
57
|
+
// Add to accumulator
|
|
58
|
+
acc[pool.toLowerCase()] = {
|
|
59
|
+
surgeThresholdPercentage: decodedX[0].toBigInt(),
|
|
60
|
+
maxSurgeFeePercentage: decodedY[0].toBigInt(),
|
|
61
|
+
};
|
|
62
|
+
return acc;
|
|
63
|
+
}, {});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Handles the event emitted when threshold surge percentage changed.
|
|
67
|
+
* @param event
|
|
68
|
+
* @param state
|
|
69
|
+
* @param log
|
|
70
|
+
* @returns
|
|
71
|
+
*/
|
|
72
|
+
function thresholdSurgePercentageChangedEvent(event, state, log) {
|
|
73
|
+
// ThresholdSurgePercentageChanged(pool, newSurgeThresholdPercentage)
|
|
74
|
+
const hookAddress = log.address.toLowerCase();
|
|
75
|
+
if (!state[hookAddress]) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const newState = lodash_1.default.cloneDeep(state);
|
|
79
|
+
newState[hookAddress][event.args.pool.toLowerCase()].surgeThresholdPercentage = BigInt(event.args.newSurgeThresholdPercentage);
|
|
80
|
+
return newState;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Handles the event emitted when max surge fee percentage changed.
|
|
84
|
+
* @param event
|
|
85
|
+
* @param state
|
|
86
|
+
* @param log
|
|
87
|
+
* @returns
|
|
88
|
+
*/
|
|
89
|
+
function maxSurgeFeePercentageChangedEvent(event, state, log) {
|
|
90
|
+
// MaxSurgeFeePercentageChanged(pool, newMaxSurgeFeePercentage)
|
|
91
|
+
const hookAddress = log.address.toLowerCase();
|
|
92
|
+
if (!state[hookAddress]) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const newState = lodash_1.default.cloneDeep(state);
|
|
96
|
+
newState[hookAddress][event.args.pool.toLowerCase()].maxSurgeFeePercentage = BigInt(event.args.newMaxSurgeFeePercentage);
|
|
97
|
+
return newState;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=stableSurgeHook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stableSurgeHook.js","sourceRoot":"","sources":["../../../../src/dex/balancer-v3/hooks/stableSurgeHook.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { BufferState } from '@balancer-labs/balancer-maths';
|
|
2
2
|
import { Address } from '../../types';
|
|
3
|
+
import { HookConfig } from './hooks/balancer-hook-event-subscriber';
|
|
3
4
|
export type CommonImmutablePoolState = {
|
|
4
5
|
poolAddress: string;
|
|
5
6
|
poolType: string;
|
|
6
7
|
tokens: string[];
|
|
7
8
|
tokensUnderlying: (string | null)[];
|
|
8
9
|
weights: bigint[];
|
|
10
|
+
hookAddress: string | undefined;
|
|
9
11
|
hookType: string | undefined;
|
|
12
|
+
supportsUnbalancedLiquidity: boolean;
|
|
10
13
|
};
|
|
11
14
|
export interface CommonMutableState {
|
|
12
15
|
tokenRates: bigint[];
|
|
@@ -17,7 +20,6 @@ export interface CommonMutableState {
|
|
|
17
20
|
totalSupply: bigint;
|
|
18
21
|
isPoolPaused: boolean;
|
|
19
22
|
scalingFactors: bigint[];
|
|
20
|
-
hasHook: boolean;
|
|
21
23
|
}
|
|
22
24
|
type CommonPoolState = CommonImmutablePoolState & CommonMutableState;
|
|
23
25
|
export type PoolState = CommonPoolState | (CommonPoolState & StableMutableState);
|
|
@@ -52,6 +54,7 @@ export type DexParams = {
|
|
|
52
54
|
vaultAddress: string;
|
|
53
55
|
balancerRouterAddress: string;
|
|
54
56
|
balancerBatchRouterAddress: string;
|
|
57
|
+
hooks?: HookConfig[];
|
|
55
58
|
};
|
|
56
59
|
export type TokenInfo = {
|
|
57
60
|
isBoosted: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paraswap/dex-lib",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4-bal-v3-hooks.0",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"types": "build/index.d.ts",
|
|
6
6
|
"repository": "https://github.com/paraswap/paraswap-dex-lib",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@0x/utils": "^4.5.2",
|
|
55
|
-
"@balancer-labs/balancer-maths": "^0.0.
|
|
55
|
+
"@balancer-labs/balancer-maths": "^0.0.22",
|
|
56
56
|
"@balancer-labs/sor": "4.1.3",
|
|
57
57
|
"@bgd-labs/aave-address-book": "4.9.0",
|
|
58
58
|
"@ethersproject/abi": "^5.7.0",
|
|
@@ -48,10 +48,10 @@ async function main() {
|
|
|
48
48
|
|
|
49
49
|
await balancerV3.initializePricing(blocknumber);
|
|
50
50
|
|
|
51
|
-
const from = stataUSDC;
|
|
52
|
-
const to = stataUSDT;
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
// const from = stataUSDC;
|
|
52
|
+
// const to = stataUSDT;
|
|
53
|
+
const from = usdcAave;
|
|
54
|
+
const to = daiAave;
|
|
55
55
|
|
|
56
56
|
const pools = await balancerV3.getPoolIdentifiers(
|
|
57
57
|
from,
|