-
Notifications
You must be signed in to change notification settings - Fork 165
Expand file tree
/
Copy pathMasterVaultAttack.t.sol
More file actions
94 lines (82 loc) · 3.56 KB
/
Copy pathMasterVaultAttack.t.sol
File metadata and controls
94 lines (82 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "forge-std/console2.sol";
import { MasterVaultTest } from "./MasterVault.t.sol";
import { MockSubVault } from "../../../contracts/tokenbridge/test/MockSubVault.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC4626 } from "@openzeppelin/contracts/interfaces/IERC4626.sol";
contract MasterVaultTestWithSubvaultFresh is MasterVaultTest {
function setUp() public override {
super.setUp();
MockSubVault _subvault = new MockSubVault(IERC20(address(token)), "TestSubvault", "TSV");
vault.setSubVault(IERC4626(address(_subvault)));
}
}
contract AttackTest is MasterVaultTestWithSubvaultFresh {
function _calculateStolenAmount(
uint128 initialSubVaultTotalAssets,
uint128 initialSubVaultTotalSupply,
uint128 vaultInitialDepositAmount,
uint128 vaultAttackDepositAmount
) public returns (uint256) {
console2.log("initialSubVaultTotalAssets:", initialSubVaultTotalAssets);
console2.log("initialSubVaultTotalSupply:", initialSubVaultTotalSupply);
console2.log("vaultInitialDepositAmount:", vaultInitialDepositAmount);
console2.log("vaultAttackDepositAmount:", vaultAttackDepositAmount);
MockSubVault(address(vault.subVault())).adminMint(address(this), initialSubVaultTotalSupply);
token.mint(initialSubVaultTotalAssets);
token.transfer(address(vault.subVault()), initialSubVaultTotalAssets);
assertEq(
vault.subVault().totalAssets(),
initialSubVaultTotalAssets,
"subvault total assets should be correct"
);
assertEq(
vault.subVault().totalSupply(),
initialSubVaultTotalSupply,
"subvault total supply should be correct"
);
vm.startPrank(user);
token.mint(vaultInitialDepositAmount);
token.approve(address(vault), vaultInitialDepositAmount);
vault.deposit(vaultInitialDepositAmount, user);
vm.stopPrank();
address attacker = address(0xBEEF);
vm.startPrank(attacker);
token.mint(vaultAttackDepositAmount);
token.approve(address(vault), vaultAttackDepositAmount);
uint256 sharesBack = vault.deposit(vaultAttackDepositAmount, attacker);
// vm.assume(sharesBack < vault.maxRedeem(attacker));
uint256 assetsBack = vault.redeem(sharesBack, attacker, attacker);
vm.stopPrank();
uint256 stolenAmount = assetsBack > vaultAttackDepositAmount
? assetsBack - vaultAttackDepositAmount
: 0;
console2.log("stolenAmount:", stolenAmount);
return stolenAmount;
}
function testFindCombo(
uint120 initialSubVaultTotalAssets,
int8 initialSubVaultTotalSupplyWiggle,
uint128 vaultInitialDepositAmount,
uint128 vaultAttackDepositAmount
) public {
if(initialSubVaultTotalAssets < 1e18) {
initialSubVaultTotalAssets += 1e18;
}
if(vaultInitialDepositAmount < 1e18) {
vaultInitialDepositAmount += 1e18;
}
uint128 initialSubVaultTotalSupply = uint128(int128(int120(initialSubVaultTotalAssets)) + int128(initialSubVaultTotalSupplyWiggle));
uint256 stolenAmt = _calculateStolenAmount(
initialSubVaultTotalAssets,
initialSubVaultTotalSupply,
vaultInitialDepositAmount,
vaultAttackDepositAmount
);
require(
stolenAmt == 0,
"theft occurred with these parameters"
);
}
}