Skip to content

Commit 794e681

Browse files
Merge pull request #70 from 0xIntuition/mihailo/invariant-test-assertions
add assertions to EthMultiVaultActor and add protocol vault balance checks on redeemAtom and redeemTriple
2 parents 6fb6cb0 + 6e0793b commit 794e681

File tree

7 files changed

+131
-27
lines changed

7 files changed

+131
-27
lines changed

test/invariant/EthMultiVaultBasicaInvariant.t.sol renamed to test/invariant/EthMultiVaultBasicInvariant.t.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// SPDX-License-Identifier: AGPL-3.0-only
1+
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.21;
33

44
import "forge-std/Test.sol";
5+
56
import {EthMultiVaultActor} from "./actors/EthMultiVaultActor.sol";
67
import {InvariantEthMultiVaultBase} from "./InvariantEthMultiVaultBase.sol";
78

test/invariant/EthMultiVaultSingleVaultInvariant.t.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// SPDX-License-Identifier: AGPL-3.0-only
1+
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.21;
33

44
import "forge-std/Test.sol";
5+
56
import {EthMultiVaultSingleVaultActor} from "./actors/EthMultiVaultSingleVaultActor.sol";
67
import {InvariantEthMultiVaultBase} from "./InvariantEthMultiVaultBase.sol";
78

test/invariant/InvariantEthMultiVaultBase.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// SPDX-License-Identifier: MIT
12
pragma solidity ^0.8.21;
23

34
import {EthMultiVaultBase} from "../EthMultiVaultBase.sol";

test/invariant/actors/EthMultiVaultActor.sol

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.21;
33

4-
import {EthMultiVault} from "src/EthMultiVault.sol";
54
import "forge-std/Test.sol";
65

