communities-contracts/test/CommunityVault.t.sol

216 lines
7.0 KiB
Solidity
Raw Permalink Normal View History

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
import { Test } from "forge-std/Test.sol";
import { TestERC20Token } from "../contracts/mocks/TestERC20Token.sol";
import { TestERC721Token } from "../contracts/mocks/TestERC721Token.sol";
import { CommunityVault } from "../contracts/CommunityVault.sol";
import { CommunityOwnable } from "../contracts/CommunityOwnable.sol";
import { DeploymentConfig } from "../script/DeploymentConfig.s.sol";
import { DeployOwnerAndMasterToken } from "../script/DeployOwnerAndMasterToken.s.sol";
import { CommunityERC20 } from "../contracts/tokens/CommunityERC20.sol";
import { OwnerToken } from "../contracts/tokens/OwnerToken.sol";
import { MasterToken } from "../contracts/tokens/MasterToken.sol";
contract CommunityVaultTest is Test {
CommunityVault internal vault;
address[] internal accounts = new address[](2);
address internal deployer;
TestERC20Token internal erc20Token;
TestERC721Token internal erc721Token;
CommunityERC20 internal communityERC20Token;
OwnerToken internal ownerToken;
MasterToken internal masterToken;
function setUp() public virtual {
DeploymentConfig deploymentConfig;
DeployOwnerAndMasterToken deployment = new DeployOwnerAndMasterToken();
(ownerToken, masterToken, deploymentConfig) = deployment.run();
deployer = deploymentConfig.deployer();
erc20Token = new TestERC20Token();
erc721Token = new TestERC721Token();
communityERC20Token = new CommunityERC20("Test", "TST", 18, 100, "", address(ownerToken), address(masterToken));
vault = new CommunityVault(address(ownerToken), address(masterToken));
accounts[0] = makeAddr("one");
accounts[1] = makeAddr("two");
}
function test_Deployment() public {
assertEq(vault.ownerToken(), address(ownerToken));
assertEq(vault.masterToken(), address(masterToken));
}
}
contract CommunityVaultBaseERC20Test is CommunityVaultTest {
function setUp() public virtual override {
CommunityVaultTest.setUp();
// mint 10 tokens to user
address user = accounts[0];
erc20Token.mint(user, 10e18);
// user transfer 10 tokens to the vault
vm.prank(user);
erc20Token.transfer(address(vault), 10e18);
}
}
contract TransferERC20ByNonAdminTest is CommunityVaultBaseERC20Test {
function setUp() public virtual override {
CommunityVaultBaseERC20Test.setUp();
}
function test_revertIfCalledByNonAdmin() public {
assertEq(erc20Token.balanceOf(address(vault)), 10e18);
uint256[] memory amounts = new uint256[](2);
amounts[0] = 1;
amounts[1] = 1;
vm.prank(accounts[0]);
vm.expectRevert(CommunityOwnable.CommunityOwnable_NotAuthorized.selector);
vault.transferERC20(address(erc20Token), accounts, amounts);
}
}
contract TransferERC20ByAdminTest is CommunityVaultBaseERC20Test {
function setUp() public virtual override {
CommunityVaultBaseERC20Test.setUp();
}
function test_LengthMismatch() public {
assertEq(erc20Token.balanceOf(address(vault)), 10e18);
uint256[] memory amounts = new uint256[](1);
amounts[0] = 5e18;
vm.prank(deployer);
vm.expectRevert(CommunityVault.CommunityVault_LengthMismatch.selector);
vault.transferERC20(address(erc20Token), accounts, amounts);
}
function test_TransferAmountZero() public {
assertEq(erc20Token.balanceOf(address(vault)), 10e18);
uint256[] memory amounts = new uint256[](2);
amounts[0] = 5e18;
amounts[1] = 0;
vm.prank(deployer);
vm.expectRevert(CommunityVault.CommunityVault_TransferAmountZero.selector);
vault.transferERC20(address(erc20Token), accounts, amounts);
}
function test_NoRecipients() public {
assertEq(erc20Token.balanceOf(address(vault)), 10e18);
uint256[] memory amounts = new uint256[](0);
address[] memory tmpAccounts = new address[](0);
vm.prank(deployer);
vm.expectRevert(CommunityVault.CommunityVault_NoRecipients.selector);
vault.transferERC20(address(erc20Token), tmpAccounts, amounts);
}
function test_AdminCanTransferERC20() public {
assertEq(erc20Token.balanceOf(address(vault)), 10e18);
uint256[] memory amounts = new uint256[](2);
amounts[0] = 5e18;
amounts[1] = 5e18;
vm.prank(deployer);
vault.transferERC20(address(erc20Token), accounts, amounts);
assertEq(erc20Token.balanceOf(address(vault)), 0);
}
}
contract CommunityVaultBaseERC721Test is CommunityVaultTest {
function setUp() public virtual override {
CommunityVaultTest.setUp();
// mint 2 token to user
address user = accounts[0];
erc721Token.mint(user);
erc721Token.mint(user);
// user transfer 2 tokens to the vault
vm.startPrank(user);
erc721Token.transferFrom(user, address(vault), 0);
erc721Token.transferFrom(user, address(vault), 1);
vm.stopPrank();
}
}
contract TransferERC721ByNonAdminTest is CommunityVaultBaseERC721Test {
function setUp() public virtual override {
CommunityVaultBaseERC721Test.setUp();
}
function test_RevertIfCalledByNonAdmin() public {
assertEq(erc721Token.balanceOf(address(vault)), 2);
uint256[] memory ids = new uint256[](2);
ids[0] = 0;
ids[1] = 1;
vm.prank(accounts[0]);
vm.expectRevert(CommunityOwnable.CommunityOwnable_NotAuthorized.selector);
vault.transferERC721(address(erc721Token), accounts, ids);
}
}
contract TransferERC721ByAdminTest is CommunityVaultBaseERC721Test {
function setUp() public virtual override {
CommunityVaultBaseERC721Test.setUp();
}
function test_LengthMismatch() public {
assertEq(erc721Token.balanceOf(address(vault)), 2);
uint256[] memory ids = new uint256[](1);
ids[0] = 0;
vm.prank(deployer);
vm.expectRevert(CommunityVault.CommunityVault_LengthMismatch.selector);
vault.transferERC721(address(erc721Token), accounts, ids);
}
function test_NoRecipients() public {
assertEq(erc721Token.balanceOf(address(vault)), 2);
uint256[] memory ids = new uint256[](0);
address[] memory tmpAccounts = new address[](0);
vm.prank(deployer);
vm.expectRevert(CommunityVault.CommunityVault_NoRecipients.selector);
vault.transferERC721(address(erc721Token), tmpAccounts, ids);
}
function test_AdminCanTransferERC721() public {
assertEq(erc721Token.balanceOf(address(vault)), 2);
assertEq(erc721Token.ownerOf(0), address(vault));
assertEq(erc721Token.ownerOf(1), address(vault));
uint256[] memory ids = new uint256[](2);
ids[0] = 0;
ids[1] = 1;
vm.prank(deployer);
vault.transferERC721(address(erc721Token), accounts, ids);
assertEq(erc721Token.balanceOf(address(vault)), 0);
}
}