Skip to content

Commit

Permalink
test: Refactoring foundry testcase files
Browse files Browse the repository at this point in the history
  • Loading branch information
thorseldon committed Apr 27, 2023
1 parent c965610 commit 6c52beb
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 59 deletions.
5 changes: 5 additions & 0 deletions remappings.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@openzeppelin/=node_modules/@openzeppelin/
ds-test/=lib/forge-std/lib/ds-test/src/
eth-gas-reporter/=node_modules/eth-gas-reporter/
forge-std/=lib/forge-std/src/
hardhat/=node_modules/hardhat/
28 changes: 0 additions & 28 deletions test/BendNftPool.t.sol

This file was deleted.

4 changes: 0 additions & 4 deletions test/BendCoinPool.t.sol → test/foundry/BendCoinPool.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,9 @@ contract BendCoinPoolTest is SetupHelper {
compoundArgs1.coinStakeThreshold = 0;
stakeManager.compound(compoundArgs1);

mockApeStaking.pools(0);

// make some rewards
advanceTimeAndBlock(2 hours, 100);

mockApeStaking.pools(0);

IStakeManager.CompoundArgs memory compoundArgs2;
compoundArgs2.claimCoinPool = true;
stakeManager.compound(compoundArgs2);
Expand Down
27 changes: 27 additions & 0 deletions test/foundry/BendNftPool.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
pragma solidity 0.8.18;

import "./SetupHelper.sol";

contract BendNftPoolTest is SetupHelper {
function setUp() public override {
super.setUp();
}

function test_deposit_basic() public {
super.prepareAllApprovals(testUser0);
super.prepareMintNfts(testUser0, 5);

vm.startPrank(testUser0);

nftPool.deposit(address(mockBAYC), testBaycTokenIds);
nftPool.withdraw(address(mockBAYC), testBaycTokenIds);

nftPool.deposit(address(mockMAYC), testMaycTokenIds);
nftPool.withdraw(address(mockMAYC), testMaycTokenIds);

nftPool.deposit(address(mockBAKC), testBakcTokenIds);
nftPool.withdraw(address(mockBAKC), testBakcTokenIds);

vm.stopPrank();
}
}
34 changes: 34 additions & 0 deletions test/foundry/BendStakeManager.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
pragma solidity 0.8.18;

import "./SetupHelper.sol";

contract BendStakeManagerTest is SetupHelper {
function setUp() public override {
super.setUp();
}

function test_compound_StakeApeCoin() public {
super.prepareAllApprovals(testUser0);
super.prepareDepositCoins(testUser0, 1_000_000 * 1e18);

vm.startPrank(botAdmin);

IStakeManager.CompoundArgs memory compoundArgs1;
compoundArgs1.coinStakeThreshold = 0;
stakeManager.compound(compoundArgs1);

vm.stopPrank();
}

function test_compound_StakeBAYC() public {
super.prepareAllApprovals(testUser0);
super.prepareDepositCoins(testUser0, 1_000_000 * 1e18);
super.prepareDepositNfts(testUser0, 5);

vm.startPrank(botAdmin);
IStakeManager.CompoundArgs memory compoundArgs1;
compoundArgs1.stake.bayc = testBaycTokenIds;
stakeManager.compound(compoundArgs1);
vm.stopPrank();
}
}
144 changes: 117 additions & 27 deletions test/SetupHelper.sol → test/foundry/SetupHelper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,43 +5,49 @@ import "forge-std/Test.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";

import "../contracts/test/MintableERC20.sol";
import "../contracts/test/MintableERC721.sol";
import "../contracts/test/ApeCoinStaking.sol";
import "../contracts/test/DelegationRegistry.sol";

import "../contracts/interfaces/IDelegationRegistry.sol";
import "../contracts/interfaces/IApeCoinStaking.sol";
import "../contracts/interfaces/IStakedNft.sol";
import "../contracts/interfaces/INftVault.sol";
import "../contracts/interfaces/ICoinPool.sol";
import "../contracts/interfaces/INftPool.sol";
import "../contracts/interfaces/IStakeManager.sol";

import "../contracts/stakednft/NftVault.sol";
import "../contracts/stakednft/StBAYC.sol";
import "../contracts/stakednft/StMAYC.sol";
import "../contracts/stakednft/StBAKC.sol";

import "../contracts/BendCoinPool.sol";
import "../contracts/BendNftPool.sol";
import "../contracts/BendStakeManager.sol";

import "./helpers/UtilitiesHelper.sol";
import "../../contracts/test/MintableERC20.sol";
import "../../contracts/test/MintableERC721.sol";
import "../../contracts/test/ApeCoinStaking.sol";
import "../../contracts/test/DelegationRegistry.sol";

import "../../contracts/interfaces/IDelegationRegistry.sol";
import "../../contracts/interfaces/IApeCoinStaking.sol";
import "../../contracts/interfaces/IStakedNft.sol";
import "../../contracts/interfaces/INftVault.sol";
import "../../contracts/interfaces/ICoinPool.sol";
import "../../contracts/interfaces/INftPool.sol";
import "../../contracts/interfaces/IStakeManager.sol";

import "../../contracts/stakednft/NftVault.sol";
import "../../contracts/stakednft/StBAYC.sol";
import "../../contracts/stakednft/StMAYC.sol";
import "../../contracts/stakednft/StBAKC.sol";

import "../../contracts/BendCoinPool.sol";
import "../../contracts/BendNftPool.sol";
import "../../contracts/BendStakeManager.sol";

import "./UtilitiesHelper.sol";

abstract contract SetupHelper is Test {
UtilitiesHelper internal utilsHelper;

// mocked users
address payable[] internal testUsers;
address payable testUser0;
address payable[] internal adminOwners;
address payable poolOwner;
address payable botAdmin;

// mocked contracts
MintableERC20 internal mockApeCoin;
MintableERC721 internal mockBAYC;
MintableERC721 internal mockMAYC;
MintableERC721 internal mockBAKC;
ApeCoinStaking internal mockApeStaking;
DelegationRegistry internal mockDelegationRegistry;

// tested contracts
NftVault internal nftVault;
StBAYC internal stBAYC;
StMAYC internal stMAYC;
Expand All @@ -51,10 +57,21 @@ abstract contract SetupHelper is Test {
BendNftPool internal nftPool;
BendStakeManager internal stakeManager;

// mocked datas
uint256[] internal testBaycTokenIds;
uint256[] internal testMaycTokenIds;
uint256[] internal testBakcTokenIds;

function setUp() public virtual {
// prepare test users
utilsHelper = new UtilitiesHelper();

testUsers = utilsHelper.createUsers(5);
testUser0 = testUsers[0];

adminOwners = utilsHelper.createUsers(5);
poolOwner = adminOwners[0];
botAdmin = adminOwners[1];

mockDelegationRegistry = new DelegationRegistry();

Expand Down Expand Up @@ -108,14 +125,23 @@ abstract contract SetupHelper is Test {
nftPool.initialize(IDelegationRegistry(mockDelegationRegistry), coinPool, stakeManager, stBAYC, stMAYC, stBAKC);
stakeManager.initialize(IApeCoinStaking(address(mockApeStaking)), coinPool, nftPool, nftVault);

botAdmin = adminOwners[0];
stakeManager.updateBotAdmin(botAdmin);

// mint some coins
uint256 totalCoinRewards = 1000000 * 10**18;
uint256 totalCoinRewards = 100000000 * 1e18;
mockApeCoin.mint(totalCoinRewards);
mockApeCoin.transfer(address(mockApeStaking), totalCoinRewards);

// changing the owner and admin
vm.startPrank(coinPool.owner());
coinPool.transferOwnership(poolOwner);
nftPool.transferOwnership(poolOwner);
stakeManager.transferOwnership(poolOwner);
vm.stopPrank();

vm.startPrank(stakeManager.owner());
stakeManager.updateBotAdmin(botAdmin);
vm.stopPrank();

// update the block info
vm.warp(1669748400);
vm.roll(100);
}
Expand All @@ -132,4 +158,68 @@ abstract contract SetupHelper is Test {
vm.warp(block.timestamp + timeDelta);
vm.roll(block.number + blockDelta);
}

function prepareAllApprovals(address user) internal virtual {
vm.startPrank(user);

mockApeCoin.approve(address(coinPool), type(uint256).max);

mockBAYC.setApprovalForAll(address(nftPool), true);
mockMAYC.setApprovalForAll(address(nftPool), true);
mockBAKC.setApprovalForAll(address(nftPool), true);

stBAYC.setApprovalForAll(address(nftPool), true);
stMAYC.setApprovalForAll(address(nftPool), true);
stBAKC.setApprovalForAll(address(nftPool), true);

vm.stopPrank();
}

function prepareMintCoins(address user, uint256 depositAmount) internal virtual {
vm.startPrank(user);
mockApeCoin.mint(depositAmount);
vm.stopPrank();
}

function prepareDepositCoins(address user, uint256 depositAmount) internal virtual {
prepareMintCoins(user, depositAmount);

vm.startPrank(user);
coinPool.deposit(depositAmount, user);
vm.stopPrank();
}

function prepareMintNfts(address user, uint256 tokenAmount) internal virtual {
vm.startPrank(user);

testBaycTokenIds = new uint256[](tokenAmount);
for (uint256 i = 0; i < tokenAmount; i++) {
testBaycTokenIds[i] = 101 + i;
mockBAYC.mint(testBaycTokenIds[i]);
}

testMaycTokenIds = new uint256[](tokenAmount);
for (uint256 i = 0; i < testMaycTokenIds.length; i++) {
testMaycTokenIds[i] = 201 + i;
mockMAYC.mint(testMaycTokenIds[i]);
}

testBakcTokenIds = new uint256[](tokenAmount);
for (uint256 i = 0; i < tokenAmount; i++) {
testBakcTokenIds[i] = 301 + i;
mockBAKC.mint(testBakcTokenIds[i]);
}

vm.stopPrank();
}

function prepareDepositNfts(address user, uint256 tokenAmount) internal virtual {
prepareMintNfts(user, tokenAmount);

vm.startPrank(user);
nftPool.deposit(address(mockBAYC), testBaycTokenIds);
nftPool.deposit(address(mockMAYC), testMaycTokenIds);
nftPool.deposit(address(mockBAKC), testBakcTokenIds);
vm.stopPrank();
}
}
File renamed without changes.

0 comments on commit 6c52beb

Please sign in to comment.