@enzymefinance/testutils 4.0.0-next.5 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/declarations/src/deployment.d.ts +34 -27
  3. package/dist/declarations/src/scaffolding/assets.d.ts +1 -1
  4. package/dist/declarations/src/scaffolding/core.d.ts +2 -3
  5. package/dist/declarations/src/scaffolding/extensions/external-positions/aave-debt.d.ts +51 -0
  6. package/dist/declarations/src/scaffolding/extensions/external-positions/actions.d.ts +2 -1
  7. package/dist/declarations/src/scaffolding/extensions/external-positions/index.d.ts +1 -0
  8. package/dist/declarations/src/scaffolding/extensions/external-positions/mocks.d.ts +4 -1
  9. package/dist/declarations/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.d.ts +12 -11
  10. package/dist/declarations/src/scaffolding/extensions/fees.d.ts +3 -3
  11. package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +2 -2
  12. package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +30 -2
  13. package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +63 -229
  14. package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +3 -3
  15. package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +1 -1
  16. package/dist/declarations/src/scaffolding/extensions/integrations/olympusV2.d.ts +17 -0
  17. package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +5 -10
  18. package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +2 -2
  19. package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +1 -1
  20. package/dist/declarations/src/scaffolding/extensions/policies.d.ts +8 -8
  21. package/dist/declarations/src/whales.d.ts +12 -5
  22. package/dist/enzymefinance-testutils.browser.cjs.js +826 -721
  23. package/dist/enzymefinance-testutils.browser.esm.js +809 -692
  24. package/dist/enzymefinance-testutils.cjs.dev.js +826 -721
  25. package/dist/enzymefinance-testutils.cjs.prod.js +826 -721
  26. package/dist/enzymefinance-testutils.esm.js +809 -692
  27. package/package.json +6 -6
  28. package/src/deployment.ts +39 -31
  29. package/src/scaffolding/assets.ts +1 -1
  30. package/src/scaffolding/core.ts +3 -9
  31. package/src/scaffolding/extensions/external-positions/aave-debt.ts +179 -0
  32. package/src/scaffolding/extensions/external-positions/actions.ts +6 -1
  33. package/src/scaffolding/extensions/external-positions/index.ts +1 -0
  34. package/src/scaffolding/extensions/external-positions/mocks.ts +7 -10
  35. package/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.ts +18 -24
  36. package/src/scaffolding/extensions/integrations/compound.ts +163 -2
  37. package/src/scaffolding/extensions/integrations/curve.ts +152 -783
  38. package/src/scaffolding/extensions/integrations/index.ts +1 -1
  39. package/src/scaffolding/extensions/integrations/olympusV2.ts +71 -0
  40. package/src/scaffolding/extensions/integrations/synthetix.ts +6 -25
  41. package/src/types.d.ts +1 -0
  42. package/src/whales.ts +14 -5
  43. package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV4.d.ts +0 -23
  44. package/src/scaffolding/extensions/integrations/paraSwapV4.ts +0 -70
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enzymefinance/testutils",
3
- "version": "4.0.0-next.5",
3
+ "version": "4.0.0",
4
4
  "main": "dist/enzymefinance-testutils.cjs.js",
5
5
  "module": "dist/enzymefinance-testutils.esm.js",
6
6
  "browser": {
@@ -8,10 +8,10 @@
8
8
  "./dist/enzymefinance-testutils.esm.js": "./dist/enzymefinance-testutils.browser.esm.js"
9
9
  },
10
10
  "dependencies": {
11
- "@babel/runtime": "^7.15.4",
12
- "@enzymefinance/ethers": "^1.0.10",
13
- "@enzymefinance/hardhat": "^1.0.11",
14
- "@enzymefinance/protocol": "^4.0.0-next.5",
15
- "ethers": "^5.5.1"
11
+ "@babel/runtime": "^7.16.7",
12
+ "@enzymefinance/ethers": "^1.0.16",
13
+ "@enzymefinance/hardhat": "^1.0.16",
14
+ "@enzymefinance/protocol": "^4.0.0",
15
+ "ethers": "^5.5.4"
16
16
  }
17
17
  }
package/src/deployment.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  AaveAdapter,
3
+ AaveDebtPositionLib,
4
+ AaveDebtPositionParser,
3
5
  AavePriceFeed,
4
6
  AddressListRegistry,
5
7
  AllowedAdapterIncomingAssetsPolicy,
