Files
staking-reward-streamer/test/StakeVault.test.sol
Ricardo Guilherme Schmidt 8561a68ffd feat(RewardsStreamerMP): make RewardsStreamerMP upgradeable
This commit introduces upgradeability of the `RewardsStreamerMP`
contract by leveraging the UUPS pattern.

This means, for deployment, we have to first deploy an instance of
`RewardsStreamerMP` contract as a "template" logic contract and then
create a ERC1967Proxy that points to it.

The proxy ensures the implementation address is stored in a
deterministic storage slot.

This will later be leveraged by the `StakeVault` contract to implement
the functionality to leave the system in case there was a malicious
upgrade.

Closes #22
2024-12-01 08:06:51 +01:00

78 lines
2.4 KiB
Solidity

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.26;
import { Test } from "forge-std/Test.sol";
import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { RewardsStreamerMP } from "../src/RewardsStreamerMP.sol";
import { StakeVault } from "../src/StakeVault.sol";
import { MockToken } from "./mocks/MockToken.sol";
contract StakeVaultTest is Test {
RewardsStreamerMP internal streamer;
StakeVault internal stakeVault;
MockToken internal rewardToken;
MockToken internal stakingToken;
address internal alice = makeAddr("alice");
function _createTestVault(address owner) internal returns (StakeVault vault) {
vm.prank(owner);
vault = new StakeVault(owner, streamer);
if (!streamer.isTrustedCodehash(address(vault).codehash)) {
streamer.setTrustedCodehash(address(vault).codehash, true);
}
}
function setUp() public virtual {
rewardToken = new MockToken("Reward Token", "RT");
stakingToken = new MockToken("Staking Token", "ST");
address impl = address(new RewardsStreamerMP());
bytes memory initializeData = abi.encodeWithSelector(
RewardsStreamerMP.initialize.selector, address(this), address(stakingToken), address(rewardToken)
);
address proxy = address(new ERC1967Proxy(impl, initializeData));
streamer = RewardsStreamerMP(proxy);
stakingToken.mint(alice, 10_000e18);
stakeVault = _createTestVault(alice);
vm.prank(alice);
stakingToken.approve(address(stakeVault), 10_000e18);
}
}
contract StakingTokenTest is StakeVaultTest {
function setUp() public override {
StakeVaultTest.setUp();
}
function testStakeToken() public view {
assertEq(address(stakeVault.STAKING_TOKEN()), address(stakingToken));
}
}
contract WithdrawTest is StakeVaultTest {
function setUp() public override {
StakeVaultTest.setUp();
}
function test_CannotWithdrawStakedFunds() public {
// first, stake some funds
vm.prank(alice);
stakeVault.stake(10e18, 0);
assertEq(stakingToken.balanceOf(address(stakeVault)), 10e18);
assertEq(streamer.totalStaked(), 10e18);
// try withdrawing funds without unstaking
vm.prank(alice);
vm.expectRevert(StakeVault.StakeVault__NotEnoughAvailableBalance.selector);
stakeVault.withdraw(stakingToken, 10e18);
}
}