@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.
- package/CHANGELOG.md +40 -0
- package/dist/declarations/src/deployment.d.ts +34 -27
- package/dist/declarations/src/scaffolding/assets.d.ts +1 -1
- package/dist/declarations/src/scaffolding/core.d.ts +2 -3
- package/dist/declarations/src/scaffolding/extensions/external-positions/aave-debt.d.ts +51 -0
- package/dist/declarations/src/scaffolding/extensions/external-positions/actions.d.ts +2 -1
- package/dist/declarations/src/scaffolding/extensions/external-positions/index.d.ts +1 -0
- package/dist/declarations/src/scaffolding/extensions/external-positions/mocks.d.ts +4 -1
- package/dist/declarations/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.d.ts +12 -11
- package/dist/declarations/src/scaffolding/extensions/fees.d.ts +3 -3
- package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +2 -2
- package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +30 -2
- package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +63 -229
- package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +3 -3
- package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +1 -1
- package/dist/declarations/src/scaffolding/extensions/integrations/olympusV2.d.ts +17 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +5 -10
- package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +2 -2
- package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +1 -1
- package/dist/declarations/src/scaffolding/extensions/policies.d.ts +8 -8
- package/dist/declarations/src/whales.d.ts +12 -5
- package/dist/enzymefinance-testutils.browser.cjs.js +826 -721
- package/dist/enzymefinance-testutils.browser.esm.js +809 -692
- package/dist/enzymefinance-testutils.cjs.dev.js +826 -721
- package/dist/enzymefinance-testutils.cjs.prod.js +826 -721
- package/dist/enzymefinance-testutils.esm.js +809 -692
- package/package.json +6 -6
- package/src/deployment.ts +39 -31
- package/src/scaffolding/assets.ts +1 -1
- package/src/scaffolding/core.ts +3 -9
- package/src/scaffolding/extensions/external-positions/aave-debt.ts +179 -0
- package/src/scaffolding/extensions/external-positions/actions.ts +6 -1
- package/src/scaffolding/extensions/external-positions/index.ts +1 -0
- package/src/scaffolding/extensions/external-positions/mocks.ts +7 -10
- package/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.ts +18 -24
- package/src/scaffolding/extensions/integrations/compound.ts +163 -2
- package/src/scaffolding/extensions/integrations/curve.ts +152 -783
- package/src/scaffolding/extensions/integrations/index.ts +1 -1
- package/src/scaffolding/extensions/integrations/olympusV2.ts +71 -0
- package/src/scaffolding/extensions/integrations/synthetix.ts +6 -25
- package/src/types.d.ts +1 -0
- package/src/whales.ts +14 -5
- package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV4.d.ts +0 -23
- package/src/scaffolding/extensions/integrations/paraSwapV4.ts +0 -70
@@ -1,16 +1,28 @@
|
|
1
1
|
import type { AddressLike, Contract, Send } from '@enzymefinance/ethers';
|
2
2
|
import { contract, resolveAddress } from '@enzymefinance/ethers';
|
3
3
|
import type { SignerWithAddress } from '@enzymefinance/hardhat';
|
4
|
-
import type {
|
4
|
+
import type {
|
5
|
+
CompoundAdapter,
|
6
|
+
CompoundPriceFeed,
|
7
|
+
ComptrollerLib,
|
8
|
+
ICERC20,
|
9
|
+
IntegrationManager,
|
10
|
+
VaultLib,
|
11
|
+
} from '@enzymefinance/protocol';
|
5
12
|
import {
|
6
13
|
callOnIntegrationArgs,
|
14
|
+
claimRewardsSelector,
|
7
15
|
compoundArgs,
|
16
|
+
compoundClaimRewardsArgs,
|
8
17
|
IntegrationManagerActionId,
|
9
18
|
lendSelector,
|
10
19
|
redeemSelector,
|
20
|
+
StandardToken,
|
11
21
|
} from '@enzymefinance/protocol';
|
12
22
|
import type { BigNumberish } from 'ethers';
|
13
|
-
import { utils } from 'ethers';
|
23
|
+
import { BigNumber, utils } from 'ethers';
|
24
|
+
|
25
|
+
import { getAssetBalances } from '../../common';
|
14
26
|
|
15
27
|
export interface ICompoundComptroller extends Contract<ICompoundComptroller> {
|
16
28
|
claimComp: Send<(_account: AddressLike) => void>;
|
@@ -20,6 +32,155 @@ export const ICompoundComptroller = contract<ICompoundComptroller>()`
|
|
20
32
|
function claimComp(address)
|
21
33
|
`;
|
22
34
|
|
35
|
+
export async function assertCompoundLend({
|
36
|
+
tokenWhale,
|
37
|
+
comptrollerProxy,
|
38
|
+
vaultProxy,
|
39
|
+
integrationManager,
|
40
|
+
fundOwner,
|
41
|
+
compoundAdapter,
|
42
|
+
tokenAmount = utils.parseEther('1'),
|
43
|
+
cToken,
|
44
|
+
compoundPriceFeed,
|
45
|
+
}: {
|
46
|
+
tokenWhale: SignerWithAddress;
|
47
|
+
comptrollerProxy: ComptrollerLib;
|
48
|
+
vaultProxy: VaultLib;
|
49
|
+
integrationManager: IntegrationManager;
|
50
|
+
fundOwner: SignerWithAddress;
|
51
|
+
compoundAdapter: CompoundAdapter;
|
52
|
+
tokenAmount?: BigNumber;
|
53
|
+
cToken: ICERC20;
|
54
|
+
compoundPriceFeed: CompoundPriceFeed;
|
55
|
+
}) {
|
56
|
+
const token = new StandardToken(await compoundPriceFeed.getTokenFromCToken.args(cToken).call(), tokenWhale);
|
57
|
+
await token.connect(tokenWhale).transfer(vaultProxy, tokenAmount);
|
58
|
+
const rateBefore = await cToken.exchangeRateStored.call();
|
59
|
+
|
60
|
+
// Exchange rate stored can have a small deviation from exchangeRateStored
|
61
|
+
const minIncomingCTokenAmount = tokenAmount
|
62
|
+
.mul(utils.parseEther('1'))
|
63
|
+
.div(rateBefore)
|
64
|
+
.mul(BigNumber.from('999'))
|
65
|
+
.div(BigNumber.from('1000'));
|
66
|
+
|
67
|
+
const [preTxIncomingAssetBalance, preTxOutgoingAssetBalance] = await getAssetBalances({
|
68
|
+
account: vaultProxy,
|
69
|
+
assets: [cToken as any, token],
|
70
|
+
});
|
71
|
+
|
72
|
+
const lendReceipt = await compoundLend({
|
73
|
+
cToken,
|
74
|
+
cTokenAmount: minIncomingCTokenAmount,
|
75
|
+
compoundAdapter,
|
76
|
+
comptrollerProxy,
|
77
|
+
fundOwner,
|
78
|
+
integrationManager,
|
79
|
+
tokenAmount,
|
80
|
+
});
|
81
|
+
|
82
|
+
// Get exchange rate after tx (the rate is updated right after)
|
83
|
+
const rate = await cToken.exchangeRateStored();
|
84
|
+
const [postTxIncomingAssetBalance, postTxOutgoingAssetBalance] = await getAssetBalances({
|
85
|
+
account: vaultProxy,
|
86
|
+
assets: [cToken as any, token],
|
87
|
+
});
|
88
|
+
|
89
|
+
const expectedCTokenAmount = tokenAmount.mul(utils.parseEther('1')).div(rate);
|
90
|
+
expect(postTxIncomingAssetBalance).toEqBigNumber(preTxIncomingAssetBalance.add(expectedCTokenAmount));
|
91
|
+
expect(postTxOutgoingAssetBalance).toEqBigNumber(preTxOutgoingAssetBalance.sub(tokenAmount));
|
92
|
+
|
93
|
+
return lendReceipt;
|
94
|
+
}
|
95
|
+
|
96
|
+
export async function assertCompoundRedeem({
|
97
|
+
comptrollerProxy,
|
98
|
+
vaultProxy,
|
99
|
+
integrationManager,
|
100
|
+
fundOwner,
|
101
|
+
compoundAdapter,
|
102
|
+
cToken,
|
103
|
+
compoundPriceFeed,
|
104
|
+
}: {
|
105
|
+
comptrollerProxy: ComptrollerLib;
|
106
|
+
vaultProxy: VaultLib;
|
107
|
+
integrationManager: IntegrationManager;
|
108
|
+
fundOwner: SignerWithAddress;
|
109
|
+
compoundAdapter: CompoundAdapter;
|
110
|
+
cToken: ICERC20;
|
111
|
+
compoundPriceFeed: CompoundPriceFeed;
|
112
|
+
}) {
|
113
|
+
const cTokenAmount = utils.parseUnits('1', await cToken.decimals());
|
114
|
+
await cToken.transfer(vaultProxy, cTokenAmount);
|
115
|
+
|
116
|
+
const token = new StandardToken(await compoundPriceFeed.getTokenFromCToken.args(cToken).call(), provider);
|
117
|
+
const [preTxIncomingAssetBalance, preTxOutgoingAssetBalance] = await getAssetBalances({
|
118
|
+
account: vaultProxy,
|
119
|
+
assets: [token, cToken as any],
|
120
|
+
});
|
121
|
+
|
122
|
+
const rateBefore = await cToken.exchangeRateStored();
|
123
|
+
const minIncomingTokenAmount = cTokenAmount.mul(rateBefore).div(utils.parseEther('1'));
|
124
|
+
|
125
|
+
const redeemReceipt = await compoundRedeem({
|
126
|
+
cToken,
|
127
|
+
cTokenAmount,
|
128
|
+
compoundAdapter,
|
129
|
+
comptrollerProxy,
|
130
|
+
fundOwner,
|
131
|
+
integrationManager,
|
132
|
+
tokenAmount: minIncomingTokenAmount,
|
133
|
+
vaultProxy,
|
134
|
+
});
|
135
|
+
|
136
|
+
const [postTxIncomingAssetBalance, postTxOutgoingAssetBalance] = await getAssetBalances({
|
137
|
+
account: vaultProxy,
|
138
|
+
assets: [token, cToken as any],
|
139
|
+
});
|
140
|
+
|
141
|
+
// Get exchange rate after tx (the rate is updated right after)
|
142
|
+
const rate = await cToken.exchangeRateStored();
|
143
|
+
const expectedTokenAmount = cTokenAmount.mul(rate).div(utils.parseEther('1'));
|
144
|
+
|
145
|
+
expect(postTxIncomingAssetBalance).toEqBigNumber(preTxIncomingAssetBalance.add(expectedTokenAmount));
|
146
|
+
expect(postTxOutgoingAssetBalance).toEqBigNumber(preTxOutgoingAssetBalance.sub(cTokenAmount));
|
147
|
+
|
148
|
+
return redeemReceipt;
|
149
|
+
}
|
150
|
+
|
151
|
+
export async function compoundClaim({
|
152
|
+
comptrollerProxy,
|
153
|
+
integrationManager,
|
154
|
+
fundOwner,
|
155
|
+
compoundAdapter,
|
156
|
+
compoundComptroller,
|
157
|
+
cTokens,
|
158
|
+
}: {
|
159
|
+
comptrollerProxy: ComptrollerLib;
|
160
|
+
integrationManager: IntegrationManager;
|
161
|
+
fundOwner: SignerWithAddress;
|
162
|
+
compoundAdapter: CompoundAdapter;
|
163
|
+
compoundComptroller: AddressLike;
|
164
|
+
cTokens: AddressLike[];
|
165
|
+
}) {
|
166
|
+
const claimArgs = compoundClaimRewardsArgs({
|
167
|
+
cTokens,
|
168
|
+
compoundComptroller,
|
169
|
+
});
|
170
|
+
|
171
|
+
const callArgs = callOnIntegrationArgs({
|
172
|
+
adapter: compoundAdapter,
|
173
|
+
encodedCallArgs: claimArgs,
|
174
|
+
selector: claimRewardsSelector,
|
175
|
+
});
|
176
|
+
|
177
|
+
const claimRewardsTx = comptrollerProxy
|
178
|
+
.connect(fundOwner)
|
179
|
+
.callOnExtension(integrationManager, IntegrationManagerActionId.CallOnIntegration, callArgs);
|
180
|
+
|
181
|
+
return claimRewardsTx;
|
182
|
+
}
|
183
|
+
|
23
184
|
export async function compoundLend({
|
24
185
|
comptrollerProxy,
|
25
186
|
integrationManager,
|