@enzymefinance/testutils 4.0.0-next.2 → 4.0.0-next.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/declarations/src/assertions.d.ts +2 -2
  3. package/dist/declarations/src/deployment.d.ts +172 -68
  4. package/dist/declarations/src/gasRelayer.d.ts +14 -12
  5. package/dist/declarations/src/helpers.d.ts +5 -4
  6. package/dist/declarations/src/scaffolding/assets.d.ts +4 -4
  7. package/dist/declarations/src/scaffolding/chainlink.d.ts +2 -2
  8. package/dist/declarations/src/scaffolding/common.d.ts +1 -1
  9. package/dist/declarations/src/scaffolding/core.d.ts +4 -4
  10. package/dist/declarations/src/scaffolding/extensions/common.d.ts +4 -4
  11. package/dist/declarations/src/scaffolding/extensions/external-positions/actions.d.ts +8 -6
  12. package/dist/declarations/src/scaffolding/extensions/external-positions/compound.d.ts +5 -5
  13. package/dist/declarations/src/scaffolding/extensions/external-positions/index.d.ts +1 -0
  14. package/dist/declarations/src/scaffolding/extensions/external-positions/mocks.d.ts +16 -12
  15. package/dist/declarations/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.d.ts +100 -0
  16. package/dist/declarations/src/scaffolding/extensions/fees.d.ts +4 -4
  17. package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +6 -5
  18. package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +33 -5
  19. package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +101 -84
  20. package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +6 -6
  21. package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +3 -0
  22. package/dist/declarations/src/scaffolding/extensions/integrations/mock.d.ts +4 -4
  23. package/dist/declarations/src/scaffolding/extensions/integrations/olympusV2.d.ts +17 -0
  24. package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV4.d.ts +6 -5
  25. package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV5.d.ts +23 -0
  26. package/dist/declarations/src/scaffolding/extensions/integrations/poolTogetherV4.d.ts +29 -0
  27. package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +15 -12
  28. package/dist/declarations/src/scaffolding/extensions/integrations/trackedAssets.d.ts +3 -3
  29. package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV2.d.ts +4 -4
  30. package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV3.d.ts +4 -4
  31. package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +5 -5
  32. package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +4 -4
  33. package/dist/declarations/src/scaffolding/extensions/policies.d.ts +9 -9
  34. package/dist/declarations/src/scaffolding/setup.d.ts +11 -9
  35. package/dist/declarations/src/scaffolding/shares.d.ts +4 -4
  36. package/dist/declarations/src/scaffolding/vaultCalls.d.ts +11 -2
  37. package/dist/declarations/src/whales.d.ts +24 -19
  38. package/dist/enzymefinance-testutils.browser.cjs.js +1541 -673
  39. package/dist/enzymefinance-testutils.browser.esm.js +1502 -655
  40. package/dist/enzymefinance-testutils.cjs.dev.js +1541 -673
  41. package/dist/enzymefinance-testutils.cjs.prod.js +1541 -673
  42. package/dist/enzymefinance-testutils.esm.js +1502 -655
  43. package/package.json +6 -6
  44. package/src/assertions.ts +5 -2
  45. package/src/deployment.ts +221 -120
  46. package/src/gasRelayer.ts +17 -18
  47. package/src/helpers.ts +6 -4
  48. package/src/scaffolding/assets.ts +7 -6
  49. package/src/scaffolding/chainlink.ts +2 -2
  50. package/src/scaffolding/common.ts +1 -1
  51. package/src/scaffolding/core.ts +4 -8
  52. package/src/scaffolding/extensions/common.ts +4 -4
  53. package/src/scaffolding/extensions/external-positions/actions.ts +14 -9
  54. package/src/scaffolding/extensions/external-positions/compound.ts +28 -29
  55. package/src/scaffolding/extensions/external-positions/index.ts +1 -0
  56. package/src/scaffolding/extensions/external-positions/mocks.ts +32 -36
  57. package/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.ts +284 -0
  58. package/src/scaffolding/extensions/fees.ts +1 -1
  59. package/src/scaffolding/extensions/integrations/aave.ts +6 -8
  60. package/src/scaffolding/extensions/integrations/compound.ts +171 -11
  61. package/src/scaffolding/extensions/integrations/curve.ts +303 -255
  62. package/src/scaffolding/extensions/integrations/idle.ts +9 -11
  63. package/src/scaffolding/extensions/integrations/index.ts +3 -0
  64. package/src/scaffolding/extensions/integrations/mock.ts +11 -13
  65. package/src/scaffolding/extensions/integrations/olympusV2.ts +71 -0
  66. package/src/scaffolding/extensions/integrations/paraSwapV4.ts +16 -11
  67. package/src/scaffolding/extensions/integrations/paraSwapV5.ts +73 -0
  68. package/src/scaffolding/extensions/integrations/poolTogetherV4.ts +117 -0
  69. package/src/scaffolding/extensions/integrations/synthetix.ts +45 -31
  70. package/src/scaffolding/extensions/integrations/trackedAssets.ts +3 -4
  71. package/src/scaffolding/extensions/integrations/uniswapV2.ts +22 -19
  72. package/src/scaffolding/extensions/integrations/uniswapV3.ts +9 -10
  73. package/src/scaffolding/extensions/integrations/yearn.ts +9 -11
  74. package/src/scaffolding/extensions/integrations/zeroExV2.ts +9 -7
  75. package/src/scaffolding/extensions/policies.ts +2 -1
  76. package/src/scaffolding/setup.ts +27 -13
  77. package/src/scaffolding/shares.ts +5 -4
  78. package/src/scaffolding/vaultCalls.ts +32 -2
  79. package/src/types.d.ts +1 -0
  80. package/src/whales.ts +36 -18
