@enzymefinance/testutils 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }