pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {console} from "forge-std/console.sol";
import {Distribution} from "../../contracts/Distribution.sol";
import {DistributionV2} from "../../contracts/mock/DistributionV2.sol";
import {IDistribution} from "../../contracts/interfaces/IDistribution.sol";
import {TransparentUpgradeableProxy} from
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {StETHMock} from "../../contracts/mock/tokens/StETHMock.sol";
import {WStETHMock} from "../../contracts/mock/tokens/WStETHMock.sol";
contract MorpheusTest is Test {
event UserClaimed(uint256 indexed poolId, address indexed user, uint256 amount);
StETHMock stEthMock;
WStETHMock wstEthMock;
DistributionV2 distributionV2;
Distribution distribution;
ProxyAdmin admin;
address depositToken;
address l1Sender = makeAddr("l1Sender");
IDistribution.Pool[] pools;
IDistribution.Pool pool;
IDistribution.Pool pool2;
address owner = makeAddr("owner");
address attacker = makeAddr("attacker");
address alice = makeAddr("alice");
address victim = makeAddr("victim");
uint128 constant ONE_HOUR = 3600;
uint128 constant ONE_DAY = 86400;
function setUp() external {
vm.startPrank(owner);
stEthMock = new StETHMock();
wstEthMock = new WStETHMock(address(stEthMock));
distributionV2 = new DistributionV2();
depositToken = address(stEthMock);
admin = new ProxyAdmin();
address impl = address(new Distribution());
distribution = Distribution(address(new TransparentUpgradeableProxy(impl, address(admin), "")));
distribution.Distribution_init(depositToken, l1Sender, pools);
stEthMock.mint(attacker, 100_000);
vm.deal(attacker, 100 ether);
vm.stopPrank();
}
modifier createPool(uint256 initialReward_, uint256 rewardDecrease_) {
pool = IDistribution.Pool({
payoutStart: uint128(block.timestamp)+1,
decreaseInterval: ONE_DAY,
withdrawLockPeriod: 12*ONE_HOUR,
claimLockPeriod: 12*ONE_HOUR,
withdrawLockPeriodAfterStake: ONE_DAY,
initialReward: initialReward_,
rewardDecrease: rewardDecrease_,
minimalStake: 1,
isPublic: true
});
vm.prank(owner);
distribution.createPool(pool);
vm.prank(owner);
distributionV2.createPool(pool);
_;
}
function testAnyUserCanMintAnyValueOfWstEth(uint256 mintAmount) external {
vm.startPrank(attacker);
wstEthMock.mint(attacker, mintAmount);
assertEq(mintAmount, wstEthMock.balanceOf(attacker));
}
}