@enzymefinance/testutils 3.0.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 (79) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/declarations/src/assertions.d.ts +4 -0
  3. package/dist/declarations/src/deployment.d.ts +81 -0
  4. package/dist/declarations/src/helpers.d.ts +2 -0
  5. package/dist/declarations/src/index.d.ts +5 -0
  6. package/dist/declarations/src/scaffolding/assets.d.ts +12 -0
  7. package/dist/declarations/src/scaffolding/chainlink.d.ts +3 -0
  8. package/dist/declarations/src/scaffolding/common.d.ts +6 -0
  9. package/dist/declarations/src/scaffolding/core.d.ts +19 -0
  10. package/dist/declarations/src/scaffolding/extensions/common.d.ts +11 -0
  11. package/dist/declarations/src/scaffolding/extensions/fees.d.ts +14 -0
  12. package/dist/declarations/src/scaffolding/extensions/index.d.ts +4 -0
  13. package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +19 -0
  14. package/dist/declarations/src/scaffolding/extensions/integrations/alpha.d.ts +36 -0
  15. package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +27 -0
  16. package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +331 -0
  17. package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +57 -0
  18. package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +14 -0
  19. package/dist/declarations/src/scaffolding/extensions/integrations/kyber.d.ts +23 -0
  20. package/dist/declarations/src/scaffolding/extensions/integrations/mock.d.ts +32 -0
  21. package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV4.d.ts +22 -0
  22. package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +25 -0
  23. package/dist/declarations/src/scaffolding/extensions/integrations/trackedAssets.d.ts +17 -0
  24. package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV2.d.ts +46 -0
  25. package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV3.d.ts +15 -0
  26. package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +22 -0
  27. package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +12 -0
  28. package/dist/declarations/src/scaffolding/extensions/policies.d.ts +15 -0
  29. package/dist/declarations/src/scaffolding/index.d.ts +9 -0
  30. package/dist/declarations/src/scaffolding/peripheral/index.d.ts +1 -0
  31. package/dist/declarations/src/scaffolding/peripheral/sharesRequestors.d.ts +19 -0
  32. package/dist/declarations/src/scaffolding/setup.d.ts +46 -0
  33. package/dist/declarations/src/scaffolding/shares.d.ts +30 -0
  34. package/dist/declarations/src/scaffolding/vaultCalls.d.ts +17 -0
  35. package/dist/declarations/src/whales.d.ts +43 -0
  36. package/dist/enzymefinance-testutils.browser.cjs.js +3160 -0
  37. package/dist/enzymefinance-testutils.browser.esm.js +3045 -0
  38. package/dist/enzymefinance-testutils.cjs.d.ts +1 -0
  39. package/dist/enzymefinance-testutils.cjs.dev.js +3160 -0
  40. package/dist/enzymefinance-testutils.cjs.js +7 -0
  41. package/dist/enzymefinance-testutils.cjs.prod.js +3160 -0
  42. package/dist/enzymefinance-testutils.esm.js +3045 -0
  43. package/package.json +18 -0
  44. package/src/assertions.ts +20 -0
  45. package/src/deployment.ts +169 -0
  46. package/src/helpers.ts +6 -0
  47. package/src/index.ts +5 -0
  48. package/src/scaffolding/assets.ts +39 -0
  49. package/src/scaffolding/chainlink.ts +8 -0
  50. package/src/scaffolding/common.ts +6 -0
  51. package/src/scaffolding/core.ts +77 -0
  52. package/src/scaffolding/extensions/common.ts +30 -0
  53. package/src/scaffolding/extensions/fees.ts +87 -0
  54. package/src/scaffolding/extensions/index.ts +4 -0
  55. package/src/scaffolding/extensions/integrations/aave.ts +80 -0
  56. package/src/scaffolding/extensions/integrations/alpha.ts +119 -0
  57. package/src/scaffolding/extensions/integrations/compound.ts +97 -0
  58. package/src/scaffolding/extensions/integrations/curve.ts +1207 -0
  59. package/src/scaffolding/extensions/integrations/idle.ts +215 -0
  60. package/src/scaffolding/extensions/integrations/index.ts +14 -0
  61. package/src/scaffolding/extensions/integrations/kyber.ts +69 -0
  62. package/src/scaffolding/extensions/integrations/mock.ts +118 -0
  63. package/src/scaffolding/extensions/integrations/paraSwapV4.ts +65 -0
  64. package/src/scaffolding/extensions/integrations/synthetix.ts +97 -0
  65. package/src/scaffolding/extensions/integrations/trackedAssets.ts +66 -0
  66. package/src/scaffolding/extensions/integrations/uniswapV2.ts +171 -0
  67. package/src/scaffolding/extensions/integrations/uniswapV3.ts +56 -0
  68. package/src/scaffolding/extensions/integrations/yearn.ts +81 -0
  69. package/src/scaffolding/extensions/integrations/zeroExV2.ts +45 -0
  70. package/src/scaffolding/extensions/policies.ts +85 -0
  71. package/src/scaffolding/index.ts +9 -0
  72. package/src/scaffolding/peripheral/index.ts +1 -0
  73. package/src/scaffolding/peripheral/sharesRequestors.ts +53 -0
  74. package/src/scaffolding/setup.ts +135 -0
  75. package/src/scaffolding/shares.ts +63 -0
  76. package/src/scaffolding/vaultCalls.ts +58 -0
  77. package/src/types.d.ts +1 -0
  78. package/src/whales.ts +63 -0
  79. package/tsconfig.json +4 -0
