@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
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@enzymefinance/testutils",
3
+ "version": "3.0.0",
4
+ "main": "dist/enzymefinance-testutils.cjs.js",
5
+ "module": "dist/enzymefinance-testutils.esm.js",
6
+ "browser": {
7
+ "./dist/enzymefinance-testutils.cjs.js": "./dist/enzymefinance-testutils.browser.cjs.js",
8
+ "./dist/enzymefinance-testutils.esm.js": "./dist/enzymefinance-testutils.browser.esm.js"
9
+ },
10
+ "dependencies": {
11
+ "@babel/runtime": "^7.15.4",
12
+ "@enzymefinance/ethers": "^1.0.0",
13
+ "@enzymefinance/hardhat": "^1.0.0",
14
+ "@enzymefinance/protocol": "^3.0.0",
15
+ "ethers": "^5.4.6",
16
+ "ethers-eip712": "^0.2.0"
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ import { ContractReceipt, extractEvent } from '@enzymefinance/ethers';
2
+ import { utils } from 'ethers';
3
+
4
+ export function assertEvent<TResult = any>(
5
+ receipt: ContractReceipt<any>,
6
+ event: string | utils.EventFragment,
7
+ match?: TResult,
8
+ ) {
9
+ const events = extractEvent(receipt, event);
10
+ expect(events.length).toBe(1);
11
+ expect(receipt).toHaveEmittedWith(event, match);
12
+
13
+ const args = events.shift()?.args;
14
+ return (args as unknown as typeof match)!;
15
+ }
16
+
17
+ export function assertNoEvent(receipt: ContractReceipt<any>, event: string | utils.EventFragment) {
18
+ const events = extractEvent(receipt, event);
19
+ expect(events.length).toBe(0);
20
+ }
@@ -0,0 +1,169 @@
1
+ import { Contract } from '@enzymefinance/ethers';
2
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import {
4
+ Dispatcher,
5
+ VaultLib,
6
+ FundDeployer,
7
+ PolicyManager,
8
+ AavePriceFeed,
9
+ AlphaHomoraV1PriceFeed,
10
+ ChainlinkPriceFeed,
11
+ CompoundPriceFeed,
12
+ CurvePriceFeed,
13
+ IdlePriceFeed,
14
+ LidoStethPriceFeed,
15
+ RevertingPriceFeed,
16
+ StakehoundEthPriceFeed,
17
+ SynthetixPriceFeed,
18
+ WdgldPriceFeed,
19
+ YearnVaultV2PriceFeed,
20
+ AggregatedDerivativePriceFeed,
21
+ ValueInterpreter,
22
+ UniswapV2PoolPriceFeed,
23
+ IntegrationManager,
24
+ AaveAdapter,
25
+ AlphaHomoraV1Adapter,
26
+ CurveLiquidityAaveAdapter,
27
+ CurveLiquidityEursAdapter,
28
+ CurveLiquiditySethAdapter,
29
+ CurveLiquidityStethAdapter,
30
+ IdleAdapter,
31
+ ParaSwapV4Adapter,
32
+ SynthetixAdapter,
33
+ YearnVaultV2Adapter,
34
+ ZeroExV2Adapter,
35
+ CompoundAdapter,
36
+ UniswapV2Adapter,
37
+ TrackedAssetsAdapter,
38
+ UniswapV3Adapter,
39
+ CurveExchangeAdapter,
40
+ KyberAdapter,
41
+ FeeManager,
42
+ ComptrollerLib,
43
+ EntranceRateBurnFee,
44
+ EntranceRateDirectFee,
45
+ ManagementFee,
46
+ PerformanceFee,
47
+ AuthUserExecutedSharesRequestorLib,
48
+ AuthUserExecutedSharesRequestorFactory,
49
+ FundActionsWrapper,
50
+ AdapterBlacklist,
51
+ AdapterWhitelist,
52
+ AssetBlacklist,
53
+ AssetWhitelist,
54
+ BuySharesCallerWhitelist,
55
+ MaxConcentration,
56
+ MinMaxInvestment,
57
+ InvestorWhitelist,
58
+ GuaranteedRedemption,
59
+ } from '@enzymefinance/protocol';
60
+
61
+ import { DeploymentConfig } from '../../../deploy/utils/config';
62
+
63
+ export async function getNamedSigner(name: string) {
64
+ const accounts = await hre.getNamedAccounts();
65
+ if (!accounts[name]) {
66
+ throw new Error(`Missing account with name ${name}`);
67
+ }
68
+
69
+ return provider.getSignerWithAddress(accounts[name]);
70
+ }
71
+
72
+ export async function getUnnamedSigners() {
73
+ const accounts = await hre.getUnnamedAccounts();
74
+ return Promise.all(accounts.map((account) => provider.getSignerWithAddress(account)));
75
+ }
76
+
77
+ export async function deployProtocolFixture() {
78
+ const fixture = await hre.deployments.fixture();
79
+ const deployer = await getNamedSigner('deployer');
80
+ const accounts = await getUnnamedSigners();
81
+ const config = fixture['Config'].linkedData as DeploymentConfig;
82
+
83
+ // prettier-ignore
84
+ const deployment = {
85
+ dispatcher: new Dispatcher(fixture['Dispatcher'].address, deployer),
86
+ vaultLib: new VaultLib(fixture['VaultLib'].address, deployer),
87
+ fundDeployer: new FundDeployer(fixture['FundDeployer'].address, deployer),
88
+ policyManager: new PolicyManager(fixture['PolicyManager'].address, deployer),
89
+ aavePriceFeed: new AavePriceFeed(fixture['AavePriceFeed'].address, deployer),
90
+ alphaHomoraV1PriceFeed: new AlphaHomoraV1PriceFeed(fixture['AlphaHomoraV1PriceFeed'].address, deployer),
91
+ chainlinkPriceFeed: new ChainlinkPriceFeed(fixture['ChainlinkPriceFeed'].address, deployer),
92
+ compoundPriceFeed: new CompoundPriceFeed(fixture['CompoundPriceFeed'].address, deployer),
93
+ curvePriceFeed: new CurvePriceFeed(fixture['CurvePriceFeed'].address, deployer),
94
+ idlePriceFeed: new IdlePriceFeed(fixture['IdlePriceFeed'].address, deployer),
95
+ lidoStethPriceFeed: new LidoStethPriceFeed(fixture['LidoStethPriceFeed'].address, deployer),
96
+ revertingPriceFeed: new RevertingPriceFeed(fixture['RevertingPriceFeed'].address, deployer),
97
+ synthetixPriceFeed: new SynthetixPriceFeed(fixture['SynthetixPriceFeed'].address, deployer),
98
+ stakehoundEthPriceFeed: new StakehoundEthPriceFeed(fixture['StakehoundEthPriceFeed'].address, deployer),
99
+ wdgldPriceFeed: new WdgldPriceFeed(fixture['WdgldPriceFeed'].address, deployer),
100
+ yearnVaultV2PriceFeed: new YearnVaultV2PriceFeed(fixture['YearnVaultV2PriceFeed'].address, deployer),
101
+ aggregatedDerivativePriceFeed: new AggregatedDerivativePriceFeed(fixture['AggregatedDerivativePriceFeed'].address, deployer),
102
+ valueInterpreter: new ValueInterpreter(fixture['ValueInterpreter'].address, deployer),
103
+ uniswapV2PoolPriceFeed: new UniswapV2PoolPriceFeed(fixture['UniswapV2PoolPriceFeed'].address, deployer),
104
+ integrationManager: new IntegrationManager(fixture['IntegrationManager'].address, deployer),
105
+ curveLiquidityAaveAdapter: new CurveLiquidityAaveAdapter(fixture['CurveLiquidityAaveAdapter'].address, deployer),
106
+ curveLiquidityEursAdapter: new CurveLiquidityEursAdapter(fixture['CurveLiquidityEursAdapter'].address, deployer),
107
+ curveLiquiditySethAdapter: new CurveLiquiditySethAdapter(fixture['CurveLiquiditySethAdapter'].address, deployer),
108
+ curveLiquidityStethAdapter: new CurveLiquidityStethAdapter(fixture['CurveLiquidityStethAdapter'].address, deployer),
109
+ aaveAdapter: new AaveAdapter(fixture['AaveAdapter'].address, deployer),
110
+ alphaHomoraV1Adapter: new AlphaHomoraV1Adapter(fixture['AlphaHomoraV1Adapter'].address, deployer),
111
+ idleAdapter: new IdleAdapter(fixture['IdleAdapter'].address, deployer),
112
+ paraSwapV4Adapter: new ParaSwapV4Adapter(fixture['ParaSwapV4Adapter'].address, deployer),
113
+ synthetixAdapter: new SynthetixAdapter(fixture['SynthetixAdapter'].address, deployer),
114
+ yearnVaultV2Adapter: new YearnVaultV2Adapter(fixture['YearnVaultV2Adapter'].address, deployer),
115
+ zeroExV2Adapter: new ZeroExV2Adapter(fixture['ZeroExV2Adapter'].address, deployer),
116
+ compoundAdapter: new CompoundAdapter(fixture['CompoundAdapter'].address, deployer),
117
+ uniswapV2Adapter: new UniswapV2Adapter(fixture['UniswapV2Adapter'].address, deployer),
118
+ trackedAssetsAdapter: new TrackedAssetsAdapter(fixture['TrackedAssetsAdapter'].address, deployer),
119
+ uniswapV3Adapter: new UniswapV3Adapter(fixture['UniswapV3Adapter'].address, deployer),
120
+ curveExchangeAdapter: new CurveExchangeAdapter(fixture['CurveExchangeAdapter'].address, deployer),
121
+ kyberAdapter: new KyberAdapter(fixture['KyberAdapter'].address, deployer),
122
+ feeManager: new FeeManager(fixture['FeeManager'].address, deployer),
123
+ comptrollerLib: new ComptrollerLib(fixture['ComptrollerLib'].address, deployer),
124
+ entranceRateBurnFee: new EntranceRateBurnFee(fixture['EntranceRateBurnFee'].address, deployer),
125
+ entranceRateDirectFee: new EntranceRateDirectFee(fixture['EntranceRateDirectFee'].address, deployer),
126
+ managementFee: new ManagementFee(fixture['ManagementFee'].address, deployer),
127
+ performanceFee: new PerformanceFee(fixture['PerformanceFee'].address, deployer),
128
+ authUserExecutedSharesRequestorLib: new AuthUserExecutedSharesRequestorLib(fixture['AuthUserExecutedSharesRequestorLib'].address, deployer),
129
+ authUserExecutedSharesRequestorFactory: new AuthUserExecutedSharesRequestorFactory(fixture['AuthUserExecutedSharesRequestorFactory'].address, deployer),
130
+ fundActionsWrapper: new FundActionsWrapper(fixture['FundActionsWrapper'].address, deployer),
131
+ adapterBlacklist: new AdapterBlacklist(fixture['AdapterBlacklist'].address, deployer),
132
+ adapterWhitelist: new AdapterWhitelist(fixture['AdapterWhitelist'].address, deployer),
133
+ assetBlacklist: new AssetBlacklist(fixture['AssetBlacklist'].address, deployer),
134
+ assetWhitelist: new AssetWhitelist(fixture['AssetWhitelist'].address, deployer),
135
+ buySharesCallerWhitelist: new BuySharesCallerWhitelist(fixture['BuySharesCallerWhitelist'].address, deployer),
136
+ maxConcentration: new MaxConcentration(fixture['MaxConcentration'].address, deployer),
137
+ minMaxInvestment: new MinMaxInvestment(fixture['MinMaxInvestment'].address, deployer),
138
+ investorWhitelist: new InvestorWhitelist(fixture['InvestorWhitelist'].address, deployer),
139
+ guaranteedRedemption: new GuaranteedRedemption(fixture['GuaranteedRedemption'].address, deployer),
140
+ } as const;
141
+
142
+ return {
143
+ deployer,
144
+ deployment,
145
+ accounts,
146
+ config,
147
+ } as const;
148
+ }
149
+
150
+ type Resolve<T extends () => any> = ReturnType<T> extends Promise<infer U> ? U : ReturnType<T>;
151
+ type ContractMap = Record<string, Contract>;
152
+
153
+ export interface DeploymentFixtureWithoutConfig<T extends ContractMap> {
154
+ deployer: SignerWithAddress;
155
+ deployment: T;
156
+ accounts: SignerWithAddress[];
157
+ }
158
+
159
+ export interface DeploymentFixtureWithConfig<T extends ContractMap> extends DeploymentFixtureWithoutConfig<T> {
160
+ config: DeploymentConfig;
161
+ }
162
+
163
+ export type ProtocolDeployment = Resolve<typeof deployProtocolFixture>;
164
+
165
+ // TODO: Remove this.
166
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
167
+ export async function defaultTestDeployment(_: any): Promise<any> {
168
+ throw new Error('Removed');
169
+ }
package/src/helpers.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { ContractReceipt } from '@enzymefinance/ethers';
2
+
3
+ export async function transactionTimestamp(receipt: ContractReceipt<any>) {
4
+ const block = await provider.getBlock(receipt.blockNumber);
5
+ return block.timestamp;
6
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './deployment';
2
+ export * from './scaffolding';
3
+ export * from './assertions';
4
+ export * from './helpers';
5
+ export * from './whales';
@@ -0,0 +1,39 @@
1
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
2
+ import {
3
+ ComptrollerLib,
4
+ IntegrationManager,
5
+ StandardToken,
6
+ TrackedAssetsAdapter,
7
+ VaultLib,
8
+ } from '@enzymefinance/protocol';
9
+ import { BigNumberish } from 'ethers';
10
+ import { addTrackedAssets } from './extensions/integrations/trackedAssets';
11
+
12
+ export async function addNewAssetsToFund({
13
+ fundOwner,
14
+ comptrollerProxy,
15
+ vaultProxy,
16
+ integrationManager,
17
+ trackedAssetsAdapter,
18
+ assets,
19
+ amounts = new Array(assets.length).fill(1),
20
+ }: {
21
+ fundOwner: SignerWithAddress;
22
+ comptrollerProxy: ComptrollerLib;
23
+ vaultProxy: VaultLib;
24
+ integrationManager: IntegrationManager;
25
+ trackedAssetsAdapter: TrackedAssetsAdapter;
26
+ assets: StandardToken[];
27
+ amounts?: BigNumberish[];
28
+ }) {
29
+ for (const i in assets) {
30
+ await assets[i].transfer(vaultProxy, amounts[i]);
31
+ }
32
+ return addTrackedAssets({
33
+ comptrollerProxy,
34
+ integrationManager,
35
+ fundOwner,
36
+ trackedAssetsAdapter,
37
+ incomingAssets: assets,
38
+ });
39
+ }
@@ -0,0 +1,8 @@
1
+ import { BigNumberish } from 'ethers';
2
+ import { MockChainlinkPriceSource } from '@enzymefinance/protocol';
3
+
4
+ export async function updateChainlinkAggregator(aggregator: MockChainlinkPriceSource, price?: BigNumberish) {
5
+ const answer = price ?? (await aggregator.latestAnswer());
6
+ const block = await aggregator.provider.getBlock('latest');
7
+ await aggregator.setLatestAnswer(answer, block.timestamp);
8
+ }
@@ -0,0 +1,6 @@
1
+ import { AddressLike } from '@enzymefinance/ethers';
2
+ import { StandardToken } from '@enzymefinance/protocol';
3
+
4
+ export async function getAssetBalances({ account, assets }: { account: AddressLike; assets: StandardToken[] }) {
5
+ return Promise.all(assets.map((asset) => asset.balanceOf(account)));
6
+ }
@@ -0,0 +1,77 @@
1
+ import { AddressLike } from '@enzymefinance/ethers';
2
+ import {
3
+ ChainlinkPriceFeed,
4
+ ComptrollerLib,
5
+ Dispatcher,
6
+ FeeManager,
7
+ FundDeployer,
8
+ IntegrationManager,
9
+ PolicyManager,
10
+ ReleaseStatusTypes,
11
+ SynthetixPriceFeed,
12
+ ValueInterpreter,
13
+ VaultLib,
14
+ } from '@enzymefinance/protocol';
15
+ import { BytesLike, Signer } from 'ethers';
16
+
17
+ export async function createFundDeployer({
18
+ deployer,
19
+ chainlinkPriceFeed,
20
+ dispatcher,
21
+ feeManager,
22
+ integrationManager,
23
+ policyManager,
24
+ synthetixAddressResolverAddress,
25
+ synthetixPriceFeed,
26
+ valueInterpreter,
27
+ vaultLib,
28
+ vaultCallContracts = [],
29
+ vaultCallSelectors = [],
30
+ setOnDispatcher = true,
31
+ setReleaseStatusLive = true,
32
+ }: {
33
+ deployer: Signer;
34
+ chainlinkPriceFeed: ChainlinkPriceFeed;
35
+ dispatcher: Dispatcher;
36
+ feeManager: FeeManager;
37
+ integrationManager: IntegrationManager;
38
+ policyManager: PolicyManager;
39
+ synthetixAddressResolverAddress: AddressLike;
40
+ synthetixPriceFeed: SynthetixPriceFeed;
41
+ valueInterpreter: ValueInterpreter;
42
+ vaultLib: VaultLib;
43
+ vaultCallContracts?: AddressLike[];
44
+ vaultCallSelectors?: BytesLike[];
45
+ setOnDispatcher?: boolean;
46
+ setReleaseStatusLive?: boolean;
47
+ }) {
48
+ const nextFundDeployer = await FundDeployer.deploy(
49
+ deployer,
50
+ dispatcher,
51
+ vaultLib,
52
+ vaultCallContracts,
53
+ vaultCallSelectors,
54
+ );
55
+ const nextComptrollerLib = await ComptrollerLib.deploy(
56
+ deployer,
57
+ dispatcher,
58
+ nextFundDeployer,
59
+ valueInterpreter,
60
+ feeManager,
61
+ integrationManager,
62
+ policyManager,
63
+ chainlinkPriceFeed,
64
+ synthetixPriceFeed,
65
+ synthetixAddressResolverAddress,
66
+ );
67
+ await nextFundDeployer.setComptrollerLib(nextComptrollerLib);
68
+
69
+ if (setReleaseStatusLive) {
70
+ await nextFundDeployer.setReleaseStatus(ReleaseStatusTypes.Live);
71
+ }
72
+ if (setOnDispatcher) {
73
+ await dispatcher.setCurrentFundDeployer(nextFundDeployer);
74
+ }
75
+
76
+ return nextFundDeployer;
77
+ }
@@ -0,0 +1,30 @@
1
+ import { AddressLike } from '@enzymefinance/ethers';
2
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
3
+ import { ComptrollerLib } from '@enzymefinance/protocol';
4
+ import { BigNumberish, BytesLike } from 'ethers';
5
+
6
+ export async function callOnExtension({
7
+ comptrollerProxy,
8
+ extension,
9
+ actionId,
10
+ callArgs = '0x',
11
+ signer,
12
+ }: {
13
+ comptrollerProxy: ComptrollerLib;
14
+ extension: AddressLike;
15
+ actionId: BigNumberish;
16
+ callArgs?: BytesLike;
17
+ signer?: SignerWithAddress;
18
+ }) {
19
+ let callOnExtensionTx: any;
20
+
21
+ if (signer) {
22
+ callOnExtensionTx = comptrollerProxy.connect(signer).callOnExtension(extension, actionId, callArgs);
23
+ } else {
24
+ callOnExtensionTx = comptrollerProxy.callOnExtension(extension, actionId, callArgs);
25
+ }
26
+
27
+ await expect(callOnExtensionTx).resolves.toBeReceipt();
28
+
29
+ return callOnExtensionTx;
30
+ }
@@ -0,0 +1,87 @@
1
+ import { SignerWithAddress } from '@enzymefinance/hardhat';
2
+ import { FeeHook, FeeManager, feeManagerConfigArgs, FeeSettlementType, IFee } from '@enzymefinance/protocol';
3
+ import { constants, utils } from 'ethers';
4
+
5
+ export async function generateFeeManagerConfigWithMockFees({
6
+ deployer,
7
+ feeManager,
8
+ }: {
9
+ deployer: SignerWithAddress;
10
+ feeManager: FeeManager;
11
+ }) {
12
+ const fees = await generateRegisteredMockFees({
13
+ deployer,
14
+ feeManager,
15
+ });
16
+
17
+ const feeManagerSettingsData = [utils.randomBytes(10), '0x', utils.randomBytes(2)];
18
+
19
+ return feeManagerConfigArgs({
20
+ fees: Object.values(fees),
21
+ settings: feeManagerSettingsData,
22
+ });
23
+ }
24
+
25
+ export async function generateRegisteredMockFees({
26
+ deployer,
27
+ feeManager,
28
+ }: {
29
+ deployer: SignerWithAddress;
30
+ feeManager: FeeManager;
31
+ }) {
32
+ // Create mock fees
33
+ const mockContinuousFeeSettleOnly = await IFee.mock(deployer);
34
+ const mockContinuousFeeWithGavAndUpdates = await IFee.mock(deployer);
35
+ const mockPostBuySharesFee = await IFee.mock(deployer);
36
+
37
+ // Initialize mock fee return values
38
+ await Promise.all([
39
+ // Continuous fee the mimics ManagementFee
40
+ mockContinuousFeeSettleOnly.identifier.returns(`MOCK_CONTINUOUS_1`),
41
+ mockContinuousFeeSettleOnly.settle.returns(FeeSettlementType.None, constants.AddressZero, 0),
42
+ mockContinuousFeeSettleOnly.payout.returns(false),
43
+ mockContinuousFeeSettleOnly.addFundSettings.returns(undefined),
44
+ mockContinuousFeeSettleOnly.activateForFund.returns(undefined),
45
+ mockContinuousFeeSettleOnly.update.returns(undefined),
46
+ mockContinuousFeeSettleOnly.implementedHooks.returns(
47
+ [FeeHook.Continuous, FeeHook.PreBuyShares, FeeHook.PreRedeemShares],
48
+ [],
49
+ false,
50
+ false,
51
+ ),
52
+ // Continuous fee the mimics PerformanceFee
53
+ mockContinuousFeeWithGavAndUpdates.identifier.returns(`MOCK_CONTINUOUS_2`),
54
+ mockContinuousFeeWithGavAndUpdates.settle.returns(FeeSettlementType.None, constants.AddressZero, 0),
55
+ mockContinuousFeeWithGavAndUpdates.payout.returns(false),
56
+ mockContinuousFeeWithGavAndUpdates.addFundSettings.returns(undefined),
57
+ mockContinuousFeeWithGavAndUpdates.activateForFund.returns(undefined),
58
+ mockContinuousFeeWithGavAndUpdates.update.returns(undefined),
59
+ mockContinuousFeeWithGavAndUpdates.implementedHooks.returns(
60
+ [FeeHook.Continuous, FeeHook.PreBuyShares, FeeHook.PreRedeemShares],
61
+ [FeeHook.Continuous, FeeHook.PostBuyShares, FeeHook.PreRedeemShares],
62
+ true,
63
+ true,
64
+ ),
65
+ // PostBuyShares fee
66
+ mockPostBuySharesFee.identifier.returns(`MOCK_POST_BUY_SHARES`),
67
+ mockPostBuySharesFee.settle.returns(FeeSettlementType.None, constants.AddressZero, 0),
68
+ mockPostBuySharesFee.payout.returns(false),
69
+ mockPostBuySharesFee.addFundSettings.returns(undefined),
70
+ mockPostBuySharesFee.activateForFund.returns(undefined),
71
+ mockPostBuySharesFee.update.returns(undefined),
72
+ mockPostBuySharesFee.implementedHooks.returns([FeeHook.PostBuyShares], [], false, false),
73
+ ]);
74
+
75
+ // Register all mock fees
76
+ await feeManager.registerFees([
77
+ mockContinuousFeeSettleOnly,
78
+ mockContinuousFeeWithGavAndUpdates,
79
+ mockPostBuySharesFee,
80
+ ]);
81
+
82
+ return {
83
+ mockContinuousFeeSettleOnly,
84
+ mockContinuousFeeWithGavAndUpdates,
85
+ mockPostBuySharesFee,
86
+ };
87
+ }