Skip to content

Commit dfb19a0

Browse files
committed
test: add swapETHForEnzymeVaultShare tests
1 parent 6944eff commit dfb19a0

19 files changed

+612
-198
lines changed

contracts/external/WETH9.sol

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
// SPDX-License-Identifier: GPL-3.0-only
22

3-
pragma solidity ^0.5.0;
3+
pragma solidity ^0.8.28;
44

5-
import "../interfaces/IERC20.sol";
5+
contract WETH9 {
66

7-
contract WETH9 is IERC20 {
87
string public name = "Wrapped Ether";
98
string public symbol = "WETH";
109
uint8 public decimals = 18;
@@ -23,9 +22,9 @@ contract WETH9 is IERC20 {
2322
}
2423

2524
function withdraw(uint wad) public {
26-
require(balanceOf[msg.sender] >= wad, "");
25+
require(balanceOf[msg.sender] >= wad, "ERC20: transfer amount exceeds balance");
2726
balanceOf[msg.sender] -= wad;
28-
msg.sender.transfer(wad);
27+
payable(msg.sender).transfer(wad);
2928
emit Withdrawal(msg.sender, wad);
3029
}
3130

@@ -44,13 +43,14 @@ contract WETH9 is IERC20 {
4443
}
4544

4645
function transferFrom(address src, address dst, uint wad) public returns (bool){
47-
require(balanceOf[src] >= wad, "");
4846

49-
if (src != msg.sender && allowance[src][msg.sender] != uint(- 1)) {
50-
require(allowance[src][msg.sender] >= wad, "");
47+
if (src != msg.sender && allowance[src][msg.sender] != type(uint).max) {
48+
require(allowance[src][msg.sender] >= wad, "ERC20: insufficient allowance");
5149
allowance[src][msg.sender] -= wad;
5250
}
5351

52+
require(balanceOf[src] >= wad, "ERC20: transfer amount exceeds balance");
53+
5454
balanceOf[src] -= wad;
5555
balanceOf[dst] += wad;
5656

contracts/external/enzyme/IEnzymeFundValueCalculatorRouter.sol

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
pragma solidity >=0.5.0;
44

55
interface IEnzymeFundValueCalculatorRouter {
6-
function calcGrossShareValue(address _vaultProxy)
7-
external
8-
returns (address denominationAsset_, uint256 grossShareValue_);
96

10-
function calcNetShareValue(address _vaultProxy)
11-
external
12-
returns (address denominationAsset_, uint256 netShareValue_);
13-
}
7+
function calcGrossShareValue(
8+
address _vaultProxy
9+
) external returns (address denominationAsset_, uint256 grossShareValue_);
1410

11+
function calcNetShareValue(
12+
address _vaultProxy
13+
) external returns (address denominationAsset_, uint256 netShareValue_);
1514

15+
}

contracts/external/enzyme/IEnzymePolicyManager.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
pragma solidity >=0.5.0;
44

55
interface IPolicyManager {
6+
67
function updatePolicySettingsForFund(
78
address _comptrollerProxy,
89
address _policy,
910
bytes calldata _settingsData
1011
) external;
11-
}
12-
1312

13+
}

contracts/external/enzyme/IEnzymeV4Comptroller.sol

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,15 @@
33
pragma solidity >=0.5.0;
44

55
interface IEnzymeV4Comptroller {
6-
function getDenominationAsset() external view returns (address denominationAsset_);
7-
function redeemSharesForSpecificAssets(
8-
address _recipient,
9-
uint256 _sharesQuantity,
10-
address[] calldata _payoutAssets,
11-
uint256[] calldata _payoutAssetPercentages
12-
) external returns (uint256[] memory payoutAmounts_);
136

14-
function vaultCallOnContract(
15-
address _contract,
16-
bytes4 _selector,
17-
bytes calldata _encodedArgs
18-
) external;
7+
function getDenominationAsset() external view returns (address denominationAsset_);
8+
9+
function redeemSharesForSpecificAssets(
10+
address _recipient,
11+
uint256 _sharesQuantity,
12+
address[] calldata _payoutAssets,
13+
uint256[] calldata _payoutAssetPercentages
14+
) external returns (uint256[] memory payoutAmounts_);
1915

2016
function buyShares(uint _investmentAmount, uint _minSharesQuantity) external;
2117
}

contracts/external/enzyme/IEnzymeV4DepositWrapper.sol

Lines changed: 0 additions & 14 deletions
This file was deleted.

contracts/external/enzyme/IEnzymeV4Vault.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
pragma solidity >=0.5.0;
44

55
interface IEnzymeV4Vault {
6+
67
function getAccessor() external view returns (address);
78

89
function getOwner() external view returns (address);
910

1011
function mintShares(address, uint256) external;
12+
1113
}

contracts/interfaces/ISwapOperator.sol

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ interface ISwapOperator {
4747

4848
function enzymeV4VaultProxyAddress() external view returns (address);
4949

50-
function enzymeFundValueCalculatorRouter() external view returns (IEnzymeFundValueCalculatorRouter);
51-
5250
/* ==== MUTATIVE FUNCTIONS ==== */
5351

5452
function placeOrder(GPv2Order.Data calldata order, bytes calldata orderUID) external;
@@ -85,8 +83,8 @@ interface ISwapOperator {
8583
error ToAmountTooLow(uint expectedToAmount, uint actualToAmount);
8684

8785
// order amounts vs actual amounts
88-
error SwappedFromAmountTooHigh(uint expectedFromAmount, uint actualFromAmount);
89-
error SwappedToAmountTooLow(uint expectedToAmount, uint actualToAmount);
86+
error SwappedFromAmountTooHigh(uint expectedMaxFromAmount, uint actualFromAmount);
87+
error SwappedToAmountTooLow(uint expectedMinToAmount, uint actualToAmount);
9088

9189
error FeeNotZero();
9290
error InvalidDenominationAsset(address expectedAsset, address actualAsset);

contracts/mocks/modules/SwapOperator/SOMockEnzymeFundValueCalculatorRouter.sol

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,91 @@
11
// SPDX-License-Identifier: GPL-3.0-only
22

3-
pragma solidity ^0.5.17;
3+
pragma solidity ^0.8.28;
44

55
import "../../../external/enzyme/IEnzymeV4Comptroller.sol";
66
import "./SOMockEnzymeV4Vault.sol";
7+
import "./SOMockExtraSpender.sol";
78

89
contract SOMockEnzymeV4Comptroller is IEnzymeV4Comptroller {
910

10-
address weth;
11-
SOMockEnzymeV4Vault private vault;
11+
ERC20 internal denominationAsset;
12+
SOMockEnzymeV4Vault internal vault;
1213

13-
uint public ethToSharesRate = 10000;
14+
// mock helpers
15+
uint internal sharesToMintOnDeposit;
16+
uint internal amountToPullOnDeposit;
17+
uint internal sharesToBurnOnRedeem;
18+
uint internal amountToPushOnRedeem;
1419

15-
constructor(address _weth) public {
16-
weth = _weth;
20+
// bypasses the allowance and pulls an extra amount using another address
21+
SOMockExtraSpender public extraSpender;
22+
uint public extraExpenseAmount;
23+
24+
constructor(address _denominationAsset, SOMockEnzymeV4Vault _vault) {
25+
denominationAsset = ERC20(_denominationAsset);
26+
vault = _vault;
27+
extraSpender = new SOMockExtraSpender();
28+
}
29+
30+
function setDepositMockAmounts(uint _sharesToMintOnDeposit, uint _amountToPullOnDeposit) external {
31+
sharesToMintOnDeposit = _sharesToMintOnDeposit;
32+
amountToPullOnDeposit = _amountToPullOnDeposit;
1733
}
1834

19-
function getDenominationAsset() external view returns (address denominationAsset_) {
20-
return weth;
35+
function setExtraExpenseAmount(uint _extraExpenseAmount) external {
36+
extraExpenseAmount = _extraExpenseAmount;
37+
}
38+
39+
function setRedeemMockAmounts(uint _sharesToBurnOnRedeem, uint _amountToPushOnRedeem) external {
40+
sharesToBurnOnRedeem = _sharesToBurnOnRedeem;
41+
amountToPushOnRedeem = _amountToPushOnRedeem;
42+
}
43+
44+
function setDenominationAsset(address _denominationAsset) external {
45+
denominationAsset = ERC20(_denominationAsset);
46+
}
47+
48+
function getDenominationAsset() external view returns (address) {
49+
return address(denominationAsset);
50+
}
51+
52+
event BuyCalledWith(
53+
uint _investmentAmount,
54+
uint _minSharesQuantity
55+
);
56+
57+
function buyShares(uint _investmentAmount, uint _minSharesQuantity) external {
58+
59+
denominationAsset.transferFrom(msg.sender, address(vault), amountToPullOnDeposit);
60+
vault.mint(msg.sender, sharesToMintOnDeposit);
61+
62+
if (extraExpenseAmount > 0) {
63+
extraSpender.spend(denominationAsset, msg.sender, extraExpenseAmount);
64+
}
65+
66+
emit BuyCalledWith(_investmentAmount, _minSharesQuantity);
2167
}
2268

69+
event RedeemCalledWith(
70+
address indexed _recipient,
71+
uint _sharesQuantity,
72+
address[] _payoutAssets,
73+
uint[] _payoutAssetPercentages
74+
);
75+
2376
function redeemSharesForSpecificAssets(
2477
address _recipient,
25-
uint256 _sharesQuantity,
26-
address[] calldata /* _payoutAssets */,
27-
uint256[] calldata /* _payoutAssetPercentages */
28-
) external returns (uint256[] memory payoutAmounts_) {
29-
payoutAmounts_ = new uint256[](0);
78+
uint _sharesQuantity,
79+
address[] calldata _payoutAssets,
80+
uint[] calldata _payoutAssetPercentages
81+
) external returns (uint[] memory payoutAmounts) {
3082

31-
vault.burn(_recipient, _sharesQuantity);
32-
IERC20(weth).transfer(_recipient, _sharesQuantity * 10000 / ethToSharesRate);
83+
payoutAmounts = new uint[](0); // unchecked
84+
85+
vault.burn(_recipient, sharesToBurnOnRedeem);
86+
vault.withdraw(denominationAsset, _recipient, amountToPushOnRedeem);
87+
88+
emit RedeemCalledWith(_recipient, _sharesQuantity, _payoutAssets, _payoutAssetPercentages);
3389
}
3490

3591
function vaultCallOnContract(
@@ -39,17 +95,4 @@ contract SOMockEnzymeV4Comptroller is IEnzymeV4Comptroller {
3995
) external {
4096
// no-op
4197
}
42-
43-
function buyShares(uint _investmentAmount, uint /* _minSharesQuantity */) external {
44-
uint shares = _investmentAmount * ethToSharesRate / 10000;
45-
vault.mint(msg.sender, shares);
46-
}
47-
48-
function setETHToVaultSharesRate(uint _ethToSharesRate) public {
49-
ethToSharesRate = _ethToSharesRate;
50-
}
51-
52-
function setVault(SOMockEnzymeV4Vault _vault) public {
53-
vault = _vault;
54-
}
5598
}

contracts/mocks/modules/SwapOperator/SOMockEnzymeV4DepositWrapper.sol

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)