From 7378b6da0285928234185dfd518583bb72654f21 Mon Sep 17 00:00:00 2001 From: GianfrancoBazzani Date: Fri, 12 Apr 2024 22:45:50 +0200 Subject: [PATCH] :arrow_double_up: Migrate test to foundry --- contracts/test/levels/Stake.Test.js | 66 --------------------------- contracts/test/levels/Stake.t.sol | 71 +++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 66 deletions(-) delete mode 100644 contracts/test/levels/Stake.Test.js create mode 100644 contracts/test/levels/Stake.t.sol diff --git a/contracts/test/levels/Stake.Test.js b/contracts/test/levels/Stake.Test.js deleted file mode 100644 index 145426cdf..000000000 --- a/contracts/test/levels/Stake.Test.js +++ /dev/null @@ -1,66 +0,0 @@ -const Stake = artifacts.require('./levels/Stake.sol'); -const StakeFactory = artifacts.require('./levels/StakeFactory.sol'); -const StakeAttack = artifacts.require('./attacks/StakeAttack.sol'); -// const ERC20 = artifacts.require('ERC20'); - -const Ethernaut = artifacts.require('./Ethernaut.sol'); -const { - BN, - constants, - expectEvent, - expectRevert, -} = require('openzeppelin-test-helpers'); -const utils = require('../utils/TestUtils'); -const { ethers, upgrades } = require('hardhat'); - -contract('Stake', function (accounts) { - let ethernaut; - let level; - let owner = accounts[1]; - let player = accounts[0]; - let statproxy; - - before(async function () { - ethernaut = await utils.getEthernautWithStatsProxy(); - level = await StakeFactory.new(); - await ethernaut.registerLevel(level.address); - }); - - it('should fail if the player did not solve the level', async function () { - const instance = await utils.createLevelInstance( - ethernaut, - level.address, - player, - Stake - ); - - const completed = await utils.submitLevelInstance( - ethernaut, - level.address, - instance.address, - player - ); - - assert.isFalse(completed); - }); - - it('should allow the player to solve the level', async function () { - const instance = await utils.createLevelInstance( - ethernaut, - level.address, - player, - Stake - ); - const attacker = await StakeAttack.new(); - await attacker.attack(instance.address, player); - - const completed = await utils.submitLevelInstance( - ethernaut, - level.address, - instance.address, - player - ); - - assert.isTrue(completed); - }); -}); \ No newline at end of file diff --git a/contracts/test/levels/Stake.t.sol b/contracts/test/levels/Stake.t.sol new file mode 100644 index 000000000..1355adeff --- /dev/null +++ b/contracts/test/levels/Stake.t.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; +import {Utils} from "test/utils/Utils.sol"; + +import {Stake} from "src/levels/Stake.sol"; +import {StakeFactory} from "src/levels/StakeFactory.sol"; +import {StakeAttack} from "src/attacks/StakeAttack.sol"; +import {Level} from "src/levels/base/Level.sol"; +import {Ethernaut} from "src/Ethernaut.sol"; +import {ERC20} from "openzeppelin-contracts-08/token/ERC20/ERC20.sol"; + +import {console} from "forge-std/console.sol"; +contract TestStake is Test, Utils { + Ethernaut ethernaut; + Stake instance; + + address payable owner; + address payable player; + + /*////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////*/ + + function setUp() public { + address payable[] memory users = createUsers(2); + + owner = users[0]; + vm.label(owner, "Owner"); + + player = users[1]; + vm.label(player, "Player"); + + vm.startPrank(owner); + ethernaut = getEthernautWithStatsProxy(owner); + StakeFactory factory = new StakeFactory(); + ethernaut.registerLevel(Level(address(factory))); + vm.stopPrank(); + + vm.startPrank(player); + instance = Stake(payable(createLevelInstance(ethernaut, Level(address(factory)), 0.001 ether))); + vm.stopPrank(); + } + + /*////////////////////////////////////////////////////////////// + TESTS + //////////////////////////////////////////////////////////////*/ + + /// @notice Check the intial state of the level and enviroment. + function testInit() public { + vm.startPrank(player); + assertFalse(submitLevelInstance(ethernaut, address(instance))); + } + + /// @notice Test the solution for the level. + function testSolve() public { + vm.deal(player, 1 ether); + vm.startPrank(player); + + StakeAttack attacker = new StakeAttack(); + attacker.attack{value: 0.001 ether + 2}(instance); + + ERC20 dweth = ERC20(instance.WETH()); + dweth.approve(address(instance), type(uint256).max); + instance.StakeWETH(0.001 ether + 1); + instance.Unstake(0.001 ether + 1); + + assertTrue(submitLevelInstance(ethernaut, address(instance))); + } +}