@@ -0,0 +1,97 @@
1
+ import { AddressLike } from '@enzymefinance/ethers';
2
+ import {
3
+ callOnIntegrationArgs,
4
+ ComptrollerLib,
5
+ encodeArgs,
6
+ IntegrationManager,
7
+ IntegrationManagerActionId,
8
+ ISynthetixAddressResolver,
9
+ StandardToken,
10
+ SynthetixAdapter,
11
+ synthetixAssignExchangeDelegateSelector,
12
+ synthetixTakeOrderArgs,
13
+ takeOrderSelector,
14
+ VaultLib,
15
+ } from '@enzymefinance/protocol';
16
+ import { BigNumberish, Signer, utils } from 'ethers';
17
+
18
+ export async function synthetixAssignExchangeDelegate({
19
+ comptrollerProxy,
20
+ addressResolver,
21
+ fundOwner,
22
+ delegate,
23
+ }: {
24
+ comptrollerProxy: ComptrollerLib;
25
+ addressResolver: ISynthetixAddressResolver;
26
+ fundOwner: Signer;
27
+ delegate: AddressLike;
28
+ }) {
29
+ const delegateApprovals = await synthetixResolveAddress({
30
+ addressResolver,
31
+ name: 'DelegateApprovals',
32
+ });
33
+
34
+ await comptrollerProxy
35
+ .connect(fundOwner)
36
+ .vaultCallOnContract(
37
+ delegateApprovals,
38
+ synthetixAssignExchangeDelegateSelector,
39
+ encodeArgs(['address'], [delegate]),
40
+ );
41
+ }
42
+
43
+ export async function synthetixResolveAddress({
44
+ addressResolver,
45
+ name,
46
+ }: {
47
+ addressResolver: ISynthetixAddressResolver;
48
+ name: string;
49
+ }) {
50
+ return addressResolver.requireAndGetAddress(utils.formatBytes32String(name), `Missing ${name}`);
51
+ }
52
+
53
+ export async function synthetixTakeOrder({
54
+ comptrollerProxy,
55
+ vaultProxy,
56
+ integrationManager,
57
+ fundOwner,
58
+ synthetixAdapter,
59
+ outgoingAsset,
60
+ outgoingAssetAmount = utils.parseEther('1'),
61
+ incomingAsset,
62
+ minIncomingAssetAmount = utils.parseEther('1'),
63
+ seedFund = false,
64
+ }: {
65
+ comptrollerProxy: ComptrollerLib;
66
+ vaultProxy: VaultLib;
67
+ integrationManager: IntegrationManager;
68
+ fundOwner: Signer;
69
+ synthetixAdapter: SynthetixAdapter;
70
+ outgoingAsset: StandardToken;
71
+ outgoingAssetAmount?: BigNumberish;
72
+ incomingAsset: StandardToken;
73
+ minIncomingAssetAmount?: BigNumberish;
74
+ seedFund?: boolean;
75
+ }) {
76
+ if (seedFund) {
77
+ // Seed the VaultProxy with enough outgoingAsset for the tx
78
+ await outgoingAsset.transfer(vaultProxy, outgoingAssetAmount);
79
+ }
80
+
81
+ const takeOrderArgs = synthetixTakeOrderArgs({
82
+ incomingAsset: incomingAsset,
83
+ minIncomingAssetAmount: minIncomingAssetAmount,
84
+ outgoingAsset: outgoingAsset,
85
+ outgoingAssetAmount: outgoingAssetAmount,
86
+ });
87
+
88
+ const callArgs = await callOnIntegrationArgs({
89
+ adapter: synthetixAdapter,
90
+ selector: takeOrderSelector,
91
+ encodedCallArgs: takeOrderArgs,
92
+ });
93
+
94
+ return comptrollerProxy
95
+ .connect(fundOwner)
96
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
97
+ }
@@ -0,0 +1,66 @@
1
+ import { AddressLike } from '@enzymefinance/ethers';
2
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import {
4
+ addTrackedAssetsArgs,
5
+ addTrackedAssetsSelector,
6
+ callOnIntegrationArgs,
7
+ ComptrollerLib,
8
+ IntegrationManager,
9
+ IntegrationManagerActionId,
10
+ removeTrackedAssetsArgs,
11
+ removeTrackedAssetsSelector,
12
+ TrackedAssetsAdapter,
13
+ } from '@enzymefinance/protocol';
14
+
15
+ export async function addTrackedAssets({
16
+ comptrollerProxy,
17
+ integrationManager,
18
+ fundOwner,
19
+ trackedAssetsAdapter,
20
+ incomingAssets,
21
+ }: {
22
+ comptrollerProxy: ComptrollerLib;
23
+ integrationManager: IntegrationManager;
24
+ fundOwner: SignerWithAddress;
25
+ trackedAssetsAdapter: TrackedAssetsAdapter;
26
+ incomingAssets: AddressLike[];
27
+ }) {
28
+ const args = addTrackedAssetsArgs(incomingAssets);
29
+ const callArgs = callOnIntegrationArgs({
30
+ adapter: trackedAssetsAdapter,
31
+ selector: addTrackedAssetsSelector,
32
+ encodedCallArgs: args,
33
+ });
34
+
35
+ const addTrackedAssetsTx = comptrollerProxy
36
+ .connect(fundOwner)
37
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
38
+
39
+ await expect(addTrackedAssetsTx).resolves.toBeReceipt();
40
+
41
+ return addTrackedAssetsTx;
42
+ }
43
+
44
+ export async function removeTrackedAssets({
45
+ comptrollerProxy,
46
+ integrationManager,
47
+ fundOwner,
48
+ trackedAssetsAdapter,
49
+ spendAssets,
50
+ }: {
51
+ comptrollerProxy: ComptrollerLib;
52
+ integrationManager: IntegrationManager;
53
+ fundOwner: SignerWithAddress;
54
+ trackedAssetsAdapter: TrackedAssetsAdapter;
55
+ spendAssets: AddressLike[];
56
+ }) {
57
+ const callArgs = callOnIntegrationArgs({
58
+ adapter: trackedAssetsAdapter,
59
+ selector: removeTrackedAssetsSelector,
60
+ encodedCallArgs: removeTrackedAssetsArgs(spendAssets),
61
+ });
62
+
63
+ return comptrollerProxy
64
+ .connect(fundOwner)
65
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
66
+ }
@@ -0,0 +1,171 @@
1
+ import { AddressLike, Call, Contract, contract, Send } from '@enzymefinance/ethers';
2
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import {
4
+ callOnIntegrationArgs,
5
+ ComptrollerLib,
6
+ IntegrationManager,
7
+ IntegrationManagerActionId,
8
+ lendSelector,
9
+ redeemSelector,
10
+ StandardToken,
11
+ takeOrderSelector,
12
+ UniswapV2Adapter,
13
+ uniswapV2LendArgs,
14
+ uniswapV2RedeemArgs,
15
+ uniswapV2TakeOrderArgs,
16
+ VaultLib,
17
+ } from '@enzymefinance/protocol';
18
+ import { BigNumberish } from 'ethers';
19
+
20
+ export interface UniswapV2Factory extends Contract<UniswapV2Factory> {
21
+ createPair: Send<(_token0: AddressLike, _token1: AddressLike) => AddressLike>;
22
+ getPair: Call<(_token0: AddressLike, _token1: AddressLike) => AddressLike>;
23
+ }
24
+
25
+ export const UniswapV2Factory = contract<UniswapV2Factory>()`
26
+ function createPair(address,address) returns (address)
27
+ function getPair(address,address) view returns (address)
28
+ `;
29
+
30
+ export async function uniswapV2Lend({
31
+ comptrollerProxy,
32
+ vaultProxy,
33
+ integrationManager,
34
+ fundOwner,
35
+ uniswapV2Adapter,
36
+ tokenA,
37
+ tokenB,
38
+ amountADesired,
39
+ amountBDesired,
40
+ amountAMin,
41
+ amountBMin,
42
+ minPoolTokenAmount,
43
+ seedFund = false,
44
+ }: {
45
+ comptrollerProxy: ComptrollerLib;
46
+ vaultProxy: VaultLib;
47
+ integrationManager: IntegrationManager;
48
+ fundOwner: SignerWithAddress;
49
+ uniswapV2Adapter: UniswapV2Adapter;
50
+ tokenA: StandardToken;
51
+ tokenB: StandardToken;
52
+ amountADesired: BigNumberish;
53
+ amountBDesired: BigNumberish;
54
+ amountAMin: BigNumberish;
55
+ amountBMin: BigNumberish;
56
+ minPoolTokenAmount: BigNumberish;
57
+ seedFund?: boolean;
58
+ }) {
59
+ if (seedFund) {
60
+ // Seed the VaultProxy with enough tokenA and tokenB for the tx
61
+ await tokenA.transfer(vaultProxy, amountADesired);
62
+ await tokenB.transfer(vaultProxy, amountBDesired);
63
+ }
64
+
65
+ const lendArgs = uniswapV2LendArgs({
66
+ tokenA,
67
+ tokenB,
68
+ amountADesired,
69
+ amountBDesired,
70
+ amountAMin,
71
+ amountBMin,
72
+ minPoolTokenAmount,
73
+ });
74
+
75
+ const callArgs = callOnIntegrationArgs({
76
+ adapter: uniswapV2Adapter,
77
+ selector: lendSelector,
78
+ encodedCallArgs: lendArgs,
79
+ });
80
+
81
+ const lendTx = comptrollerProxy
82
+ .connect(fundOwner)
83
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
84
+ await expect(lendTx).resolves.toBeReceipt();
85
+
86
+ return lendTx;
87
+ }
88
+
89
+ export async function uniswapV2Redeem({
90
+ comptrollerProxy,
91
+ integrationManager,
92
+ fundOwner,
93
+ uniswapV2Adapter,
94
+ poolTokenAmount,
95
+ tokenA,
96
+ tokenB,
97
+ amountAMin,
98
+ amountBMin,
99
+ }: {
100
+ comptrollerProxy: ComptrollerLib;
101
+ integrationManager: IntegrationManager;
102
+ fundOwner: SignerWithAddress;
103
+ uniswapV2Adapter: UniswapV2Adapter;
104
+ poolTokenAmount: BigNumberish;
105
+ tokenA: AddressLike;
106
+ tokenB: AddressLike;
107
+ amountAMin: BigNumberish;
108
+ amountBMin: BigNumberish;
109
+ }) {
110
+ const redeemArgs = uniswapV2RedeemArgs({
111
+ poolTokenAmount,
112
+ tokenA,
113
+ tokenB,
114
+ amountAMin,
115
+ amountBMin,
116
+ });
117
+ const callArgs = callOnIntegrationArgs({
118
+ adapter: uniswapV2Adapter,
119
+ selector: redeemSelector,
120
+ encodedCallArgs: redeemArgs,
121
+ });
122
+
123
+ const redeemTx = comptrollerProxy
124
+ .connect(fundOwner)
125
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
126
+ await expect(redeemTx).resolves.toBeReceipt();
127
+
128
+ return redeemTx;
129
+ }
130
+
131
+ export async function uniswapV2TakeOrder({
132
+ comptrollerProxy,
133
+ vaultProxy,
134
+ integrationManager,
135
+ fundOwner,
136
+ uniswapV2Adapter,
137
+ path,
138
+ outgoingAssetAmount,
139
+ minIncomingAssetAmount,
140
+ seedFund = false,
141
+ }: {
142
+ comptrollerProxy: ComptrollerLib;
143
+ vaultProxy: VaultLib;
144
+ integrationManager: IntegrationManager;
145
+ fundOwner: SignerWithAddress;
146
+ uniswapV2Adapter: UniswapV2Adapter;
147
+ path: StandardToken[];
148
+ outgoingAssetAmount: BigNumberish;
149
+ minIncomingAssetAmount: BigNumberish;
150
+ seedFund?: boolean;
151
+ }) {
152
+ if (seedFund) {
153
+ // Seed the VaultProxy with enough outgoingAsset for the tx
154
+ await path[0].transfer(vaultProxy, outgoingAssetAmount);
155
+ }
156
+
157
+ const takeOrderArgs = uniswapV2TakeOrderArgs({
158
+ path,
159
+ outgoingAssetAmount,
160
+ minIncomingAssetAmount,
161
+ });
162
+ const callArgs = callOnIntegrationArgs({
163
+ adapter: uniswapV2Adapter,
164
+ selector: takeOrderSelector,
165
+ encodedCallArgs: takeOrderArgs,
166
+ });
167
+
168
+ return comptrollerProxy
169
+ .connect(fundOwner)
170
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
171
+ }
@@ -0,0 +1,56 @@
1
+ import { AddressLike } from '@enzymefinance/ethers';
2
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import {
4
+ callOnIntegrationArgs,
5
+ ComptrollerLib,
6
+ IntegrationManager,
7
+ IntegrationManagerActionId,
8
+ StandardToken,
9
+ takeOrderSelector,
10
+ uniswapV3TakeOrderArgs,
11
+ } from '@enzymefinance/protocol';
12
+ import { BigNumber, BigNumberish } from 'ethers';
13
+
14
+ export async function uniswapV3TakeOrder({
15
+ comptrollerProxy,
16
+ integrationManager,
17
+ fundOwner,
18
+ uniswapV3Adapter,
19
+ pathAddresses,
20
+ pathFees,
21
+ outgoingAssetAmount,
22
+ minIncomingAssetAmount = 1,
23
+ seedFund = false,
24
+ }: {
25
+ comptrollerProxy: ComptrollerLib;
26
+ integrationManager: IntegrationManager;
27
+ fundOwner: SignerWithAddress;
28
+ uniswapV3Adapter: AddressLike;
29
+ pathAddresses: StandardToken[];
30
+ pathFees: BigNumber[];
31
+ outgoingAssetAmount: BigNumberish;
32
+ minIncomingAssetAmount?: BigNumberish;
33
+ seedFund?: boolean;
34
+ }) {
35
+ if (seedFund) {
36
+ // Seed the VaultProxy with enough outgoingAsset for the tx
37
+ await pathAddresses[0].transfer(await comptrollerProxy.getVaultProxy(), outgoingAssetAmount);
38
+ }
39
+
40
+ const takeOrderArgs = uniswapV3TakeOrderArgs({
41
+ pathAddresses,
42
+ pathFees,
43
+ outgoingAssetAmount,
44
+ minIncomingAssetAmount,
45
+ });
46
+
47
+ const callArgs = callOnIntegrationArgs({
48
+ adapter: uniswapV3Adapter,
49
+ selector: takeOrderSelector,
50
+ encodedCallArgs: takeOrderArgs,
51
+ });
52
+
53
+ return comptrollerProxy
54
+ .connect(fundOwner)
55
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
56
+ }
@@ -0,0 +1,81 @@
1
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
2
+ import {
3
+ callOnIntegrationArgs,
4
+ ComptrollerLib,
5
+ IntegrationManager,
6
+ IntegrationManagerActionId,
7
+ lendSelector,
8
+ redeemSelector,
9
+ StandardToken,
10
+ YearnVaultV2Adapter,
11
+ yearnVaultV2LendArgs,
12
+ yearnVaultV2RedeemArgs,
13
+ } from '@enzymefinance/protocol';
14
+ import { BigNumber, BigNumberish } from 'ethers';
15
+
16
+ export async function yearnVaultV2Lend({
17
+ signer,
18
+ comptrollerProxy,
19
+ integrationManager,
20
+ yearnVaultV2Adapter,
21
+ yVault,
22
+ outgoingUnderlyingAmount,
23
+ minIncomingYVaultSharesAmount = BigNumber.from(1),
24
+ }: {
25
+ signer: SignerWithAddress;
26
+ comptrollerProxy: ComptrollerLib;
27
+ integrationManager: IntegrationManager;
28
+ yearnVaultV2Adapter: YearnVaultV2Adapter;
29
+ yVault: StandardToken;
30
+ outgoingUnderlyingAmount: BigNumberish;
31
+ minIncomingYVaultSharesAmount?: BigNumberish;
32
+ }) {
33
+ const callArgs = callOnIntegrationArgs({
34
+ adapter: yearnVaultV2Adapter,
35
+ selector: lendSelector,
36
+ encodedCallArgs: yearnVaultV2LendArgs({
37
+ yVault,
38
+ outgoingUnderlyingAmount,
39
+ minIncomingYVaultSharesAmount,
40
+ }),
41
+ });
42
+
43
+ return comptrollerProxy
44
+ .connect(signer)
45
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
46
+ }
47
+
48
+ export async function yearnVaultV2Redeem({
49
+ signer,
50
+ comptrollerProxy,
51
+ integrationManager,
52
+ yearnVaultV2Adapter,
53
+ yVault,
54
+ maxOutgoingYVaultSharesAmount,
55
+ minIncomingUnderlyingAmount = BigNumber.from(1),
56
+ slippageToleranceBps = 1,
57
+ }: {
58
+ signer: SignerWithAddress;
59
+ comptrollerProxy: ComptrollerLib;
60
+ integrationManager: IntegrationManager;
61
+ yearnVaultV2Adapter: YearnVaultV2Adapter;
62
+ yVault: StandardToken;
63
+ maxOutgoingYVaultSharesAmount: BigNumberish;
64
+ minIncomingUnderlyingAmount?: BigNumberish;
65
+ slippageToleranceBps?: BigNumberish;
66
+ }) {
67
+ const callArgs = callOnIntegrationArgs({
68
+ adapter: yearnVaultV2Adapter,
69
+ selector: redeemSelector,
70
+ encodedCallArgs: yearnVaultV2RedeemArgs({
71
+ yVault,
72
+ maxOutgoingYVaultSharesAmount,
73
+ minIncomingUnderlyingAmount,
74
+ slippageToleranceBps,
75
+ }),
76
+ });
77
+
78
+ return comptrollerProxy
79
+ .connect(signer)
80
+ .callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
81
+ }