communities-contracts/test/CommunityERC20.t.sol

132 lines
4.5 KiB
Solidity

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
import { Test } from "forge-std/Test.sol";
import { CommunityERC20 } from "../contracts/tokens/CommunityERC20.sol";
import { DeploymentConfig } from "../script/DeploymentConfig.s.sol";
import { DeployOwnerAndMasterToken } from "../script/DeployOwnerAndMasterToken.s.sol";
import { OwnerToken } from "../contracts/tokens/OwnerToken.sol";
import { MasterToken } from "../contracts/tokens/MasterToken.sol";
import { CommunityOwnable } from "../contracts/CommunityOwnable.sol";
contract CommunityERC20Test is Test {
CommunityERC20 internal communityToken;
address[] internal accounts = new address[](4);
address internal deployer;
string internal name = "Test";
string internal symbol = "TEST";
string internal baseURI = "http://local.dev";
uint256 internal maxSupply = 100;
uint8 internal decimals = 18;
function setUp() public virtual {
DeployOwnerAndMasterToken deployment = new DeployOwnerAndMasterToken();
(OwnerToken ownerToken, MasterToken masterToken, DeploymentConfig deploymentConfig) = deployment.run();
deployer = deploymentConfig.deployer();
communityToken =
new CommunityERC20(name, symbol, decimals, maxSupply, baseURI, address(ownerToken), address(masterToken));
accounts[0] = makeAddr("one");
accounts[1] = makeAddr("two");
accounts[2] = makeAddr("three");
accounts[3] = makeAddr("four");
}
function test_Deployment() public {
assertEq(communityToken.name(), name);
assertEq(communityToken.symbol(), symbol);
assertEq(communityToken.maxSupply(), maxSupply);
assertEq(communityToken.decimals(), decimals);
assertEq(communityToken.baseTokenURI(), baseURI);
}
}
contract SetMaxSupplyTest is CommunityERC20Test {
function setUp() public virtual override {
CommunityERC20Test.setUp();
}
function test_RevertWhen_SenderIsNotOwner() public {
vm.prank(makeAddr("notOwner"));
vm.expectRevert(CommunityOwnable.CommunityOwnable_NotAuthorized.selector);
communityToken.setMaxSupply(1000);
}
function test_RevertWhen_MaxSupplyLowerThanTotalSupply() public {
uint256[] memory amounts = new uint256[](4);
amounts[0] = 10;
amounts[1] = 15;
amounts[2] = 5;
amounts[3] = 20;
vm.startPrank(deployer);
communityToken.mintTo(accounts, amounts); // totalSupply is now 50
vm.expectRevert(CommunityERC20.CommunityERC20_MaxSupplyLowerThanTotalSupply.selector);
communityToken.setMaxSupply(40);
vm.stopPrank();
}
function test_SetMaxSupply() public {
vm.prank(deployer);
communityToken.setMaxSupply(1000);
assertEq(communityToken.maxSupply(), 1000);
}
}
contract MintToTest is CommunityERC20Test {
event StatusMint(address indexed from, address indexed to, uint256 indexed amount);
function setUp() public virtual override {
CommunityERC20Test.setUp();
}
function test_RevertWhen_AddressesAndAmountsAreNotEqualLength() public {
uint256[] memory amounts = new uint256[](3);
amounts[0] = 10;
amounts[1] = 15;
amounts[2] = 5;
vm.expectRevert(CommunityERC20.CommunityERC20_MismatchingAddressesAndAmountsLengths.selector);
vm.prank(deployer);
communityToken.mintTo(accounts, amounts);
}
function test_RevertWhen_MaxSupplyReached() public {
uint256[] memory amounts = new uint256[](4);
amounts[0] = 50;
amounts[1] = 25;
amounts[2] = 25;
amounts[3] = 1; // this should exceed max supply
vm.expectRevert(CommunityERC20.CommunityERC20_MaxSupplyReached.selector);
vm.prank(deployer);
communityToken.mintTo(accounts, amounts);
}
function test_MintTo() public {
uint256[] memory amounts = new uint256[](4);
amounts[0] = 50;
amounts[1] = 25;
amounts[2] = 20;
amounts[3] = 5;
vm.startPrank(deployer);
for (uint8 i = 0; i < accounts.length; i++) {
vm.expectEmit(true, true, true, true);
emit StatusMint(address(0), accounts[i], amounts[i]);
}
communityToken.mintTo(accounts, amounts);
assertEq(communityToken.balanceOf(accounts[0]), 50);
assertEq(communityToken.balanceOf(accounts[1]), 25);
assertEq(communityToken.balanceOf(accounts[2]), 20);
assertEq(communityToken.balanceOf(accounts[3]), 5);
}
}