@@ -1,16 +1,16 @@
1
- import { AddressLike, extractEvent } from '@enzymefinance/ethers';
2
- import { SignerWithAddress } from '@enzymefinance/hardhat';
1
+ import type { AddressLike } from '@enzymefinance/ethers';
2
+ import { extractEvent } from '@enzymefinance/ethers';
3
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
4
+ import type { ComptrollerLib, ExternalPositionManager } from '@enzymefinance/protocol';
3
5
  import {
4
6
  callOnExternalPositionArgs,
5
- ComptrollerLib,
6
7
  encodeArgs,
7
- ExternalPositionManager,
8
8
  ExternalPositionManagerActionId,
9
9
  externalPositionReactivateArgs,
10
10
  externalPositionRemoveArgs,
11
11
  IExternalPositionProxy,
12
12
  } from '@enzymefinance/protocol';
13
- import { BigNumberish, BytesLike } from 'ethers';
13
+ import type { BigNumberish, BytesLike } from 'ethers';
14
14
 
15
15
  export async function callOnExternalPosition({
16
16
  signer,
@@ -28,9 +28,9 @@ export async function callOnExternalPosition({
28
28
  actionArgs: BytesLike;
29
29
  }) {
30
30
  const callArgs = callOnExternalPositionArgs({
31
- externalPositionProxy,
32
- actionId,
33
31
  actionArgs,
32
+ actionId,
33
+ externalPositionProxy,
34
34
  });
35
35
 
36
36
  return comptrollerProxy
@@ -44,26 +44,31 @@ export async function createExternalPosition({
44
44
  externalPositionManager,
45
45
  externalPositionTypeId,
46
46
  initializationData = '0x',
47
+ callOnExternalPositionData = '0x',
47
48
  }: {
48
49
  signer: SignerWithAddress;
49
50
  comptrollerProxy: ComptrollerLib;
50
51
  externalPositionManager: ExternalPositionManager;
51
52
  externalPositionTypeId: BigNumberish;
52
53
  initializationData?: BytesLike;
54
+ callOnExternalPositionData?: BytesLike;
53
55
  }) {
54
56
  const receipt = await comptrollerProxy
55
57
  .connect(signer)
56
58
  .callOnExtension(
57
59
  externalPositionManager,
58
60
  ExternalPositionManagerActionId.CreateExternalPosition,
59
- encodeArgs(['uint256', 'bytes'], [externalPositionTypeId, initializationData]),
61
+ encodeArgs(
62
+ ['uint256', 'bytes', 'bytes'],
63
+ [externalPositionTypeId, initializationData, callOnExternalPositionData],
64
+ ),
60
65
  );
61
66
 
62
67
  const event = extractEvent(receipt, externalPositionManager.abi.getEvent('ExternalPositionDeployedForFund'));
63
68
 
64
69
  const externalPositionProxy = new IExternalPositionProxy(event[0].args.externalPosition, signer);
65
70
 
66
- return { receipt, externalPositionProxy };
71
+ return { externalPositionProxy, receipt };
67
72
  }
68
73
 
69
74
  export async function reactivateExternalPosition({
@@ -1,15 +1,14 @@
1
- import { AddressLike } from '@enzymefinance/ethers';
2
- import { SignerWithAddress } from '@enzymefinance/hardhat';
1
+ import type { AddressLike } from '@enzymefinance/ethers';
2
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import type { ComptrollerLib, ExternalPositionManager, VaultLib } from '@enzymefinance/protocol';
3
4
  import {
4
- ComptrollerLib,
5
- encodeArgs,
6
- ExternalPositionManager,
7
- VaultLib,
8
- compoundExternalPositionActionArgs,
9
5
  CompoundDebtPositionActionId,
6
+ compoundExternalPositionActionArgs,
7
+ encodeArgs,
10
8
  ExternalPositionType,
11
9
  } from '@enzymefinance/protocol';
12
- import { BigNumberish } from 'ethers';
10
+ import type { BigNumberish } from 'ethers';
11
+
13
12
  import { callOnExternalPosition, createExternalPosition } from './actions';
14
13
 
15
14
  export async function compoundDebtPositionAddCollateral({
@@ -30,18 +29,18 @@ export async function compoundDebtPositionAddCollateral({
30
29
  externalPositionProxy: AddressLike;
31
30
  }) {
32
31
  const actionArgs = compoundExternalPositionActionArgs({
33
- assets,
34
32
  amounts,
33
+ assets,
35
34
  data: encodeArgs(['address[]'], [cTokens]),
36
35
  });
37
36
 
38
37
  return callOnExternalPosition({
39
- signer: fundOwner,
38
+ actionArgs,
39
+ actionId: CompoundDebtPositionActionId.AddCollateralAssets,
40
40
  comptrollerProxy,
41
41
  externalPositionManager,
42
42
  externalPositionProxy,
43
- actionId: CompoundDebtPositionActionId.AddCollateralAssets,
44
- actionArgs,
43
+ signer: fundOwner,
45
44
  });
46
45
  }
47
46
 
@@ -64,18 +63,18 @@ export async function compoundDebtPositionBorrow({
64
63
  cTokens: AddressLike[];
65
64
  }) {
66
65
  const actionArgs = compoundExternalPositionActionArgs({
67
- assets,
68
66
  amounts,
67
+ assets,
69
68
  data: encodeArgs(['address[]'], [cTokens]),
70
69
  });
71
70
 
72
71
  return callOnExternalPosition({
73
- signer: fundOwner,
72
+ actionArgs,
73
+ actionId: CompoundDebtPositionActionId.BorrowAsset,
74
74
  comptrollerProxy,
75
75
  externalPositionManager,
76
76
  externalPositionProxy,
77
- actionId: CompoundDebtPositionActionId.BorrowAsset,
78
- actionArgs,
77
+ signer: fundOwner,
79
78
  });
80
79
  }
81
80
 
@@ -92,18 +91,18 @@ export async function compoundDebtPositionClaimComp({
92
91
  externalPositionProxy: AddressLike;
93
92
  }) {
94
93
  const actionArgs = compoundExternalPositionActionArgs({
95
- assets: [],
96
94
  amounts: [],
95
+ assets: [],
97
96
  data: '0x',
98
97
  });
99
98
 
100
99
  return callOnExternalPosition({
101
- signer: fundOwner,
100
+ actionArgs,
101
+ actionId: CompoundDebtPositionActionId.ClaimComp,
102
102
  comptrollerProxy,
103
103
  externalPositionManager,
104
104
  externalPositionProxy,
105
- actionId: CompoundDebtPositionActionId.ClaimComp,
106
- actionArgs,
105
+ signer: fundOwner,
107
106
  });
108
107
  }
109
108
 
@@ -125,18 +124,18 @@ export async function compoundDebtPositionRemoveCollateral({
125
124
  cTokens: AddressLike[];
126
125
  }) {
127
126
  const actionArgs = compoundExternalPositionActionArgs({
128
- assets,
129
127
  amounts,
128
+ assets,
130
129
  data: encodeArgs(['address[]'], [cTokens]),
131
130
  });
132
131
 
133
132
  return callOnExternalPosition({
134
- signer: fundOwner,
133
+ actionArgs,
134
+ actionId: CompoundDebtPositionActionId.RemoveCollateralAssets,
135
135
  comptrollerProxy,
136
136
  externalPositionManager,
137
137
  externalPositionProxy,
138
- actionId: CompoundDebtPositionActionId.RemoveCollateralAssets,
139
- actionArgs,
138
+ signer: fundOwner,
140
139
  });
141
140
  }
142
141
 
@@ -158,18 +157,18 @@ export async function compoundDebtPositionRepayBorrow({
158
157
  cTokens: AddressLike[];
159
158
  }) {
160
159
  const actionArgs = compoundExternalPositionActionArgs({
161
- assets,
162
160
  amounts,
161
+ assets,
163
162
  data: encodeArgs(['address[]'], [cTokens]),
164
163
  });
165
164
 
166
165
  return callOnExternalPosition({
167
- signer: fundOwner,
166
+ actionArgs,
167
+ actionId: CompoundDebtPositionActionId.RepayBorrowedAssets,
168
168
  comptrollerProxy,
169
169
  externalPositionManager,
170
170
  externalPositionProxy,
171
- actionId: CompoundDebtPositionActionId.RepayBorrowedAssets,
172
- actionArgs,
171
+ signer: fundOwner,
173
172
  });
174
173
  }
175
174
 
@@ -183,9 +182,9 @@ export async function createCompoundDebtPosition({
183
182
  externalPositionManager: ExternalPositionManager;
184
183
  }) {
185
184
  return createExternalPosition({
186
- signer,
187
185
  comptrollerProxy,
188
186
  externalPositionManager,
189
187
  externalPositionTypeId: ExternalPositionType.CompoundDebtPosition,
188
+ signer,
190
189
  });
191
190
  }
@@ -1,3 +1,4 @@
1
1
  export * from './actions';
2
2
  export * from './compound';
3
3
  export * from './mocks';
4
+ export * from './uniswap-v3-liquidity';
@@ -1,19 +1,16 @@
1
+ import type { AddressLike } from '@enzymefinance/ethers';
2
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import type { ComptrollerLib, ExternalPositionFactory, ExternalPositionManager } from '@enzymefinance/protocol';
1
4
  import {
2
- ComptrollerLib,
3
- encodeArgs,
4
- ExternalPositionManagerActionId,
5
- ExternalPositionFactory,
6
- ExternalPositionManager,
7
5
  mockGenericExternalPositionActionArgs,
8
6
  MockGenericExternalPositionActionId,
9
7
  MockGenericExternalPositionLib,
10
8
  MockGenericExternalPositionParser,
11
9
  VaultLib,
12
- } from '@enzymefinance/protocol/src';
13
- import { SignerWithAddress } from '@enzymefinance/hardhat';
14
- import { AddressLike } from '@enzymefinance/ethers';
15
- import { BigNumberish } from 'ethers';
16
- import { callOnExternalPosition } from './actions';
10
+ } from '@enzymefinance/protocol';
11
+ import type { BigNumberish } from 'ethers';
12
+
13
+ import { callOnExternalPosition, createExternalPosition } from './actions';
17
14
 
18
15
  export async function createMockExternalPosition({
19
16
  comptrollerProxy,
@@ -55,22 +52,21 @@ export async function createMockExternalPosition({
55
52
  [mockExternalPositionParser],
56
53
  );
57
54
 
58
- const receipt = await comptrollerProxy
59
- .connect(fundOwner)
60
- .callOnExtension(
61
- externalPositionManager,
62
- ExternalPositionManagerActionId.CreateExternalPosition,
63
- encodeArgs(['uint256', 'bytes'], [typeId, '0x']),
64
- );
55
+ const receipt = await createExternalPosition({
56
+ comptrollerProxy,
57
+ externalPositionManager,
58
+ externalPositionTypeId: typeId,
59
+ signer: fundOwner,
60
+ });
65
61
 
66
62
  const externalPositionProxy = (await vaultProxy.getActiveExternalPositions())[0];
67
63
 
68
64
  return {
69
- typeId,
70
- mockGenericExternalPositionLib,
71
- mockExternalPositionParser,
72
65
  externalPositionProxy,
66
+ mockExternalPositionParser,
67
+ mockGenericExternalPositionLib,
73
68
  receipt,
69
+ typeId,
74
70
  };
75
71
  }
76
72
 
@@ -90,17 +86,17 @@ export async function mockExternalPositionAddDebtAssets({
90
86
  amounts: BigNumberish[];
91
87
  }) {
92
88
  const actionArgs = mockGenericExternalPositionActionArgs({
93
- assets,
94
89
  amounts,
90
+ assets,
95
91
  });
96
92
 
97
93
  return callOnExternalPosition({
98
- signer,
94
+ actionArgs,
95
+ actionId: MockGenericExternalPositionActionId.AddDebtAssets,
99
96
  comptrollerProxy,
100
97
  externalPositionManager,
101
98
  externalPositionProxy,
102
- actionId: MockGenericExternalPositionActionId.AddDebtAssets,
103
- actionArgs,
99
+ signer,
104
100
  });
105
101
  }
106
102
 
@@ -120,17 +116,17 @@ export async function mockExternalPositionAddManagedAssets({
120
116
  amounts: BigNumberish[];
121
117
  }) {
122
118
  const actionArgs = mockGenericExternalPositionActionArgs({
123
- assets,
124
119
  amounts,
120
+ assets,
125
121
  });
126
122
 
127
123
  return callOnExternalPosition({
128
- signer,
124
+ actionArgs,
125
+ actionId: MockGenericExternalPositionActionId.AddManagedAssets,
129
126
  comptrollerProxy,
130
127
  externalPositionManager,
131
128
  externalPositionProxy,
132
- actionId: MockGenericExternalPositionActionId.AddManagedAssets,
133
- actionArgs,
129
+ signer,
134
130
  });
135
131
  }
136
132
 
@@ -150,17 +146,17 @@ export async function mockExternalPositionRemoveDebtAssets({
150
146
  amounts: BigNumberish[];
151
147
  }) {
152
148
  const actionArgs = mockGenericExternalPositionActionArgs({
153
- assets,
154
149
  amounts,
150
+ assets,
155
151
  });
156
152
 
157
153
  return callOnExternalPosition({
158
- signer,
154
+ actionArgs,
155
+ actionId: MockGenericExternalPositionActionId.RemoveDebtAssets,
159
156
  comptrollerProxy,
160
157
  externalPositionManager,
161
158
  externalPositionProxy,
162
- actionId: MockGenericExternalPositionActionId.RemoveDebtAssets,
163
- actionArgs,
159
+ signer,
164
160
  });
165
161
  }
166
162
 
@@ -180,16 +176,16 @@ export async function mockExternalPositionRemoveManagedAssets({
180
176
  amounts: BigNumberish[];
181
177
  }) {
182
178
  const actionArgs = mockGenericExternalPositionActionArgs({
183
- assets,
184
179
  amounts,
180
+ assets,
185
181
  });
186
182
 
187
183
  return callOnExternalPosition({
188
- signer,
184
+ actionArgs,
185
+ actionId: MockGenericExternalPositionActionId.RemoveManagedAssets,
189
186
  comptrollerProxy,
190
187
  externalPositionManager,
191
188
  externalPositionProxy,
192
- actionId: MockGenericExternalPositionActionId.RemoveManagedAssets,
193
- actionArgs,
189
+ signer,
194
190
  });
195
191
  }
@@ -0,0 +1,284 @@
1
+ import type { AddressLike, Call, Contract } from '@enzymefinance/ethers';
2
+ import { contract, extractEvent, resolveAddress } from '@enzymefinance/ethers';
3
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
4
+ import type { ComptrollerLib, ExternalPositionManager } from '@enzymefinance/protocol';
5
+ import {
6
+ callOnExternalPositionArgs,
7
+ ExternalPositionManagerActionId,
8
+ ExternalPositionType,
9
+ UniswapV3LiquidityPositionActionId,
10
+ uniswapV3LiquidityPositionAddLiquidityArgs,
11
+ uniswapV3LiquidityPositionCollectArgs,
12
+ UniswapV3LiquidityPositionLib,
13
+ uniswapV3LiquidityPositionMintArgs,
14
+ uniswapV3LiquidityPositionPurgeArgs,
15
+ uniswapV3LiquidityPositionRemoveLiquidityArgs,
16
+ } from '@enzymefinance/protocol';
17
+ import type { BigNumber, BigNumberish, BytesLike } from 'ethers';
18
+
19
+ import { createExternalPosition } from './actions';
20
+
21
+ export enum UniswapV3FeeAmount {
22
+ LOW = 500,
23
+ MEDIUM = 3000,
24
+ HIGH = 10000,
25
+ }
26
+
27
+ export const uniswapV3LiquidityPositionGetMinTick = (tickSpacing: number) =>
28
+ Math.ceil(-887272 / tickSpacing) * tickSpacing;
29
+ export const uniswapV3LiquidityPositionGetMaxTick = (tickSpacing: number) =>
30
+ Math.floor(887272 / tickSpacing) * tickSpacing;
31
+
32
+ export interface IUniswapV3NonFungibleTokenManager extends Contract<IUniswapV3NonFungibleTokenManager> {
33
+ positions: Call<
34
+ (tokenId: BigNumberish) => {
35
+ nonce: BigNumber;
36
+ operator: string;
37
+ token0: string;
38
+ token1: string;
39
+ fee: BigNumber;
40
+ tickLower: BigNumber;
41
+ tickUpper: BigNumber;
42
+ liquidity: BigNumber;
43
+ feeGrowthInside0LastX128: BigNumber;
44
+ feeGrowthInside1LastX128: BigNumber;
45
+ tokensOwed0: BigNumber;
46
+ tokensOwed1: BigNumber;
47
+ },
48
+ Contract<any>
49
+ >;
50
+ }
51
+
52
+ export const IUniswapV3NonFungibleTokenManager = contract<IUniswapV3NonFungibleTokenManager>()`
53
+ function positions(uint256 tokenId) view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1)
54
+ `;
55
+
56
+ export async function createUniswapV3LiquidityPosition({
57
+ signer,
58
+ comptrollerProxy,
59
+ externalPositionManager,
60
+ callOnExternalPositionData = '0x',
61
+ }: {
62
+ signer: SignerWithAddress;
63
+ comptrollerProxy: ComptrollerLib;
64
+ externalPositionManager: ExternalPositionManager;
65
+ callOnExternalPositionData?: BytesLike;
66
+ }) {
67
+ const { externalPositionProxy: externalPositionProxyContract, receipt } = await createExternalPosition({
68
+ callOnExternalPositionData,
69
+ comptrollerProxy,
70
+ externalPositionManager,
71
+ externalPositionTypeId: ExternalPositionType.UniswapV3LiquidityPosition,
72
+ signer,
73
+ });
74
+
75
+ return { externalPositionProxyAddress: externalPositionProxyContract.address, receipt };
76
+ }
77
+
78
+ export async function uniswapV3LiquidityPositionAddLiquidity({
79
+ signer,
80
+ comptrollerProxy,
81
+ externalPositionManager,
82
+ externalPositionProxy,
83
+ nftId,
84
+ amount0Desired,
85
+ amount1Desired,
86
+ amount0Min = 0,
87
+ amount1Min = 0,
88
+ }: {
89
+ signer: SignerWithAddress;
90
+ comptrollerProxy: ComptrollerLib;
91
+ externalPositionManager: ExternalPositionManager;
92
+ externalPositionProxy: AddressLike;
93
+ nftId: BigNumberish;
94
+ amount0Desired: BigNumberish;
95
+ amount1Desired: BigNumberish;
96
+ amount0Min?: BigNumberish;
97
+ amount1Min?: BigNumberish;
98
+ }) {
99
+ const actionArgs = uniswapV3LiquidityPositionAddLiquidityArgs({
100
+ amount0Desired,
101
+ amount0Min,
102
+ amount1Desired,
103
+ amount1Min,
104
+ nftId,
105
+ });
106
+
107
+ const callArgs = callOnExternalPositionArgs({
108
+ actionArgs,
109
+ actionId: UniswapV3LiquidityPositionActionId.AddLiquidity,
110
+ externalPositionProxy,
111
+ });
112
+
113
+ return comptrollerProxy
114
+ .connect(signer)
115
+ .callOnExtension(externalPositionManager, ExternalPositionManagerActionId.CallOnExternalPosition, callArgs);
116
+ }
117
+
118
+ export async function uniswapV3LiquidityPositionCollect({
119
+ signer,
120
+ comptrollerProxy,
121
+ externalPositionManager,
122
+ externalPositionProxy,
123
+ nftId,
124
+ }: {
125
+ signer: SignerWithAddress;
126
+ comptrollerProxy: ComptrollerLib;
127
+ externalPositionManager: ExternalPositionManager;
128
+ externalPositionProxy: AddressLike;
129
+ nftId: BigNumberish;
130
+ }) {
131
+ const actionArgs = uniswapV3LiquidityPositionCollectArgs({
132
+ nftId,
133
+ });
134
+
135
+ const callArgs = callOnExternalPositionArgs({
136
+ actionArgs,
137
+ actionId: UniswapV3LiquidityPositionActionId.Collect,
138
+ externalPositionProxy,
139
+ });
140
+
141
+ return comptrollerProxy
142
+ .connect(signer)
143
+ .callOnExtension(externalPositionManager, ExternalPositionManagerActionId.CallOnExternalPosition, callArgs);
144
+ }
145
+
146
+ export async function uniswapV3LiquidityPositionMint({
147
+ signer,
148
+ comptrollerProxy,
149
+ externalPositionManager,
150
+ externalPositionProxy,
151
+ token0,
152
+ token1,
153
+ fee,
154
+ tickLower,
155
+ tickUpper,
156
+ amount0Desired,
157
+ amount1Desired,
158
+ amount0Min = 0,
159
+ amount1Min = 0,
160
+ }: {
161
+ signer: SignerWithAddress;
162
+ comptrollerProxy: ComptrollerLib;
163
+ externalPositionManager: ExternalPositionManager;
164
+ externalPositionProxy: AddressLike;
165
+ token0: AddressLike;
166
+ token1: AddressLike;
167
+ fee: BigNumberish;
168
+ tickLower: BigNumberish;
169
+ tickUpper: BigNumberish;
170
+ amount0Desired: BigNumberish;
171
+ amount1Desired: BigNumberish;
172
+ amount0Min?: BigNumberish;
173
+ amount1Min?: BigNumberish;
174
+ }) {
175
+ const actionArgs = uniswapV3LiquidityPositionMintArgs({
176
+ amount0Desired,
177
+ amount0Min,
178
+ amount1Desired,
179
+ amount1Min,
180
+ fee,
181
+ tickLower,
182
+ tickUpper,
183
+ token0,
184
+ token1,
185
+ });
186
+
187
+ const callArgs = callOnExternalPositionArgs({
188
+ actionArgs,
189
+ actionId: UniswapV3LiquidityPositionActionId.Mint,
190
+ externalPositionProxy,
191
+ });
192
+
193
+ const receipt = await comptrollerProxy
194
+ .connect(signer)
195
+ .callOnExtension(externalPositionManager, ExternalPositionManagerActionId.CallOnExternalPosition, callArgs);
196
+
197
+ const externalPosition = new UniswapV3LiquidityPositionLib(externalPositionProxy, provider);
198
+ const nftId = extractEvent(receipt, externalPosition.abi.getEvent('NFTPositionAdded'))[0].args.tokenId;
199
+
200
+ return { nftId, receipt };
201
+ }
202
+
203
+ export async function uniswapV3LiquidityPositionPurge({
204
+ signer,
205
+ comptrollerProxy,
206
+ externalPositionManager,
207
+ externalPositionProxy,
208
+ nftId,
209
+ liquidity,
210
+ amount0Min = 0,
211
+ amount1Min = 0,
212
+ }: {
213
+ signer: SignerWithAddress;
214
+ comptrollerProxy: ComptrollerLib;
215
+ externalPositionManager: ExternalPositionManager;
216
+ externalPositionProxy: AddressLike;
217
+ nftId: BigNumberish;
218
+ liquidity: BigNumberish;
219
+ amount0Min?: BigNumberish;
220
+ amount1Min?: BigNumberish;
221
+ }) {
222
+ const actionArgs = uniswapV3LiquidityPositionPurgeArgs({
223
+ amount0Min,
224
+ amount1Min,
225
+ liquidity,
226
+ nftId,
227
+ });
228
+
229
+ const callArgs = callOnExternalPositionArgs({
230
+ actionArgs,
231
+ actionId: UniswapV3LiquidityPositionActionId.Purge,
232
+ externalPositionProxy,
233
+ });
234
+
235
+ return comptrollerProxy
236
+ .connect(signer)
237
+ .callOnExtension(externalPositionManager, ExternalPositionManagerActionId.CallOnExternalPosition, callArgs);
238
+ }
239
+
240
+ export async function uniswapV3LiquidityPositionRemoveLiquidity({
241
+ signer,
242
+ comptrollerProxy,
243
+ externalPositionManager,
244
+ externalPositionProxy,
245
+ nftId,
246
+ liquidity,
247
+ amount0Min = 0,
248
+ amount1Min = 0,
249
+ }: {
250
+ signer: SignerWithAddress;
251
+ comptrollerProxy: ComptrollerLib;
252
+ externalPositionManager: ExternalPositionManager;
253
+ externalPositionProxy: AddressLike;
254
+ nftId: BigNumberish;
255
+ liquidity: BigNumberish;
256
+ amount0Min?: BigNumberish;
257
+ amount1Min?: BigNumberish;
258
+ }) {
259
+ const actionArgs = uniswapV3LiquidityPositionRemoveLiquidityArgs({
260
+ amount0Min,
261
+ amount1Min,
262
+ liquidity,
263
+ nftId,
264
+ });
265
+
266
+ const callArgs = callOnExternalPositionArgs({
267
+ actionArgs,
268
+ actionId: UniswapV3LiquidityPositionActionId.RemoveLiquidity,
269
+ externalPositionProxy,
270
+ });
271
+
272
+ return comptrollerProxy
273
+ .connect(signer)
274
+ .callOnExtension(externalPositionManager, ExternalPositionManagerActionId.CallOnExternalPosition, callArgs);
275
+ }
276
+
277
+ export function uniswapV3OrderTokenPair({ tokenA, tokenB }: { tokenA: AddressLike; tokenB: AddressLike }) {
278
+ const tokenAAddress = resolveAddress(tokenA);
279
+ const tokenBAddress = resolveAddress(tokenB);
280
+
281
+ return tokenAAddress < tokenBAddress
282
+ ? { token0: tokenAAddress, token1: tokenBAddress }
283
+ : { token0: tokenBAddress, token1: tokenAAddress };
284
+ }
@@ -1,4 +1,4 @@
1
- import { SignerWithAddress } from '@enzymefinance/hardhat';
1
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
2
2
  import { FeeHook, feeManagerConfigArgs, FeeSettlementType, IFee } from '@enzymefinance/protocol';
3
3
  import { constants, utils } from 'ethers';
4
4
 
@@ -1,17 +1,15 @@
1
- import { SignerWithAddress } from '@enzymefinance/hardhat';
1
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
2
+ import type { AaveAdapter, ComptrollerLib, IntegrationManager, StandardToken } from '@enzymefinance/protocol';
2
3
  import {
3
- AaveAdapter,
4
4
  aaveLendArgs,
5
5
  aaveRedeemArgs,
6
6
  callOnIntegrationArgs,
7
- ComptrollerLib,
8
- IntegrationManager,
9
7
  IntegrationManagerActionId,
10
8
  lendSelector,
11
9
  redeemSelector,
12
- StandardToken,
13
10
  } from '@enzymefinance/protocol';
14
- import { BigNumberish, utils } from 'ethers';
11
+ import type { BigNumberish } from 'ethers';
12
+ import { utils } from 'ethers';
15
13
 
16
14
  export async function aaveLend({
17
15
  comptrollerProxy,
@@ -35,8 +33,8 @@ export async function aaveLend({
35
33
 
36
34
  const callArgs = callOnIntegrationArgs({
37
35
  adapter: aaveAdapter,
38
- selector: lendSelector,
39
36
  encodedCallArgs: lendArgs,
37
+ selector: lendSelector,
40
38
  });
41
39
 
42
40
  const lendTx = comptrollerProxy
@@ -68,8 +66,8 @@ export async function aaveRedeem({
68
66
 
69
67
  const callArgs = callOnIntegrationArgs({
70
68
  adapter: aaveAdapter,
71
- selector: redeemSelector,
72
69
  encodedCallArgs: redeemArgs,
70
+ selector: redeemSelector,
73
71
  });
74
72
 
75
73
  const redeemTx = comptrollerProxy