@@ -8,18 +10,17 @@ import {
8
10
  AllowedDepositRecipientsPolicy,
9
11
  AllowedExternalPositionTypesPolicy,
10
12
  AllowedSharesTransferRecipientsPolicy,
11
- AssetFinalityResolver,
12
13
  CompoundAdapter,
13
14
  CompoundDebtPositionLib,
14
15
  CompoundDebtPositionParser,
15
16
  CompoundPriceFeed,
16
17
  ComptrollerLib,
18
+ ConvexCurveLpStakingAdapter,
19
+ ConvexCurveLpStakingWrapperFactory,
20
+ ConvexCurveLpStakingWrapperPriceFeed,
17
21
  CumulativeSlippageTolerancePolicy,
18
22
  CurveExchangeAdapter,
19
- CurveLiquidityAaveAdapter,
20
- CurveLiquidityEursAdapter,
21
- CurveLiquiditySethAdapter,
22
- CurveLiquidityStethAdapter,
23
+ CurveLiquidityAdapter,
23
24
  CurvePriceFeed,
24
25
  DepositWrapper,
25
26
  Dispatcher,
@@ -34,8 +35,9 @@ import {
34
35
  FundValueCalculator,
35
36
  FundValueCalculatorRouter,
36
37
  FundValueCalculatorUsdWrapper,
38
+ FuseAdapter,
39
+ FusePriceFeed,
37
40
  GasRelayPaymasterFactory,
38
- GuaranteedRedemptionPolicy,
39
41
  IdleAdapter,
40
42
  IdlePriceFeed,
41
43
  IntegrationManager,
@@ -43,9 +45,9 @@ import {
43
45
  ManagementFee,
44
46
  MinAssetBalancesPostRedemptionPolicy,
45
47
  MinMaxInvestmentPolicy,
48
+ OlympusV2Adapter,
46
49
  OnlyRemoveDustExternalPositionPolicy,
47
50
  OnlyUntrackDustOrPricelessAssetsPolicy,
48
- ParaSwapV4Adapter,
49
51
  ParaSwapV5Adapter,
50
52
  PerformanceFee,
51
53
  PolicyManager,
@@ -54,14 +56,13 @@ import {
54
56
  ProtocolFeeReserveLib,
55
57
  ProtocolFeeTracker,
56
58
  RevertingPriceFeed,
57
- StakehoundEthPriceFeed,
58
59
  SynthetixAdapter,
59
- SynthetixPriceFeed,
60
60
  UniswapV2ExchangeAdapter,
61
61
  UniswapV2LiquidityAdapter,
62
62
  UniswapV2PoolPriceFeed,
63
63
  UniswapV3Adapter,
64
64
  UnpermissionedActionsWrapper,
65
+ UsdEthSimulatedAggregator,
65
66
  ValueInterpreter,
66
67
  VaultLib,
67
68
  YearnVaultV2Adapter,
@@ -93,6 +94,8 @@ export async function deployProtocolFixture() {
93
94
  // prettier-ignore
94
95
  const deployment = {
95
96
  aaveAdapter: new AaveAdapter(fixture['AaveAdapter'].address, deployer),
97
+ aaveDebtPositionLib: new AaveDebtPositionLib(fixture['AaveDebtPositionLib'].address, deployer),
98
+ aaveDebtPositionParser: new AaveDebtPositionParser(fixture['AaveDebtPositionParser'].address, deployer),
96
99
  aavePriceFeed: new AavePriceFeed(fixture['AavePriceFeed'].address, deployer),
97
100
  addressListRegistry: new AddressListRegistry(fixture['AddressListRegistry'].address, deployer),
98
101
  allowedAdapterIncomingAssetsPolicy: new AllowedAdapterIncomingAssetsPolicy(fixture['AllowedAdapterIncomingAssetsPolicy'].address, deployer),
@@ -101,18 +104,17 @@ export async function deployProtocolFixture() {
101
104
  allowedDepositRecipientsPolicy: new AllowedDepositRecipientsPolicy(fixture['AllowedDepositRecipientsPolicy'].address, deployer),
102
105
  allowedExternalPositionTypesPolicy: new AllowedExternalPositionTypesPolicy(fixture['AllowedExternalPositionTypesPolicy'].address, deployer),
103
106
  allowedSharesTransferRecipientsPolicy: new AllowedSharesTransferRecipientsPolicy(fixture['AllowedSharesTransferRecipientsPolicy'].address, deployer),
104
- assetFinalityResolver: new AssetFinalityResolver(fixture['AssetFinalityResolver'].address, deployer),
105
107
  compoundAdapter: new CompoundAdapter(fixture['CompoundAdapter'].address, deployer),
106
108
  compoundDebtPositionLib: new CompoundDebtPositionLib(fixture['CompoundDebtPositionLib'].address, deployer),
107
109
  compoundDebtPositionParser: new CompoundDebtPositionParser(fixture['CompoundDebtPositionParser'].address, deployer),
108
110
  compoundPriceFeed: new CompoundPriceFeed(fixture['CompoundPriceFeed'].address, deployer),
109
111
  comptrollerLib: new ComptrollerLib(fixture['ComptrollerLib'].address, deployer),
112
+ convexCurveLpStakingAdapter: new ConvexCurveLpStakingAdapter(fixture['ConvexCurveLpStakingAdapter'].address, deployer),
113
+ convexCurveLpStakingWrapperFactory: new ConvexCurveLpStakingWrapperFactory(fixture['ConvexCurveLpStakingWrapperFactory'].address, deployer),
114
+ convexCurveLpStakingWrapperPriceFeed: new ConvexCurveLpStakingWrapperPriceFeed(fixture['ConvexCurveLpStakingWrapperPriceFeed'].address, deployer),
110
115
  cumulativeSlippageTolerancePolicy: new CumulativeSlippageTolerancePolicy(fixture['CumulativeSlippageTolerancePolicy'].address, deployer),
111
116
  curveExchangeAdapter: new CurveExchangeAdapter(fixture['CurveExchangeAdapter'].address, deployer),
112
- curveLiquidityAaveAdapter: new CurveLiquidityAaveAdapter(fixture['CurveLiquidityAaveAdapter'].address, deployer),
113
- curveLiquidityEursAdapter: new CurveLiquidityEursAdapter(fixture['CurveLiquidityEursAdapter'].address, deployer),
114
- curveLiquiditySethAdapter: new CurveLiquiditySethAdapter(fixture['CurveLiquiditySethAdapter'].address, deployer),
115
- curveLiquidityStethAdapter: new CurveLiquidityStethAdapter(fixture['CurveLiquidityStethAdapter'].address, deployer),
117
+ curveLiquidityAdapter: new CurveLiquidityAdapter(fixture['CurveLiquidityAdapter'].address, deployer),
116
118
  curvePriceFeed: new CurvePriceFeed(fixture['CurvePriceFeed'].address, deployer),
117
119
  depositWrapper: new DepositWrapper(fixture['DepositWrapper'].address, deployer),
118
120
  dispatcher: new Dispatcher(fixture['Dispatcher'].address, deployer),
@@ -127,8 +129,9 @@ export async function deployProtocolFixture() {
127
129
  fundValueCalculator: new FundValueCalculator(fixture['FundValueCalculator'].address, deployer),
128
130
  fundValueCalculatorRouter: new FundValueCalculatorRouter(fixture['FundValueCalculatorRouter'].address, deployer),
129
131
  fundValueCalculatorUsdWrapper: new FundValueCalculatorUsdWrapper(fixture['FundValueCalculatorUsdWrapper'].address, deployer),
132
+ fuseAdapter: new FuseAdapter(fixture['FuseAdapter'].address, deployer),
133
+ fusePriceFeed: new FusePriceFeed(fixture['FusePriceFeed'].address, deployer),
130
134
  gasRelayPaymasterFactory: new GasRelayPaymasterFactory(fixture['GasRelayPaymasterFactory'].address, deployer),
131
- guaranteedRedemptionPolicy: new GuaranteedRedemptionPolicy(fixture['GuaranteedRedemptionPolicy'].address, deployer),
132
135
  idleAdapter: new IdleAdapter(fixture['IdleAdapter'].address, deployer),
133
136
  idlePriceFeed: new IdlePriceFeed(fixture['IdlePriceFeed'].address, deployer),
134
137
  integrationManager: new IntegrationManager(fixture['IntegrationManager'].address, deployer),
@@ -136,9 +139,9 @@ export async function deployProtocolFixture() {
136
139
  managementFee: new ManagementFee(fixture['ManagementFee'].address, deployer),
137
140
  minAssetBalancesPostRedemptionPolicy: new MinAssetBalancesPostRedemptionPolicy(fixture['MinAssetBalancesPostRedemptionPolicy'].address, deployer),
138
141
  minMaxInvestmentPolicy: new MinMaxInvestmentPolicy(fixture['MinMaxInvestmentPolicy'].address, deployer),
142
+ olympusV2Adapter: new OlympusV2Adapter(fixture['OlympusV2Adapter'].address, deployer),
139
143
  onlyRemoveDustExternalPositionPolicy: new OnlyRemoveDustExternalPositionPolicy(fixture['OnlyRemoveDustExternalPositionPolicy'].address, deployer),
140
144
  onlyUntrackDustOrPricelessAssetsPolicy: new OnlyUntrackDustOrPricelessAssetsPolicy(fixture['OnlyUntrackDustOrPricelessAssetsPolicy'].address, deployer),
141
- paraSwapV4Adapter: new ParaSwapV4Adapter(fixture['ParaSwapV4Adapter'].address, deployer),
142
145
  paraSwapV5Adapter: new ParaSwapV5Adapter(fixture['ParaSwapV5Adapter'].address, deployer),
143
146
  performanceFee: new PerformanceFee(fixture['PerformanceFee'].address, deployer),
144
147
  policyManager: new PolicyManager(fixture['PolicyManager'].address, deployer),
@@ -148,14 +151,13 @@ export async function deployProtocolFixture() {
148
151
  protocolFeeReserveProxy: new ProtocolFeeReserveLib(fixture['ProtocolFeeReserveProxy'].address, deployer),
149
152
  protocolFeeTracker: new ProtocolFeeTracker(fixture['ProtocolFeeTracker'].address, deployer),
150
153
  revertingPriceFeed: new RevertingPriceFeed(fixture['RevertingPriceFeed'].address, deployer),
151
- stakehoundEthPriceFeed: new StakehoundEthPriceFeed(fixture['StakehoundEthPriceFeed'].address, deployer),
152
154
  synthetixAdapter: new SynthetixAdapter(fixture['SynthetixAdapter'].address, deployer),
153
- synthetixPriceFeed: new SynthetixPriceFeed(fixture['SynthetixPriceFeed'].address, deployer),
154
155
  uniswapV2ExchangeAdapter: new UniswapV2ExchangeAdapter(fixture['UniswapV2ExchangeAdapter'].address, deployer),
155
156
  uniswapV2LiquidityAdapter: new UniswapV2LiquidityAdapter(fixture['UniswapV2LiquidityAdapter'].address, deployer),
156
157
  uniswapV2PoolPriceFeed: new UniswapV2PoolPriceFeed(fixture['UniswapV2PoolPriceFeed'].address, deployer),
157
158
  uniswapV3Adapter: new UniswapV3Adapter(fixture['UniswapV3Adapter'].address, deployer),
158
159
  unpermissionedActionsWrapper: new UnpermissionedActionsWrapper(fixture['UnpermissionedActionsWrapper'].address, deployer),
160
+ usdEthSimulatedAggregator: new UsdEthSimulatedAggregator(fixture['UsdEthSimulatedAggregator'].address, deployer),
159
161
  valueInterpreter: new ValueInterpreter(fixture['ValueInterpreter'].address, deployer),
160
162
  vaultLib: new VaultLib(fixture['VaultLib'].address, deployer),
161
163
  yearnVaultV2Adapter: new YearnVaultV2Adapter(fixture['YearnVaultV2Adapter'].address, deployer),
@@ -178,7 +180,13 @@ export type ProtocolDeployment = Resolve<typeof deployProtocolFixture>;
178
180
  import type { ChainlinkRateAsset } from '@enzymefinance/protocol';
179
181
 
180
182
  export interface DeploymentConfig {
183
+ feeBps: number;
181
184
  feeToken: string;
185
+ feeTokenBurn: {
186
+ burnFromVault: boolean;
187
+ sendToProtocolFeeReserve: boolean;
188
+ externalBurnerAddress: string;
189
+ };
182
190
  weth: string;
183
191
  wrappedNativeAsset: string;
184
192
  primitives: Record<string, string>;
@@ -194,19 +202,23 @@ export interface DeploymentConfig {
194
202
  synthetix: {
195
203
  snx: string;
196
204
  susd: string;
197
- synths: Record<string, string>;
198
- addressResolver: string;
199
205
  delegateApprovals: string;
200
206
  originator: string;
201
207
  redeemer: string;
202
208
  trackingCode: string;
203
209
  };
210
+ convex: {
211
+ booster: string;
212
+ crvToken: string;
213
+ cvxToken: string;
214
+ };
204
215
  curve: {
205
216
  addressProvider: string;
206
217
  minter: string;
207
218
  pools: Record<string, { pool: string; lpToken: string; liquidityGaugeToken: string; invariantProxyAsset: string }>;
208
219
  };
209
220
  aave: {
221
+ incentivesController: string;
210
222
  lendingPoolAddressProvider: string;
211
223
  protocolDataProvider: string;
212
224
  atokens: Record<string, [string, string]>;
@@ -216,6 +228,10 @@ export interface DeploymentConfig {
216
228
  comptroller: string;
217
229
  ctokens: Record<string, string>;
218
230
  };
231
+ fuse: {
232
+ fetherTokens: Record<string, string>;
233
+ ftokens: Record<string, string>;
234
+ };
219
235
  idle: {
220
236
  bestYieldIdleDai: string;
221
237
  bestYieldIdleUsdc: string;
@@ -230,9 +246,8 @@ export interface DeploymentConfig {
230
246
  lido: {
231
247
  steth: string;
232
248
  };
233
- paraSwapV4: {
234
- augustusSwapper: string;
235
- tokenTransferProxy: string;
249
+ olympusV2: {
250
+ stakingContract: string;
236
251
  };
237
252
  paraSwapV5: {
238
253
  augustusSwapper: string;
@@ -241,9 +256,7 @@ export interface DeploymentConfig {
241
256
  poolTogetherV4: {
242
257
  ptTokens: Record<string, [string, string]>;
243
258
  };
244
- stakehound: {
245
- steth: string;
246
- };
259
+ positionsLimit: number;
247
260
  unsupportedAssets: Record<string, string>;
248
261
  uniswap: {
249
262
  factory: string;
@@ -264,9 +277,4 @@ export interface DeploymentConfig {
264
277
  exchange: string;
265
278
  allowedMakers: string[];
266
279
  };
267
- policies: {
268
- guaranteedRedemption: {
269
- redemptionWindowBuffer: number;
270
- };
271
- };
272
280
  }
@@ -17,7 +17,7 @@ export async function addNewAssetsToFund({
17
17
  assets: StandardToken[];
18
18
  amounts?: BigNumberish[];
19
19
  }) {
20
- // First, add tracked assets while their balances are 0
20
+ // First, add tracked assets
21
21
  const receipt = addTrackedAssetsToVault({
22
22
  assets,
23
23
  comptrollerProxy,
@@ -1,9 +1,4 @@
1
- import type {
2
- AssetFinalityResolver,
3
- Dispatcher,
4
- GasRelayPaymasterFactory,
5
- ValueInterpreter,
6
- } from '@enzymefinance/protocol';
1
+ import type { Dispatcher, GasRelayPaymasterFactory, ValueInterpreter } from '@enzymefinance/protocol';
7
2
  import {
8
3
  ComptrollerLib,
9
4
  ExternalPositionManager,
@@ -20,7 +15,6 @@ import type { Signer } from 'ethers';
20
15
  // unless overrides are passed-in
21
16
  export async function createFundDeployer({
22
17
  deployer,
23
- assetFinalityResolver,
24
18
  externalPositionManager,
25
19
  dispatcher,
26
20
  gasRelayPaymasterFactory,
@@ -30,7 +24,6 @@ export async function createFundDeployer({
30
24
  setReleaseLive = true,
31
25
  }: {
32
26
  deployer: Signer;
33
- assetFinalityResolver: AssetFinalityResolver;
34
27
  externalPositionManager: ExternalPositionManager;
35
28
  dispatcher: Dispatcher;
36
29
  feeManager: FeeManager;
@@ -76,7 +69,6 @@ export async function createFundDeployer({
76
69
  nextFeeManager,
77
70
  nextIntegrationManager,
78
71
  nextPolicyManager,
79
- assetFinalityResolver,
80
72
  gasRelayPaymasterFactory,
81
73
  mlnToken,
82
74
  wethToken,
@@ -94,7 +86,9 @@ export async function createFundDeployer({
94
86
  await vaultLib.getProtocolFeeReserve(),
95
87
  nextProtocolFeeTracker,
96
88
  await vaultLib.getMlnToken(),
89
+ await vaultLib.getMlnBurner(),
97
90
  await vaultLib.getWethToken(),
91
+ await vaultLib.getPositionsLimit(),
98
92
  );
99
93
  await nextFundDeployer.setVaultLib(nextVaultLib);
100
94
 
@@ -0,0 +1,179 @@
1
+ import type { AddressLike } from '@enzymefinance/ethers';
2
+ import type { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import type { ComptrollerLib, ExternalPositionManager } from '@enzymefinance/protocol';
4
+ import {
5
+ AaveDebtPositionActionId,
6
+ aaveDebtPositionAddCollateralArgs,
7
+ aaveDebtPositionBorrowArgs,
8
+ aaveDebtPositionClaimRewardsArgs,
9
+ aaveDebtPositionRemoveCollateralArgs,
10
+ aaveDebtPositionRepayBorrowArgs,
11
+ ExternalPositionType,
12
+ } from '@enzymefinance/protocol';
13
+ import type { BigNumberish } from 'ethers';
14
+
15
+ import { callOnExternalPosition, createExternalPosition } from './actions';
16
+
17
+ export async function aaveDebtPositionAddCollateral({
18
+ comptrollerProxy,
19
+ externalPositionManager,
20
+ signer,
21
+ aTokens,
22
+ amounts,
23
+ externalPositionProxy,
24
+ }: {
25
+ comptrollerProxy: ComptrollerLib;
26
+ externalPositionManager: ExternalPositionManager;
27
+ signer: SignerWithAddress;
28
+ aTokens: AddressLike[];
29
+ amounts: BigNumberish[];
30
+ externalPositionProxy: AddressLike;
31
+ }) {
32
+ const actionArgs = aaveDebtPositionAddCollateralArgs({
33
+ aTokens,
34
+ amounts,
35
+ });
36
+
37
+ return callOnExternalPosition({
38
+ actionArgs,
39
+ actionId: AaveDebtPositionActionId.AddCollateralAssets,
40
+ comptrollerProxy,
41
+ externalPositionManager,
42
+ externalPositionProxy,
43
+ signer,
44
+ });
45
+ }
46
+
47
+ export async function aaveDebtPositionBorrow({
48
+ comptrollerProxy,
49
+ externalPositionManager,
50
+ signer,
51
+ tokens,
52
+ amounts,
53
+ externalPositionProxy,
54
+ }: {
55
+ comptrollerProxy: ComptrollerLib;
56
+ externalPositionManager: ExternalPositionManager;
57
+ signer: SignerWithAddress;
58
+ tokens: AddressLike[];
59
+ amounts: BigNumberish[];
60
+ externalPositionProxy: AddressLike;
61
+ }) {
62
+ const actionArgs = aaveDebtPositionBorrowArgs({
63
+ amounts,
64
+ tokens,
65
+ });
66
+
67
+ return callOnExternalPosition({
68
+ actionArgs,
69
+ actionId: AaveDebtPositionActionId.BorrowAsset,
70
+ comptrollerProxy,
71
+ externalPositionManager,
72
+ externalPositionProxy,
73
+ signer,
74
+ });
75
+ }
76
+
77
+ export async function aaveDebtPositionClaimRewards({
78
+ comptrollerProxy,
79
+ externalPositionManager,
80
+ signer,
81
+ assets,
82
+ externalPositionProxy,
83
+ }: {
84
+ comptrollerProxy: ComptrollerLib;
85
+ externalPositionManager: ExternalPositionManager;
86
+ signer: SignerWithAddress;
87
+ assets: AddressLike[];
88
+ externalPositionProxy: AddressLike;
89
+ }) {
90
+ const actionArgs = aaveDebtPositionClaimRewardsArgs({
91
+ assets,
92
+ });
93
+
94
+ return callOnExternalPosition({
95
+ actionArgs,
96
+ actionId: AaveDebtPositionActionId.ClaimRewards,
97
+ comptrollerProxy,
98
+ externalPositionManager,
99
+ externalPositionProxy,
100
+ signer,
101
+ });
102
+ }
103
+
104
+ export async function aaveDebtPositionRemoveCollateral({
105
+ comptrollerProxy,
106
+ externalPositionManager,
107
+ signer,
108
+ aTokens,
109
+ amounts,
110
+ externalPositionProxy,
111
+ }: {
112
+ comptrollerProxy: ComptrollerLib;
113
+ externalPositionManager: ExternalPositionManager;
114
+ signer: SignerWithAddress;
115
+ aTokens: AddressLike[];
116
+ amounts: BigNumberish[];
117
+ externalPositionProxy: AddressLike;
118
+ }) {
119
+ const actionArgs = aaveDebtPositionRemoveCollateralArgs({
120
+ aTokens,
121
+ amounts,
122
+ });
123
+
124
+ return callOnExternalPosition({
125
+ actionArgs,
126
+ actionId: AaveDebtPositionActionId.RemoveCollateralAssets,
127
+ comptrollerProxy,
128
+ externalPositionManager,
129
+ externalPositionProxy,
130
+ signer,
131
+ });
132
+ }
133
+
134
+ export async function aaveDebtPositionRepayBorrow({
135
+ comptrollerProxy,
136
+ externalPositionManager,
137
+ signer,
138
+ tokens,
139
+ amounts,
140
+ externalPositionProxy,
141
+ }: {
142
+ comptrollerProxy: ComptrollerLib;
143
+ externalPositionManager: ExternalPositionManager;
144
+ signer: SignerWithAddress;
145
+ tokens: AddressLike[];
146
+ amounts: BigNumberish[];
147
+ externalPositionProxy: AddressLike;
148
+ }) {
149
+ const actionArgs = aaveDebtPositionRepayBorrowArgs({
150
+ amounts,
151
+ tokens,
152
+ });
153
+
154
+ return callOnExternalPosition({
155
+ actionArgs,
156
+ actionId: AaveDebtPositionActionId.RepayBorrowedAssets,
157
+ comptrollerProxy,
158
+ externalPositionManager,
159
+ externalPositionProxy,
160
+ signer,
161
+ });
162
+ }
163
+
164
+ export async function createAaveDebtPosition({
165
+ signer,
166
+ comptrollerProxy,
167
+ externalPositionManager,
168
+ }: {
169
+ signer: SignerWithAddress;
170
+ comptrollerProxy: ComptrollerLib;
171
+ externalPositionManager: ExternalPositionManager;
172
+ }) {
173
+ return createExternalPosition({
174
+ comptrollerProxy,
175
+ externalPositionManager,
176
+ externalPositionTypeId: ExternalPositionType.AaveDebtPosition,
177
+ signer,
178
+ });
179
+ }
@@ -44,19 +44,24 @@ 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'));
@@ -1,4 +1,5 @@
1
1
  export * from './actions';
2
2
  export * from './compound';
3
3
  export * from './mocks';
4
+ export * from './aave-debt';
4
5
  export * from './uniswap-v3-liquidity';
@@ -2,8 +2,6 @@ import type { AddressLike } from '@enzymefinance/ethers';
2
2
  import type { SignerWithAddress } from '@enzymefinance/hardhat';
3
3
  import type { ComptrollerLib, ExternalPositionFactory, ExternalPositionManager } from '@enzymefinance/protocol';
4
4
  import {
5
- encodeArgs,
6
- ExternalPositionManagerActionId,
7
5
  mockGenericExternalPositionActionArgs,
8
6
  MockGenericExternalPositionActionId,
9
7
  MockGenericExternalPositionLib,
@@ -12,7 +10,7 @@ import {
12
10
  } from '@enzymefinance/protocol';
13
11
  import type { BigNumberish } from 'ethers';
14
12
 
15
- import { callOnExternalPosition } from './actions';
13
+ import { callOnExternalPosition, createExternalPosition } from './actions';
16
14
 
17
15
  export async function createMockExternalPosition({
18
16
  comptrollerProxy,
@@ -54,13 +52,12 @@ export async function createMockExternalPosition({
54
52
  [mockExternalPositionParser],
55
53
  );
56
54
 
57
- const receipt = await comptrollerProxy
58
- .connect(fundOwner)
59
- .callOnExtension(
60
- externalPositionManager,
61
- ExternalPositionManagerActionId.CreateExternalPosition,
62
- encodeArgs(['uint256', 'bytes'], [typeId, '0x']),
63
- );
55
+ const receipt = await createExternalPosition({
56
+ comptrollerProxy,
57
+ externalPositionManager,
58
+ externalPositionTypeId: typeId,
59
+ signer: fundOwner,
60
+ });
64
61
 
65
62
  const externalPositionProxy = (await vaultProxy.getActiveExternalPositions())[0];
66
63
 
@@ -4,20 +4,19 @@ import type { SignerWithAddress } from '@enzymefinance/hardhat';
4
4
  import type { ComptrollerLib, ExternalPositionManager } from '@enzymefinance/protocol';
5
5
  import {
6
6
  callOnExternalPositionArgs,
7
- encodeArgs,
8
7
  ExternalPositionManagerActionId,
9
8
  ExternalPositionType,
10
9
  UniswapV3LiquidityPositionActionId,
11
10
  uniswapV3LiquidityPositionAddLiquidityArgs,
12
11
  uniswapV3LiquidityPositionCollectArgs,
13
- uniswapV3LiquidityPositionInitArgs,
14
12
  UniswapV3LiquidityPositionLib,
15
13
  uniswapV3LiquidityPositionMintArgs,
16
14
  uniswapV3LiquidityPositionPurgeArgs,
17
15
  uniswapV3LiquidityPositionRemoveLiquidityArgs,
18
- VaultLib,
19
16
  } from '@enzymefinance/protocol';
20
- import type { BigNumber, BigNumberish } from 'ethers';
17
+ import type { BigNumber, BigNumberish, BytesLike } from 'ethers';
18
+
19
+ import { createExternalPosition } from './actions';
21
20
 
22
21
  export enum UniswapV3FeeAmount {
23
22
  LOW = 500,
@@ -58,33 +57,22 @@ export async function createUniswapV3LiquidityPosition({
58
57
  signer,
59
58
  comptrollerProxy,
60
59
  externalPositionManager,
61
- token0,
62
- token1,
60
+ callOnExternalPositionData = '0x',
63
61
  }: {
64
62
  signer: SignerWithAddress;
65
63
  comptrollerProxy: ComptrollerLib;
66
64
  externalPositionManager: ExternalPositionManager;
67
- token0: AddressLike;
68
- token1: AddressLike;
65
+ callOnExternalPositionData?: BytesLike;
69
66
  }) {
70
- const initArgs = uniswapV3LiquidityPositionInitArgs({
71
- token0,
72
- token1,
67
+ const { externalPositionProxy: externalPositionProxyContract, receipt } = await createExternalPosition({
68
+ callOnExternalPositionData,
69
+ comptrollerProxy,
70
+ externalPositionManager,
71
+ externalPositionTypeId: ExternalPositionType.UniswapV3LiquidityPosition,
72
+ signer,
73
73
  });
74
74
 
75
- const receipt = await comptrollerProxy
76
- .connect(signer)
77
- .callOnExtension(
78
- externalPositionManager,
79
- ExternalPositionManagerActionId.CreateExternalPosition,
80
- encodeArgs(['uint256', 'bytes'], [ExternalPositionType.UniswapV3LiquidityPosition, initArgs]),
81
- );
82
-
83
- const vaultProxy = new VaultLib(await comptrollerProxy.getVaultProxy(), signer);
84
- const externalPositions = await vaultProxy.getActiveExternalPositions.call();
85
- const externalPositionProxyAddress = externalPositions[externalPositions.length - 1];
86
-
87
- return { externalPositionProxyAddress, receipt };
75
+ return { externalPositionProxyAddress: externalPositionProxyContract.address, receipt };
88
76
  }
89
77
 
90
78
  export async function uniswapV3LiquidityPositionAddLiquidity({
@@ -160,6 +148,8 @@ export async function uniswapV3LiquidityPositionMint({
160
148
  comptrollerProxy,
161
149
  externalPositionManager,
162
150
  externalPositionProxy,
151
+ token0,
152
+ token1,
163
153
  fee,
164
154
  tickLower,
165
155
  tickUpper,
@@ -172,6 +162,8 @@ export async function uniswapV3LiquidityPositionMint({
172
162
  comptrollerProxy: ComptrollerLib;
173
163
  externalPositionManager: ExternalPositionManager;
174
164
  externalPositionProxy: AddressLike;
165
+ token0: AddressLike;
166
+ token1: AddressLike;
175
167
  fee: BigNumberish;
176
168
  tickLower: BigNumberish;
177
169
  tickUpper: BigNumberish;
@@ -188,6 +180,8 @@ export async function uniswapV3LiquidityPositionMint({
188
180
  fee,
189
181
  tickLower,
190
182
  tickUpper,
183
+ token0,
184
+ token1,
191
185
  });
192
186
 
193
187
  const callArgs = callOnExternalPositionArgs({