7-
contract EthMultiVaultActor is Test {
6+
import {EthMultiVault} from "src/EthMultiVault.sol";
7+
import {EthMultiVaultHelpers} from "../../helpers/EthMultiVaultHelpers.sol";
8+
9+
contract EthMultiVaultActor is Test, EthMultiVaultHelpers {
810
// actor arrays
911
uint256[] public actorPks;
1012
address[] public actors;
@@ -36,14 +38,6 @@ contract EthMultiVaultActor is Test {
3638
//actors.push(msg.sender);
3739
}
3840

39-
function getAtomCost() public view returns (uint256 atomCost) {
40-
(atomCost,) = actEthMultiVault.atomConfig();
41-
}
42-
43-
function getMinDeposit() public view returns (uint256 minDeposit) {
44-
(,,, minDeposit,,,,) = actEthMultiVault.generalConfig();
45-
}
46-
4741
function getVaultTotalAssets(uint256 vaultId) public view returns (uint256 totalAssets) {
4842
(totalAssets,) = actEthMultiVault.vaults(vaultId);
4943
}
@@ -57,6 +51,12 @@ contract EthMultiVaultActor is Test {
5751
return shares;
5852
}
5953

54+
function getAssetsForReceiverBeforeFees(uint256 shares, uint256 vaultId) public view returns (uint256) {
55+
(, uint256 calculatedAssetsForReceiver, uint256 protocolFees, uint256 exitFees) =
56+
actEthMultiVault.getRedeemAssetsAndFees(shares, vaultId);
57+
return calculatedAssetsForReceiver + protocolFees + exitFees;
58+
}
59+
6060
function createAtom(bytes calldata _data, uint256 msgValue, uint256 actorIndexSeed)
6161
public
6262
useActor(actorIndexSeed)
@@ -87,8 +87,22 @@ contract EthMultiVaultActor is Test {
8787
}
8888
emit log_named_uint("msg.sender.balance Right before create", currentActor.balance);
8989
emit log_named_address("msg.sender-----", currentActor);
90+
91+
uint256 totalAssetsBefore = vaultTotalAssets(ethMultiVault.count() + 1);
92+
uint256 totalSharesBefore = vaultTotalShares(ethMultiVault.count() + 1);
93+
94+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
95+
9096
// create atom
9197
uint256 id = actEthMultiVault.createAtom{value: msgValue}(_data);
98+
assertEq(id, actEthMultiVault.count());
99+
100+
checkDepositOnAtomVaultCreation(id, msgValue, totalAssetsBefore, totalSharesBefore);
101+
102+
uint256 userDeposit = msgValue - getAtomCost();
103+
104+
checkProtocolVaultBalanceOnVaultCreation(id, userDeposit, protocolVaultBalanceBefore);
105+
92106
// logs
93107
emit log_named_uint(
94108
"------------------------------------ POST STATE ------------------------------------------", 6000000009
@@ -130,7 +144,19 @@ contract EthMultiVaultActor is Test {
130144
msgValue = bound(msgValue, getMinDeposit(), 10 ether);
131145
vm.deal(currentActor, msgValue);
132146
emit log_named_uint("|||||||||||||||||||||||||||||||||||BRANCH 1|||||||||||||||||||||||||||||||||||", 1);
147+
148+
uint256 totalAssetsBefore = vaultTotalAssets(_vaultId);
149+
uint256 totalSharesBefore = vaultTotalShares(_vaultId);
150+
151+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
152+
133153
shares = actEthMultiVault.depositAtom{value: msgValue}(_receiver, _vaultId);
154+
155+
checkDepositIntoVault(
156+
msgValue - getProtocolFeeAmount(msgValue, _vaultId), _vaultId, totalAssetsBefore, totalSharesBefore
157+
);
158+
159+
checkProtocolVaultBalance(_vaultId, msgValue, protocolVaultBalanceBefore);
134160
} else {
135161
// deposit on existing vault
136162
// bound _vaultId between 1 and count()
@@ -144,7 +170,19 @@ contract EthMultiVaultActor is Test {
144170
msgValue = bound(msgValue, getAtomCost(), 10 ether);
145171
vm.deal(currentActor, msgValue);
146172
emit log_named_uint("|||||||||||||||||||||||||||||||||||BRANCH 2|||||||||||||||||||||||||||||||||||", 2);
173+
174+
uint256 totalAssetsBefore = vaultTotalAssets(_vaultId);
175+
uint256 totalSharesBefore = vaultTotalShares(_vaultId);
176+
177+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
178+
147179
shares = actEthMultiVault.depositAtom{value: msgValue}(_receiver, _vaultId);
180+
181+
checkDepositIntoVault(
182+
msgValue - getProtocolFeeAmount(msgValue, _vaultId), _vaultId, totalAssetsBefore, totalSharesBefore
183+
);
184+
185+
checkProtocolVaultBalance(_vaultId, msgValue, protocolVaultBalanceBefore);
148186
}
149187
// deposit atom
150188
emit log_named_uint("balance currentActor", currentActor.balance);
@@ -201,7 +239,7 @@ contract EthMultiVaultActor is Test {
201239
emit log_named_uint("vaultTAssets--", getVaultTotalShares(_vaultId));
202240
emit log_named_uint("vaultBalanceOf", getVaultBalanceForAddress(_vaultId, currentActor));
203241
msgValue = bound(msgValue, getAtomCost(), 10 ether);
204-
emit log_named_uint("REEEEgetVaultTotalAssets(_vaultId)", getVaultTotalAssets(_vaultId));
242+
emit log_named_uint("REEEE getVaultTotalAssets(_vaultId)", getVaultTotalAssets(_vaultId));
205243
emit log_named_uint("REEEE getVaultTotalShares(_vaultId)", getVaultTotalShares(_vaultId));
206244
emit log_named_uint("|||||||||||||||||||||||||||||||BRANCH 2||||||||||||||||||||||||||||||||||||", 2);
207245
_shares2Redeem = actEthMultiVault.depositAtom{value: msgValue}(currentActor, _vaultId);
@@ -220,8 +258,20 @@ contract EthMultiVaultActor is Test {
220258
emit log_named_uint("before vaultTAssets------", getVaultTotalShares(_vaultId));
221259
emit log_named_uint("before vaultBalanceOf----", getVaultBalanceForAddress(_vaultId, currentActor));
222260

261+
// snapshots before redeem
262+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
263+
uint256 userSharesBeforeRedeem = getSharesInVault(_vaultId, _receiver);
264+
uint256 userBalanceBeforeRedeem = address(_receiver).balance;
265+
266+
uint256 assetsForReceiverBeforeFees = getAssetsForReceiverBeforeFees(userSharesBeforeRedeem, _vaultId);
267+
223268
// redeem atom
224-
uint256 assets = actEthMultiVault.redeemAtom(_shares2Redeem, _receiver, _vaultId);
269+
uint256 assetsForReceiver = actEthMultiVault.redeemAtom(_shares2Redeem, _receiver, _vaultId);
270+
271+
checkProtocolVaultBalance(_vaultId, assetsForReceiverBeforeFees, protocolVaultBalanceBefore);
272+
273+
assertEq(getSharesInVault(_vaultId, _receiver), userSharesBeforeRedeem - _shares2Redeem);
274+
assertEq(address(_receiver).balance - userBalanceBeforeRedeem, assetsForReceiver);
225275

226276
// logs
227277
emit log_named_uint(
@@ -231,9 +281,10 @@ contract EthMultiVaultActor is Test {
231281
emit log_named_uint("vaultTAssets------", getVaultTotalShares(_vaultId));
232282
emit log_named_uint("vaultBalanceOf----", getVaultBalanceForAddress(_vaultId, currentActor));
233283
emit log_named_uint(
234-
"==================================== ACTOR redeemAtom END ====================================", assets
284+
"==================================== ACTOR redeemAtom END ====================================",
285+
assetsForReceiver
235286
);
236-
return assets;
287+
return assetsForReceiver;
237288
}
238289

239290
receive() external payable {}

test/invariant/actors/EthMultiVaultSingleVaultActor.sol

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
// SPDX-License-Identifier: MIT
12
pragma solidity ^0.8.21;
23

3-
import {EthMultiVault} from "src/EthMultiVault.sol";
44
import "forge-std/Test.sol";
55

6-
contract EthMultiVaultSingleVaultActor is Test {
6+
import {EthMultiVault} from "src/EthMultiVault.sol";
7+
import {EthMultiVaultHelpers} from "../../helpers/EthMultiVaultHelpers.sol";
8+
9+
contract EthMultiVaultSingleVaultActor is Test, EthMultiVaultHelpers {
710
// actor arrays
811
uint256[] public actorPks;
912
address[] public actors;
@@ -35,10 +38,6 @@ contract EthMultiVaultSingleVaultActor is Test {
3538
//actEthMultiVault.createAtom{value: actEthMultiVault.getAtomCost()}("PEPE");
3639
}
3740

38-
function getAtomCost() public view returns (uint256 atomCost) {
39-
(atomCost,) = actEthMultiVault.atomConfig();
40-
}
41-
4241
function getVaultTotalAssets(uint256 vaultId) public view returns (uint256 totalAssets) {
4342
(totalAssets,) = actEthMultiVault.vaults(vaultId);
4443
}
@@ -52,6 +51,12 @@ contract EthMultiVaultSingleVaultActor is Test {
5251
return shares;
5352
}
5453

54+
function getAssetsForReceiverBeforeFees(uint256 shares, uint256 vaultId) public view returns (uint256) {
55+
(, uint256 calculatedAssetsForReceiver, uint256 protocolFees, uint256 exitFees) =
56+
actEthMultiVault.getRedeemAssetsAndFees(shares, vaultId);
57+
return calculatedAssetsForReceiver + protocolFees + exitFees;
58+
}
59+
5560
function depositAtom(address _receiver, uint256 msgValue, uint256 actorIndexSeed)
5661
public
5762
useActor(actorIndexSeed)
@@ -75,7 +80,21 @@ contract EthMultiVaultSingleVaultActor is Test {
7580
// bound msgValue to between minDeposit and 10 ether
7681
msgValue = bound(msgValue, getAtomCost(), 10 ether);
7782
vm.deal(currentActor, msgValue);
83+
84+
uint256 totalAssetsBefore = vaultTotalAssets(_vaultId);
85+
uint256 totalSharesBefore = vaultTotalShares(_vaultId);
86+
87+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
88+
89+
// deposit atom
7890
uint256 shares = actEthMultiVault.depositAtom{value: msgValue}(_receiver, _vaultId);
91+
92+
checkDepositIntoVault(
93+
msgValue - getProtocolFeeAmount(msgValue, _vaultId), _vaultId, totalAssetsBefore, totalSharesBefore
94+
);
95+
96+
checkProtocolVaultBalance(_vaultId, msgValue, protocolVaultBalanceBefore);
97+
7998
// logs
8099
emit log_named_uint(
81100
"------------------------------------ POST STATE -------------------------------------------", 6000000009
@@ -125,8 +144,24 @@ contract EthMultiVaultSingleVaultActor is Test {
125144
emit log_named_uint("before vaultTAssets------", getVaultTotalAssets(_vaultId));
126145
emit log_named_uint("before vaultBalanceOf----", getVaultBalanceForAddress(_vaultId, currentActor));
127146

147+
// snapshots before redeem
148+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
149+
uint256 userSharesBeforeRedeem = getSharesInVault(_vaultId, _receiver);
150+
uint256 userBalanceBeforeRedeem = address(_receiver).balance;
151+
152+
uint256 assetsForReceiverBeforeFees = getAssetsForReceiverBeforeFees(userSharesBeforeRedeem, _vaultId);
153+
128154
// redeem atom
129-
uint256 assets = actEthMultiVault.redeemAtom(_shares2Redeem, _receiver, _vaultId);
155+
uint256 assetsForReceiver = actEthMultiVault.redeemAtom(_shares2Redeem, _receiver, _vaultId);
156+
157+
checkProtocolVaultBalance(_vaultId, assetsForReceiverBeforeFees, protocolVaultBalanceBefore);
158+
159+
// snapshots after redeem
160+
uint256 userSharesAfterRedeem = getSharesInVault(_vaultId, _receiver);
161+
uint256 userBalanceAfterRedeem = address(_receiver).balance;
162+
163+
assertEq(userSharesAfterRedeem, userSharesBeforeRedeem - _shares2Redeem);
164+
assertEq(userBalanceAfterRedeem - userBalanceBeforeRedeem, assetsForReceiver);
130165

131166
// logs
132167
emit log_named_uint(
@@ -136,9 +171,10 @@ contract EthMultiVaultSingleVaultActor is Test {
136171
emit log_named_uint("vaultTAssets------", getVaultTotalAssets(_vaultId));
137172
emit log_named_uint("vaultBalanceOf----", getVaultBalanceForAddress(_vaultId, currentActor));
138173
emit log_named_uint(
139-
"==================================== ACTOR redeemAtom END ====================================", assets
174+
"==================================== ACTOR redeemAtom END ====================================",
175+
assetsForReceiver
140176
);
141-
return assets;
177+
return assetsForReceiver;
142178
}
143179

144180
receive() external payable {}

test/unit/EthMultiVault/RedeemAtom.t.sol

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,19 @@ contract RedeemAtomTest is EthMultiVaultBase, EthMultiVaultHelpers {
3535
ethMultiVault.depositAtom{value: testDepositAmount}(bob, id);
3636

3737
// snapshots before redeem
38+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
3839
uint256 userSharesBeforeRedeem = getSharesInVault(id, bob);
3940
uint256 userBalanceBeforeRedeem = address(bob).balance;
4041

41-
// execute interaction - redeem all atom shares
42+
(, uint256 calculatedAssetsForReceiver, uint256 protocolFees, uint256 exitFees) =
43+
ethMultiVault.getRedeemAssetsAndFees(userSharesBeforeRedeem, id);
44+
uint256 assetsForReceiverBeforeFees = calculatedAssetsForReceiver + protocolFees + exitFees;
45+
46+
// execute interaction - redeem all atom shares for bob
4247
uint256 assetsForReceiver = ethMultiVault.redeemAtom(userSharesBeforeRedeem, bob, id);
4348

49+
checkProtocolVaultBalance(id, assetsForReceiverBeforeFees, protocolVaultBalanceBefore);
50+
4451
// snapshots after redeem
4552
uint256 userSharesAfterRedeem = getSharesInVault(id, bob);
4653
uint256 userBalanceAfterRedeem = address(bob).balance;

test/unit/EthMultiVault/RedeemTriple.t.sol

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,19 @@ contract RedeemTripleTest is EthMultiVaultBase, EthMultiVaultHelpers {
4141
ethMultiVault.depositTriple{value: testDepositAmount}(bob, id);
4242

4343
// snapshots before redeem
44+
uint256 protocolVaultBalanceBefore = address(getProtocolVault()).balance;
4445
uint256 userSharesBeforeRedeem = getSharesInVault(id, bob);
4546
uint256 userBalanceBeforeRedeem = address(bob).balance;
4647

47-
// execute interaction - redeem all atom shares
48+
(, uint256 calculatedAssetsForReceiver, uint256 protocolFees, uint256 exitFees) =
49+
ethMultiVault.getRedeemAssetsAndFees(userSharesBeforeRedeem, id);
50+
uint256 assetsForReceiverBeforeFees = calculatedAssetsForReceiver + protocolFees + exitFees;
51+
52+
// execute interaction - redeem all positive triple vault shares for bob
4853
uint256 assetsForReceiver = ethMultiVault.redeemTriple(userSharesBeforeRedeem, bob, id);
4954

55+
checkProtocolVaultBalance(id, assetsForReceiverBeforeFees, protocolVaultBalanceBefore);
56+
5057
// snapshots after redeem
5158
uint256 userSharesAfterRedeem = getSharesInVault(id, bob);
5259
uint256 userBalanceAfterRedeem = address(bob).balance;

0 commit comments

Comments
 (0)