@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.
Files changed (56) hide show
  1. package/build/abi/balancer-v3/directionalFeeHook.json +684 -0
  2. package/build/abi/balancer-v3/stableSurgeHook.json +976 -0
  3. package/build/dex/balancer-v3/balancer-test-helpers.d.ts +5 -0
  4. package/build/dex/balancer-v3/balancer-test-helpers.js +122 -0
  5. package/build/dex/balancer-v3/balancer-test-helpers.js.map +1 -0
  6. package/build/dex/balancer-v3/balancer-v3-pool.d.ts +4 -1
  7. package/build/dex/balancer-v3/balancer-v3-pool.js +20 -13
  8. package/build/dex/balancer-v3/balancer-v3-pool.js.map +1 -1
  9. package/build/dex/balancer-v3/balancer-v3.d.ts +4 -0
  10. package/build/dex/balancer-v3/balancer-v3.js +29 -3
  11. package/build/dex/balancer-v3/balancer-v3.js.map +1 -1
  12. package/build/dex/balancer-v3/config.js +39 -0
  13. package/build/dex/balancer-v3/config.js.map +1 -1
  14. package/build/dex/balancer-v3/getOnChainState.d.ts +1 -2
  15. package/build/dex/balancer-v3/getOnChainState.js +0 -2
  16. package/build/dex/balancer-v3/getOnChainState.js.map +1 -1
  17. package/build/dex/balancer-v3/getPoolsApi.d.ts +2 -1
  18. package/build/dex/balancer-v3/getPoolsApi.js +17 -10
  19. package/build/dex/balancer-v3/getPoolsApi.js.map +1 -1
  20. package/build/dex/balancer-v3/getTopPoolsApi.d.ts +5 -1
  21. package/build/dex/balancer-v3/getTopPoolsApi.js +6 -3
  22. package/build/dex/balancer-v3/getTopPoolsApi.js.map +1 -1
  23. package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.d.ts +54 -0
  24. package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.js +153 -0
  25. package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.js.map +1 -0
  26. package/build/dex/balancer-v3/hooks/directionalFeeHook.d.ts +26 -0
  27. package/build/dex/balancer-v3/hooks/directionalFeeHook.js +41 -0
  28. package/build/dex/balancer-v3/hooks/directionalFeeHook.js.map +1 -0
  29. package/build/dex/balancer-v3/hooks/loadHooksConfig.d.ts +2 -0
  30. package/build/dex/balancer-v3/hooks/loadHooksConfig.js +11 -0
  31. package/build/dex/balancer-v3/hooks/loadHooksConfig.js.map +1 -0
  32. package/build/dex/balancer-v3/hooks/stableSurgeHook.d.ts +39 -0
  33. package/build/dex/balancer-v3/hooks/stableSurgeHook.js +99 -0
  34. package/build/dex/balancer-v3/hooks/stableSurgeHook.js.map +1 -0
  35. package/build/dex/balancer-v3/types.d.ts +4 -1
  36. package/package.json +2 -2
  37. package/scripts/run-dex-integration-v3.ts +4 -4
  38. package/src/abi/balancer-v3/directionalFeeHook.json +684 -0
  39. package/src/abi/balancer-v3/stableSurgeHook.json +976 -0
  40. package/src/dex/balancer-v3/balancer-hooks-events.test.ts +99 -0
  41. package/src/dex/balancer-v3/balancer-stableSurge.test.ts +110 -0
  42. package/src/dex/balancer-v3/balancer-test-helpers.ts +199 -0
  43. package/src/dex/balancer-v3/balancer-v3-e2e.test.ts +20 -0
  44. package/src/dex/balancer-v3/balancer-v3-integration.test.ts +2 -197
  45. package/src/dex/balancer-v3/balancer-v3-pool.ts +37 -13
  46. package/src/dex/balancer-v3/balancer-v3.ts +42 -1
  47. package/src/dex/balancer-v3/config.ts +39 -0
  48. package/src/dex/balancer-v3/getOnChainState.ts +1 -4
  49. package/src/dex/balancer-v3/getPoolsApi.ts +42 -23
  50. package/src/dex/balancer-v3/getTopPoolsApi.ts +13 -2
  51. package/src/dex/balancer-v3/hooks/balancer-hook-event-subscriber.ts +226 -0
  52. package/src/dex/balancer-v3/hooks/directionalFeeHook.ts +51 -0
  53. package/src/dex/balancer-v3/hooks/loadHooksConfig.ts +12 -0
  54. package/src/dex/balancer-v3/hooks/stableSurgeHook.ts +163 -0
  55. package/src/dex/balancer-v3/types.ts +4 -2
  56. 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",
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.19",
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
- // const from = daiAave;
54
- // const to = usdcAave;
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,