@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.
- package/CHANGELOG.md +11 -0
- package/dist/declarations/src/assertions.d.ts +4 -0
- package/dist/declarations/src/deployment.d.ts +81 -0
- package/dist/declarations/src/helpers.d.ts +2 -0
- package/dist/declarations/src/index.d.ts +5 -0
- package/dist/declarations/src/scaffolding/assets.d.ts +12 -0
- package/dist/declarations/src/scaffolding/chainlink.d.ts +3 -0
- package/dist/declarations/src/scaffolding/common.d.ts +6 -0
- package/dist/declarations/src/scaffolding/core.d.ts +19 -0
- package/dist/declarations/src/scaffolding/extensions/common.d.ts +11 -0
- package/dist/declarations/src/scaffolding/extensions/fees.d.ts +14 -0
- package/dist/declarations/src/scaffolding/extensions/index.d.ts +4 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +19 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/alpha.d.ts +36 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +27 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +331 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +57 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +14 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/kyber.d.ts +23 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/mock.d.ts +32 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV4.d.ts +22 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +25 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/trackedAssets.d.ts +17 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV2.d.ts +46 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV3.d.ts +15 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +22 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +12 -0
- package/dist/declarations/src/scaffolding/extensions/policies.d.ts +15 -0
- package/dist/declarations/src/scaffolding/index.d.ts +9 -0
- package/dist/declarations/src/scaffolding/peripheral/index.d.ts +1 -0
- package/dist/declarations/src/scaffolding/peripheral/sharesRequestors.d.ts +19 -0
- package/dist/declarations/src/scaffolding/setup.d.ts +46 -0
- package/dist/declarations/src/scaffolding/shares.d.ts +30 -0
- package/dist/declarations/src/scaffolding/vaultCalls.d.ts +17 -0
- package/dist/declarations/src/whales.d.ts +43 -0
- package/dist/enzymefinance-testutils.browser.cjs.js +3160 -0
- package/dist/enzymefinance-testutils.browser.esm.js +3045 -0
- package/dist/enzymefinance-testutils.cjs.d.ts +1 -0
- package/dist/enzymefinance-testutils.cjs.dev.js +3160 -0
- package/dist/enzymefinance-testutils.cjs.js +7 -0
- package/dist/enzymefinance-testutils.cjs.prod.js +3160 -0
- package/dist/enzymefinance-testutils.esm.js +3045 -0
- package/package.json +18 -0
- package/src/assertions.ts +20 -0
- package/src/deployment.ts +169 -0
- package/src/helpers.ts +6 -0
- package/src/index.ts +5 -0
- package/src/scaffolding/assets.ts +39 -0
- package/src/scaffolding/chainlink.ts +8 -0
- package/src/scaffolding/common.ts +6 -0
- package/src/scaffolding/core.ts +77 -0
- package/src/scaffolding/extensions/common.ts +30 -0
- package/src/scaffolding/extensions/fees.ts +87 -0
- package/src/scaffolding/extensions/index.ts +4 -0
- package/src/scaffolding/extensions/integrations/aave.ts +80 -0
- package/src/scaffolding/extensions/integrations/alpha.ts +119 -0
- package/src/scaffolding/extensions/integrations/compound.ts +97 -0
- package/src/scaffolding/extensions/integrations/curve.ts +1207 -0
- package/src/scaffolding/extensions/integrations/idle.ts +215 -0
- package/src/scaffolding/extensions/integrations/index.ts +14 -0
- package/src/scaffolding/extensions/integrations/kyber.ts +69 -0
- package/src/scaffolding/extensions/integrations/mock.ts +118 -0
- package/src/scaffolding/extensions/integrations/paraSwapV4.ts +65 -0
- package/src/scaffolding/extensions/integrations/synthetix.ts +97 -0
- package/src/scaffolding/extensions/integrations/trackedAssets.ts +66 -0
- package/src/scaffolding/extensions/integrations/uniswapV2.ts +171 -0
- package/src/scaffolding/extensions/integrations/uniswapV3.ts +56 -0
- package/src/scaffolding/extensions/integrations/yearn.ts +81 -0
- package/src/scaffolding/extensions/integrations/zeroExV2.ts +45 -0
- package/src/scaffolding/extensions/policies.ts +85 -0
- package/src/scaffolding/index.ts +9 -0
- package/src/scaffolding/peripheral/index.ts +1 -0
- package/src/scaffolding/peripheral/sharesRequestors.ts +53 -0
- package/src/scaffolding/setup.ts +135 -0
- package/src/scaffolding/shares.ts +63 -0
- package/src/scaffolding/vaultCalls.ts +58 -0
- package/src/types.d.ts +1 -0
- package/src/whales.ts +63 -0
- 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
package/src/index.ts
ADDED
|
@@ -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
|
+
}
|