@enzymefinance/testutils 4.0.0 → 4.0.3

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 (92) hide show
  1. package/dist/index.d.ts +1566 -0
  2. package/dist/index.js +3375 -0
  3. package/dist/index.mjs +3375 -0
  4. package/package.json +74 -11
  5. package/CHANGELOG.md +0 -84
  6. package/dist/declarations/src/assertions.d.ts +0 -4
  7. package/dist/declarations/src/deployment.d.ts +0 -188
  8. package/dist/declarations/src/gasRelayer.d.ts +0 -56
  9. package/dist/declarations/src/helpers.d.ts +0 -16
  10. package/dist/declarations/src/index.d.ts +0 -6
  11. package/dist/declarations/src/scaffolding/assets.d.ts +0 -10
  12. package/dist/declarations/src/scaffolding/chainlink.d.ts +0 -3
  13. package/dist/declarations/src/scaffolding/common.d.ts +0 -7
  14. package/dist/declarations/src/scaffolding/core.d.ts +0 -16
  15. package/dist/declarations/src/scaffolding/extensions/common.d.ts +0 -11
  16. package/dist/declarations/src/scaffolding/extensions/external-positions/aave-debt.d.ts +0 -51
  17. package/dist/declarations/src/scaffolding/extensions/external-positions/actions.d.ts +0 -36
  18. package/dist/declarations/src/scaffolding/extensions/external-positions/compound.d.ts +0 -56
  19. package/dist/declarations/src/scaffolding/extensions/external-positions/index.d.ts +0 -5
  20. package/dist/declarations/src/scaffolding/extensions/external-positions/mocks.d.ts +0 -56
  21. package/dist/declarations/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.d.ts +0 -100
  22. package/dist/declarations/src/scaffolding/extensions/fees.d.ts +0 -12
  23. package/dist/declarations/src/scaffolding/extensions/index.d.ts +0 -5
  24. package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +0 -20
  25. package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +0 -56
  26. package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +0 -106
  27. package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +0 -28
  28. package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +0 -14
  29. package/dist/declarations/src/scaffolding/extensions/integrations/mock.d.ts +0 -32
  30. package/dist/declarations/src/scaffolding/extensions/integrations/olympusV2.d.ts +0 -17
  31. package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV5.d.ts +0 -23
  32. package/dist/declarations/src/scaffolding/extensions/integrations/poolTogetherV4.d.ts +0 -29
  33. package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +0 -28
  34. package/dist/declarations/src/scaffolding/extensions/integrations/trackedAssets.d.ts +0 -15
  35. package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV2.d.ts +0 -46
  36. package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV3.d.ts +0 -15
  37. package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +0 -22
  38. package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +0 -12
  39. package/dist/declarations/src/scaffolding/extensions/policies.d.ts +0 -17
  40. package/dist/declarations/src/scaffolding/index.d.ts +0 -8
  41. package/dist/declarations/src/scaffolding/setup.d.ts +0 -77
  42. package/dist/declarations/src/scaffolding/shares.d.ts +0 -35
  43. package/dist/declarations/src/scaffolding/vaultCalls.d.ts +0 -32
  44. package/dist/declarations/src/whales.d.ts +0 -49
  45. package/dist/enzymefinance-testutils.browser.cjs.js +0 -4158
  46. package/dist/enzymefinance-testutils.browser.esm.js +0 -4028
  47. package/dist/enzymefinance-testutils.cjs.d.ts +0 -1
  48. package/dist/enzymefinance-testutils.cjs.dev.js +0 -4158
  49. package/dist/enzymefinance-testutils.cjs.js +0 -7
  50. package/dist/enzymefinance-testutils.cjs.prod.js +0 -4158
  51. package/dist/enzymefinance-testutils.esm.js +0 -4028
  52. package/src/assertions.ts +0 -23
  53. package/src/deployment.ts +0 -280
  54. package/src/gasRelayer.ts +0 -95
  55. package/src/helpers.ts +0 -39
  56. package/src/index.ts +0 -6
  57. package/src/scaffolding/assets.ts +0 -37
  58. package/src/scaffolding/chainlink.ts +0 -8
  59. package/src/scaffolding/common.ts +0 -11
  60. package/src/scaffolding/core.ts +0 -103
  61. package/src/scaffolding/extensions/common.ts +0 -30
  62. package/src/scaffolding/extensions/external-positions/aave-debt.ts +0 -179
  63. package/src/scaffolding/extensions/external-positions/actions.ts +0 -108
  64. package/src/scaffolding/extensions/external-positions/compound.ts +0 -190
  65. package/src/scaffolding/extensions/external-positions/index.ts +0 -5
  66. package/src/scaffolding/extensions/external-positions/mocks.ts +0 -191
  67. package/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.ts +0 -284
  68. package/src/scaffolding/extensions/fees.ts +0 -70
  69. package/src/scaffolding/extensions/index.ts +0 -5
  70. package/src/scaffolding/extensions/integrations/aave.ts +0 -78
  71. package/src/scaffolding/extensions/integrations/compound.ts +0 -255
  72. package/src/scaffolding/extensions/integrations/curve.ts +0 -354
  73. package/src/scaffolding/extensions/integrations/idle.ts +0 -104
  74. package/src/scaffolding/extensions/integrations/index.ts +0 -14
  75. package/src/scaffolding/extensions/integrations/mock.ts +0 -116
  76. package/src/scaffolding/extensions/integrations/olympusV2.ts +0 -71
  77. package/src/scaffolding/extensions/integrations/paraSwapV5.ts +0 -73
  78. package/src/scaffolding/extensions/integrations/poolTogetherV4.ts +0 -117
  79. package/src/scaffolding/extensions/integrations/synthetix.ts +0 -111
  80. package/src/scaffolding/extensions/integrations/trackedAssets.ts +0 -48
  81. package/src/scaffolding/extensions/integrations/uniswapV2.ts +0 -175
  82. package/src/scaffolding/extensions/integrations/uniswapV3.ts +0 -55
  83. package/src/scaffolding/extensions/integrations/yearn.ts +0 -79
  84. package/src/scaffolding/extensions/integrations/zeroExV2.ts +0 -47
  85. package/src/scaffolding/extensions/policies.ts +0 -112
  86. package/src/scaffolding/index.ts +0 -8
  87. package/src/scaffolding/setup.ts +0 -243
  88. package/src/scaffolding/shares.ts +0 -80
  89. package/src/scaffolding/vaultCalls.ts +0 -105
  90. package/src/types.d.ts +0 -2
  91. package/src/whales.ts +0 -82
  92. package/tsconfig.json +0 -5
package/src/assertions.ts DELETED
@@ -1,23 +0,0 @@
1
- import type { ContractReceipt } from '@enzymefinance/ethers';
2
- import { extractEvent } from '@enzymefinance/ethers';
3
- import type { utils } from 'ethers';
4
-
5
- export function assertEvent<TResult = any>(
6
- receipt: ContractReceipt<any>,
7
- event: string | utils.EventFragment,
8
- match?: TResult,
9
- ) {
10
- const events = extractEvent(receipt, event);
11
- expect(events.length).toBe(1);
12
- expect(receipt).toHaveEmittedWith(event, match);
13
-
14
- const args = events.shift()?.args;
15
-
16
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
17
- return (args as unknown as typeof match)!;
18
- }
19
-
20
- export function assertNoEvent(receipt: ContractReceipt<any>, event: string | utils.EventFragment) {
21
- const events = extractEvent(receipt, event);
22
- expect(events.length).toBe(0);
23
- }
package/src/deployment.ts DELETED
@@ -1,280 +0,0 @@
1
- import {
2
- AaveAdapter,
3
- AaveDebtPositionLib,
4
- AaveDebtPositionParser,
5
- AavePriceFeed,
6
- AddressListRegistry,
7
- AllowedAdapterIncomingAssetsPolicy,
8
- AllowedAdaptersPolicy,
9
- AllowedAssetsForRedemptionPolicy,
10
- AllowedDepositRecipientsPolicy,
11
- AllowedExternalPositionTypesPolicy,
12
- AllowedSharesTransferRecipientsPolicy,
13
- CompoundAdapter,
14
- CompoundDebtPositionLib,
15
- CompoundDebtPositionParser,
16
- CompoundPriceFeed,
17
- ComptrollerLib,
18
- ConvexCurveLpStakingAdapter,
19
- ConvexCurveLpStakingWrapperFactory,
20
- ConvexCurveLpStakingWrapperPriceFeed,
21
- CumulativeSlippageTolerancePolicy,
22
- CurveExchangeAdapter,
23
- CurveLiquidityAdapter,
24
- CurvePriceFeed,
25
- DepositWrapper,
26
- Dispatcher,
27
- EntranceRateBurnFee,
28
- EntranceRateDirectFee,
29
- ExitRateBurnFee,
30
- ExitRateDirectFee,
31
- ExternalPositionFactory,
32
- ExternalPositionManager,
33
- FeeManager,
34
- FundDeployer,
35
- FundValueCalculator,
36
- FundValueCalculatorRouter,
37
- FundValueCalculatorUsdWrapper,
38
- FuseAdapter,
39
- FusePriceFeed,
40
- GasRelayPaymasterFactory,
41
- IdleAdapter,
42
- IdlePriceFeed,
43
- IntegrationManager,
44
- LidoStethPriceFeed,
45
- ManagementFee,
46
- MinAssetBalancesPostRedemptionPolicy,
47
- MinMaxInvestmentPolicy,
48
- OlympusV2Adapter,
49
- OnlyRemoveDustExternalPositionPolicy,
50
- OnlyUntrackDustOrPricelessAssetsPolicy,
51
- ParaSwapV5Adapter,
52
- PerformanceFee,
53
- PolicyManager,
54
- PoolTogetherV4Adapter,
55
- PoolTogetherV4PriceFeed,
56
- ProtocolFeeReserveLib,
57
- ProtocolFeeTracker,
58
- RevertingPriceFeed,
59
- SynthetixAdapter,
60
- UniswapV2ExchangeAdapter,
61
- UniswapV2LiquidityAdapter,
62
- UniswapV2PoolPriceFeed,
63
- UniswapV3Adapter,
64
- UnpermissionedActionsWrapper,
65
- UsdEthSimulatedAggregator,
66
- ValueInterpreter,
67
- VaultLib,
68
- YearnVaultV2Adapter,
69
- YearnVaultV2PriceFeed,
70
- ZeroExV2Adapter,
71
- } from '@enzymefinance/protocol';
72
-
73
- export async function getNamedSigner(name: string) {
74
- const accounts = await hre.getNamedAccounts();
75
- if (!accounts[name]) {
76
- throw new Error(`Missing account with name ${name}`);
77
- }
78
-
79
- return provider.getSignerWithAddress(accounts[name]);
80
- }
81
-
82
- export async function getUnnamedSigners() {
83
- const accounts = await hre.getUnnamedAccounts();
84
-
85
- return Promise.all(accounts.map((account) => provider.getSignerWithAddress(account)));
86
- }
87
-
88
- export async function deployProtocolFixture() {
89
- const fixture = await hre.deployments.fixture();
90
- const deployer = await getNamedSigner('deployer');
91
- const accounts = await getUnnamedSigners();
92
- const config = fixture['Config'].linkedData as DeploymentConfig;
93
-
94
- // prettier-ignore
95
- const deployment = {
96
- aaveAdapter: new AaveAdapter(fixture['AaveAdapter'].address, deployer),
97
- aaveDebtPositionLib: new AaveDebtPositionLib(fixture['AaveDebtPositionLib'].address, deployer),
98
- aaveDebtPositionParser: new AaveDebtPositionParser(fixture['AaveDebtPositionParser'].address, deployer),
99
- aavePriceFeed: new AavePriceFeed(fixture['AavePriceFeed'].address, deployer),
100
- addressListRegistry: new AddressListRegistry(fixture['AddressListRegistry'].address, deployer),
101
- allowedAdapterIncomingAssetsPolicy: new AllowedAdapterIncomingAssetsPolicy(fixture['AllowedAdapterIncomingAssetsPolicy'].address, deployer),
102
- allowedAdaptersPolicy: new AllowedAdaptersPolicy(fixture['AllowedAdaptersPolicy'].address, deployer),
103
- allowedAssetsForRedemptionPolicy: new AllowedAssetsForRedemptionPolicy(fixture['AllowedAssetsForRedemptionPolicy'].address, deployer),
104
- allowedDepositRecipientsPolicy: new AllowedDepositRecipientsPolicy(fixture['AllowedDepositRecipientsPolicy'].address, deployer),
105
- allowedExternalPositionTypesPolicy: new AllowedExternalPositionTypesPolicy(fixture['AllowedExternalPositionTypesPolicy'].address, deployer),
106
- allowedSharesTransferRecipientsPolicy: new AllowedSharesTransferRecipientsPolicy(fixture['AllowedSharesTransferRecipientsPolicy'].address, deployer),
107
- compoundAdapter: new CompoundAdapter(fixture['CompoundAdapter'].address, deployer),
108
- compoundDebtPositionLib: new CompoundDebtPositionLib(fixture['CompoundDebtPositionLib'].address, deployer),
109
- compoundDebtPositionParser: new CompoundDebtPositionParser(fixture['CompoundDebtPositionParser'].address, deployer),
110
- compoundPriceFeed: new CompoundPriceFeed(fixture['CompoundPriceFeed'].address, deployer),
111
- comptrollerLib: new ComptrollerLib(fixture['ComptrollerLib'].address, deployer),
112
- convexCurveLpStakingAdapter: new ConvexCurveLpStakingAdapter(fixture['ConvexCurveLpStakingAdapter'].address, deployer),
113
- convexCurveLpStakingWrapperFactory: new ConvexCurveLpStakingWrapperFactory(fixture['ConvexCurveLpStakingWrapperFactory'].address, deployer),
114
- convexCurveLpStakingWrapperPriceFeed: new ConvexCurveLpStakingWrapperPriceFeed(fixture['ConvexCurveLpStakingWrapperPriceFeed'].address, deployer),
115
- cumulativeSlippageTolerancePolicy: new CumulativeSlippageTolerancePolicy(fixture['CumulativeSlippageTolerancePolicy'].address, deployer),
116
- curveExchangeAdapter: new CurveExchangeAdapter(fixture['CurveExchangeAdapter'].address, deployer),
117
- curveLiquidityAdapter: new CurveLiquidityAdapter(fixture['CurveLiquidityAdapter'].address, deployer),
118
- curvePriceFeed: new CurvePriceFeed(fixture['CurvePriceFeed'].address, deployer),
119
- depositWrapper: new DepositWrapper(fixture['DepositWrapper'].address, deployer),
120
- dispatcher: new Dispatcher(fixture['Dispatcher'].address, deployer),
121
- entranceRateBurnFee: new EntranceRateBurnFee(fixture['EntranceRateBurnFee'].address, deployer),
122
- entranceRateDirectFee: new EntranceRateDirectFee(fixture['EntranceRateDirectFee'].address, deployer),
123
- exitRateBurnFee: new ExitRateBurnFee(fixture['ExitRateBurnFee'].address, deployer),
124
- exitRateDirectFee: new ExitRateDirectFee(fixture['ExitRateDirectFee'].address, deployer),
125
- externalPositionFactory: new ExternalPositionFactory(fixture['ExternalPositionFactory'].address, deployer),
126
- externalPositionManager: new ExternalPositionManager(fixture['ExternalPositionManager'].address, deployer),
127
- feeManager: new FeeManager(fixture['FeeManager'].address, deployer),
128
- fundDeployer: new FundDeployer(fixture['FundDeployer'].address, deployer),
129
- fundValueCalculator: new FundValueCalculator(fixture['FundValueCalculator'].address, deployer),
130
- fundValueCalculatorRouter: new FundValueCalculatorRouter(fixture['FundValueCalculatorRouter'].address, deployer),
131
- fundValueCalculatorUsdWrapper: new FundValueCalculatorUsdWrapper(fixture['FundValueCalculatorUsdWrapper'].address, deployer),
132
- fuseAdapter: new FuseAdapter(fixture['FuseAdapter'].address, deployer),
133
- fusePriceFeed: new FusePriceFeed(fixture['FusePriceFeed'].address, deployer),
134
- gasRelayPaymasterFactory: new GasRelayPaymasterFactory(fixture['GasRelayPaymasterFactory'].address, deployer),
135
- idleAdapter: new IdleAdapter(fixture['IdleAdapter'].address, deployer),
136
- idlePriceFeed: new IdlePriceFeed(fixture['IdlePriceFeed'].address, deployer),
137
- integrationManager: new IntegrationManager(fixture['IntegrationManager'].address, deployer),
138
- lidoStethPriceFeed: new LidoStethPriceFeed(fixture['LidoStethPriceFeed'].address, deployer),
139
- managementFee: new ManagementFee(fixture['ManagementFee'].address, deployer),
140
- minAssetBalancesPostRedemptionPolicy: new MinAssetBalancesPostRedemptionPolicy(fixture['MinAssetBalancesPostRedemptionPolicy'].address, deployer),
141
- minMaxInvestmentPolicy: new MinMaxInvestmentPolicy(fixture['MinMaxInvestmentPolicy'].address, deployer),
142
- olympusV2Adapter: new OlympusV2Adapter(fixture['OlympusV2Adapter'].address, deployer),
143
- onlyRemoveDustExternalPositionPolicy: new OnlyRemoveDustExternalPositionPolicy(fixture['OnlyRemoveDustExternalPositionPolicy'].address, deployer),
144
- onlyUntrackDustOrPricelessAssetsPolicy: new OnlyUntrackDustOrPricelessAssetsPolicy(fixture['OnlyUntrackDustOrPricelessAssetsPolicy'].address, deployer),
145
- paraSwapV5Adapter: new ParaSwapV5Adapter(fixture['ParaSwapV5Adapter'].address, deployer),
146
- performanceFee: new PerformanceFee(fixture['PerformanceFee'].address, deployer),
147
- policyManager: new PolicyManager(fixture['PolicyManager'].address, deployer),
148
- poolTogetherV4Adapter: new PoolTogetherV4Adapter(fixture['PoolTogetherV4Adapter'].address, deployer),
149
- poolTogetherV4PriceFeed: new PoolTogetherV4PriceFeed(fixture['PoolTogetherV4PriceFeed'].address, deployer),
150
- protocolFeeReserveLib: new ProtocolFeeReserveLib(fixture['ProtocolFeeReserveLib'].address, deployer),
151
- protocolFeeReserveProxy: new ProtocolFeeReserveLib(fixture['ProtocolFeeReserveProxy'].address, deployer),
152
- protocolFeeTracker: new ProtocolFeeTracker(fixture['ProtocolFeeTracker'].address, deployer),
153
- revertingPriceFeed: new RevertingPriceFeed(fixture['RevertingPriceFeed'].address, deployer),
154
- synthetixAdapter: new SynthetixAdapter(fixture['SynthetixAdapter'].address, deployer),
155
- uniswapV2ExchangeAdapter: new UniswapV2ExchangeAdapter(fixture['UniswapV2ExchangeAdapter'].address, deployer),
156
- uniswapV2LiquidityAdapter: new UniswapV2LiquidityAdapter(fixture['UniswapV2LiquidityAdapter'].address, deployer),
157
- uniswapV2PoolPriceFeed: new UniswapV2PoolPriceFeed(fixture['UniswapV2PoolPriceFeed'].address, deployer),
158
- uniswapV3Adapter: new UniswapV3Adapter(fixture['UniswapV3Adapter'].address, deployer),
159
- unpermissionedActionsWrapper: new UnpermissionedActionsWrapper(fixture['UnpermissionedActionsWrapper'].address, deployer),
160
- usdEthSimulatedAggregator: new UsdEthSimulatedAggregator(fixture['UsdEthSimulatedAggregator'].address, deployer),
161
- valueInterpreter: new ValueInterpreter(fixture['ValueInterpreter'].address, deployer),
162
- vaultLib: new VaultLib(fixture['VaultLib'].address, deployer),
163
- yearnVaultV2Adapter: new YearnVaultV2Adapter(fixture['YearnVaultV2Adapter'].address, deployer),
164
- yearnVaultV2PriceFeed: new YearnVaultV2PriceFeed(fixture['YearnVaultV2PriceFeed'].address, deployer),
165
- zeroExV2Adapter: new ZeroExV2Adapter(fixture['ZeroExV2Adapter'].address, deployer),
166
- } as const;
167
-
168
- return {
169
- accounts,
170
- config,
171
- deployer,
172
- deployment,
173
- } as const;
174
- }
175
-
176
- type Resolve<T extends () => any> = ReturnType<T> extends Promise<infer U> ? U : ReturnType<T>;
177
-
178
- export type ProtocolDeployment = Resolve<typeof deployProtocolFixture>;
179
-
180
- import type { ChainlinkRateAsset } from '@enzymefinance/protocol';
181
-
182
- export interface DeploymentConfig {
183
- feeBps: number;
184
- feeToken: string;
185
- feeTokenBurn: {
186
- burnFromVault: boolean;
187
- sendToProtocolFeeReserve: boolean;
188
- externalBurnerAddress: string;
189
- };
190
- weth: string;
191
- wrappedNativeAsset: string;
192
- primitives: Record<string, string>;
193
- gsn: {
194
- relayHub: string;
195
- relayWorker: string;
196
- trustedForwarder: string;
197
- };
198
- chainlink: {
199
- ethusd: string;
200
- aggregators: Record<string, readonly [string, ChainlinkRateAsset]>;
201
- };
202
- synthetix: {
203
- snx: string;
204
- susd: string;
205
- delegateApprovals: string;
206
- originator: string;
207
- redeemer: string;
208
- trackingCode: string;
209
- };
210
- convex: {
211
- booster: string;
212
- crvToken: string;
213
- cvxToken: string;
214
- };
215
- curve: {
216
- addressProvider: string;
217
- minter: string;
218
- pools: Record<string, { pool: string; lpToken: string; liquidityGaugeToken: string; invariantProxyAsset: string }>;
219
- };
220
- aave: {
221
- incentivesController: string;
222
- lendingPoolAddressProvider: string;
223
- protocolDataProvider: string;
224
- atokens: Record<string, [string, string]>;
225
- };
226
- compound: {
227
- ceth: string;
228
- comptroller: string;
229
- ctokens: Record<string, string>;
230
- };
231
- fuse: {
232
- fetherTokens: Record<string, string>;
233
- ftokens: Record<string, string>;
234
- };
235
- idle: {
236
- bestYieldIdleDai: string;
237
- bestYieldIdleUsdc: string;
238
- bestYieldIdleUsdt: string;
239
- bestYieldIdleSusd: string;
240
- bestYieldIdleTusd: string;
241
- bestYieldIdleWbtc: string;
242
- riskAdjustedIdleDai: string;
243
- riskAdjustedIdleUsdc: string;
244
- riskAdjustedIdleUsdt: string;
245
- };
246
- lido: {
247
- steth: string;
248
- };
249
- olympusV2: {
250
- stakingContract: string;
251
- };
252
- paraSwapV5: {
253
- augustusSwapper: string;
254
- tokenTransferProxy: string;
255
- };
256
- poolTogetherV4: {
257
- ptTokens: Record<string, [string, string]>;
258
- };
259
- positionsLimit: number;
260
- unsupportedAssets: Record<string, string>;
261
- uniswap: {
262
- factory: string;
263
- router: string;
264
- pools: Record<string, string>;
265
- };
266
- uniswapV3: {
267
- router: string;
268
- nonFungiblePositionManager: string;
269
- };
270
- yearn: {
271
- vaultV2: {
272
- registry: string;
273
- yVaults: Record<string, string>;
274
- };
275
- };
276
- zeroex: {
277
- exchange: string;
278
- allowedMakers: string[];
279
- };
280
- }
package/src/gasRelayer.ts DELETED
@@ -1,95 +0,0 @@
1
- import type { ContractReceipt } from '@enzymefinance/ethers';
2
- import type { CreateSignedRelayRequestOptions } from '@enzymefinance/protocol';
3
- import { createSignedRelayRequest, IGsnRelayHub, isTypedDataSigner } from '@enzymefinance/protocol';
4
- import type { BigNumberish } from 'ethers';
5
- import { BigNumber, utils } from 'ethers';
6
-
7
- import { assertEvent } from './assertions';
8
-
9
- export interface RelayTransactionOptions extends CreateSignedRelayRequestOptions {
10
- relayHub: string;
11
- }
12
-
13
- export async function relayTransaction(options: RelayTransactionOptions) {
14
- const signer = options.sendFunction.contract.signer;
15
- if (!(signer && isTypedDataSigner(signer))) {
16
- throw new Error('Missing or invalid signer');
17
- }
18
-
19
- const { relayData, relayRequest, signedRelayRequest } = await createSignedRelayRequest(options);
20
-
21
- // NOTE: In the real implementation, we fetch these from the relayer.
22
- const defaultGasLimit = 12450000;
23
- const defaultMaxAcceptance = BigNumber.from(150000);
24
-
25
- // NOTE: There is an inconsistency between how the typed data object shape and the relayCall argument.
26
- const mergedRelayRequest = {
27
- relayData,
28
- request: relayRequest,
29
- };
30
-
31
- const relayHub = new IGsnRelayHub(options.relayHub, provider.getSigner(options.relayWorker));
32
-
33
- return relayHub.relayCall
34
- .args(defaultMaxAcceptance, mergedRelayRequest, signedRelayRequest, '0x', defaultGasLimit)
35
- .gas(defaultGasLimit, relayData.gasPrice)
36
- .send();
37
- }
38
-
39
- const relayed = utils.EventFragment.fromString(
40
- 'TransactionRelayed(address indexed relayManager, address indexed relayWorker, address indexed from, address to, address paymaster, bytes4 selector, uint8 status, uint256 charge)',
41
- );
42
-
43
- const rejected = utils.EventFragment.fromString(
44
- 'TransactionRejectedByPaymaster(address indexed relayManager, address indexed paymaster, address indexed from, address to, address relayWorker, bytes4 selector, uint256 innerGasUsed, bytes reason)',
45
- );
46
-
47
- export function assertDidRelay(receipt: ContractReceipt<any>) {
48
- return assertEvent(receipt, relayed, {
49
- charge: expect.anything(),
50
- from: expect.any(String),
51
- paymaster: expect.any(String),
52
- relayManager: expect.any(String),
53
- relayWorker: expect.any(String),
54
- selector: expect.any(String),
55
- status: expect.anything(),
56
- to: expect.any(String),
57
- });
58
- }
59
-
60
- export function assertDidRelaySuccessfully(receipt: ContractReceipt<any>) {
61
- const result = assertDidRelay(receipt);
62
- expect(result.status).toEqBigNumber(0);
63
- }
64
-
65
- export function assertDidRelayWithError(receipt: ContractReceipt<any>) {
66
- const result = assertDidRelay(receipt);
67
- expect(result.status).toEqBigNumber(1);
68
- }
69
-
70
- export function assertDidRelayWithCharge(
71
- receipt: ContractReceipt<any>,
72
- amount: BigNumberish,
73
- tolerance?: BigNumberish,
74
- ) {
75
- const result = assertDidRelay(receipt);
76
- expect(result.charge).toBeAroundBigNumber(amount, tolerance);
77
- }
78
-
79
- export function assertPaymasterDidReject(receipt: ContractReceipt<any>) {
80
- return assertEvent(receipt, rejected, {
81
- from: expect.any(String),
82
- innerGasUsed: expect.anything(),
83
- paymaster: expect.any(String),
84
- reason: expect.any(String),
85
- relayManager: expect.any(String),
86
- relayWorker: expect.any(String),
87
- selector: expect.any(String),
88
- to: expect.any(String),
89
- });
90
- }
91
-
92
- export function assertPaymasterDidRejectForReason(receipt: ContractReceipt<any>, reason: string) {
93
- const params = assertPaymasterDidReject(receipt);
94
- expect(utils.toUtf8String('0x' + params.reason.substr(138))).toMatch(reason);
95
- }
package/src/helpers.ts DELETED
@@ -1,39 +0,0 @@
1
- import type { AddressLike, ContractReceipt } from '@enzymefinance/ethers';
2
- import type { ValueInterpreter } from '@enzymefinance/protocol';
3
- import type { BigNumberish } from 'ethers';
4
- import { BigNumber, utils } from 'ethers';
5
-
6
- export async function transactionTimestamp(receipt: ContractReceipt<any>) {
7
- const block = await provider.getBlock(receipt.blockNumber);
8
-
9
- return block.timestamp;
10
- }
11
-
12
- export async function calcMlnValueAndBurnAmountForSharesBuyback({
13
- valueInterpreter,
14
- mln,
15
- denominationAsset,
16
- sharesSupply,
17
- gav,
18
- buybackSharesAmount,
19
- }: {
20
- valueInterpreter: ValueInterpreter;
21
- mln: AddressLike;
22
- denominationAsset: AddressLike;
23
- sharesSupply: BigNumberish;
24
- gav: BigNumberish;
25
- buybackSharesAmount: BigNumberish;
26
- }) {
27
- // Calculate expected mlnValue of shares to buyback
28
- // TODO: calcGrossShareValue can also be a helper util
29
- const grossShareValue = BigNumber.from(gav).mul(utils.parseEther('1')).div(sharesSupply);
30
- const denominationAssetValueOfBuyback = grossShareValue.mul(buybackSharesAmount).div(utils.parseEther('1'));
31
- const mlnValueOfBuyback = await valueInterpreter.calcCanonicalAssetValue
32
- .args(denominationAsset, denominationAssetValueOfBuyback, mln)
33
- .call();
34
-
35
- // 50% discount
36
- const mlnAmountToBurn = mlnValueOfBuyback.div(2);
37
-
38
- return { mlnAmountToBurn, mlnValue: mlnValueOfBuyback };
39
- }
package/src/index.ts DELETED
@@ -1,6 +0,0 @@
1
- export * from './deployment';
2
- export * from './scaffolding';
3
- export * from './assertions';
4
- export * from './helpers';
5
- export * from './whales';
6
- export * from './gasRelayer';
@@ -1,37 +0,0 @@
1
- import type { SignerWithAddress } from '@enzymefinance/hardhat';
2
- import type { ComptrollerLib, IntegrationManager, StandardToken } from '@enzymefinance/protocol';
3
- import type { BigNumberish } from 'ethers';
4
-
5
- import { addTrackedAssetsToVault } from './extensions/integrations/trackedAssets';
6
-
7
- export async function addNewAssetsToFund({
8
- signer,
9
- comptrollerProxy,
10
- integrationManager,
11
- assets,
12
- amounts = new Array(assets.length).fill(1),
13
- }: {
14
- signer: SignerWithAddress;
15
- comptrollerProxy: ComptrollerLib;
16
- integrationManager: IntegrationManager;
17
- assets: StandardToken[];
18
- amounts?: BigNumberish[];
19
- }) {
20
- // First, add tracked assets
21
- const receipt = addTrackedAssetsToVault({
22
- assets,
23
- comptrollerProxy,
24
- integrationManager,
25
- signer,
26
- });
27
-
28
- // Then seed the vault with balances as necessary
29
- const vaultProxy = await comptrollerProxy.getVaultProxy();
30
- for (const i in assets) {
31
- if (amounts[i] > 0) {
32
- await assets[i].transfer(vaultProxy, amounts[i]);
33
- }
34
- }
35
-
36
- return receipt;
37
- }
@@ -1,8 +0,0 @@
1
- import type { MockChainlinkPriceSource } from '@enzymefinance/protocol';
2
- import type { BigNumberish } from 'ethers';
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
- }
@@ -1,11 +0,0 @@
1
- import type { AddressLike } from '@enzymefinance/ethers';
2
- import { StandardToken } from '@enzymefinance/protocol';
3
- import { utils } from 'ethers';
4
-
5
- export async function getAssetBalances({ account, assets }: { account: AddressLike; assets: AddressLike[] }) {
6
- return Promise.all(assets.map((asset) => new StandardToken(asset, provider).balanceOf(account)));
7
- }
8
-
9
- export async function getAssetUnit(asset: StandardToken) {
10
- return utils.parseUnits('1', await asset.decimals());
11
- }
@@ -1,103 +0,0 @@
1
- import type { Dispatcher, GasRelayPaymasterFactory, ValueInterpreter } from '@enzymefinance/protocol';
2
- import {
3
- ComptrollerLib,
4
- ExternalPositionManager,
5
- FeeManager,
6
- FundDeployer,
7
- IntegrationManager,
8
- PolicyManager,
9
- ProtocolFeeTracker,
10
- VaultLib,
11
- } from '@enzymefinance/protocol';
12
- import type { Signer } from 'ethers';
13
-
14
- // TODO: Should refactor this function to take all deployment contracts and set up everything by default,
15
- // unless overrides are passed-in
16
- export async function createFundDeployer({
17
- deployer,
18
- externalPositionManager,
19
- dispatcher,
20
- gasRelayPaymasterFactory,
21
- valueInterpreter,
22
- vaultLib,
23
- setOnDispatcher = true,
24
- setReleaseLive = true,
25
- }: {
26
- deployer: Signer;
27
- externalPositionManager: ExternalPositionManager;
28
- dispatcher: Dispatcher;
29
- feeManager: FeeManager;
30
- gasRelayPaymasterFactory: GasRelayPaymasterFactory;
31
- integrationManager: IntegrationManager;
32
- policyManager: PolicyManager;
33
- valueInterpreter: ValueInterpreter;
34
- vaultLib: VaultLib;
35
- setOnDispatcher?: boolean;
36
- setReleaseLive?: boolean;
37
- }) {
38
- const mlnToken = await vaultLib.getMlnToken();
39
- const wethToken = await vaultLib.getWethToken();
40
-
41
- // TODO: Shortcut for now, can pass in param later
42
- const protocolFeeReserve = await vaultLib.getProtocolFeeReserve();
43
-
44
- const nextFundDeployer = await FundDeployer.deploy(deployer, dispatcher, gasRelayPaymasterFactory);
45
-
46
- // Re-deploy extensions with new FundDeployer
47
- const nextPolicyManager = await PolicyManager.deploy(deployer, nextFundDeployer, gasRelayPaymasterFactory);
48
- const nextExternalPositionManager = await ExternalPositionManager.deploy(
49
- deployer,
50
- nextFundDeployer,
51
- await externalPositionManager.getExternalPositionFactory(),
52
- nextPolicyManager,
53
- );
54
- const nextFeeManager = await FeeManager.deploy(deployer, nextFundDeployer);
55
- const nextIntegrationManager = await IntegrationManager.deploy(
56
- deployer,
57
- nextFundDeployer,
58
- nextPolicyManager,
59
- valueInterpreter,
60
- );
61
-
62
- const nextComptrollerLib = await ComptrollerLib.deploy(
63
- deployer,
64
- dispatcher,
65
- protocolFeeReserve,
66
- nextFundDeployer,
67
- valueInterpreter,
68
- nextExternalPositionManager,
69
- nextFeeManager,
70
- nextIntegrationManager,
71
- nextPolicyManager,
72
- gasRelayPaymasterFactory,
73
- mlnToken,
74
- wethToken,
75
- );
76
-
77
- await nextFundDeployer.setComptrollerLib(nextComptrollerLib);
78
-
79
- const nextProtocolFeeTracker = await ProtocolFeeTracker.deploy(deployer, nextFundDeployer);
80
- await nextFundDeployer.setProtocolFeeTracker(nextProtocolFeeTracker);
81
-
82
- const nextVaultLib = await VaultLib.deploy(
83
- deployer,
84
- externalPositionManager,
85
- await vaultLib.getGasRelayPaymasterFactory(),
86
- await vaultLib.getProtocolFeeReserve(),
87
- nextProtocolFeeTracker,
88
- await vaultLib.getMlnToken(),
89
- await vaultLib.getMlnBurner(),
90
- await vaultLib.getWethToken(),
91
- await vaultLib.getPositionsLimit(),
92
- );
93
- await nextFundDeployer.setVaultLib(nextVaultLib);
94
-
95
- if (setReleaseLive) {
96
- await nextFundDeployer.setReleaseLive();
97
- }
98
- if (setOnDispatcher) {
99
- await dispatcher.setCurrentFundDeployer(nextFundDeployer);
100
- }
101
-
102
- return nextFundDeployer;
103
- }
@@ -1,30 +0,0 @@
1
- import type { AddressLike } from '@enzymefinance/ethers';
2
- import type { SignerWithAddress } from '@enzymefinance/hardhat';
3
- import type { ComptrollerLib } from '@enzymefinance/protocol';
4
- import type { 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
- }