139 lines
4.6 KiB
Solidity
139 lines
4.6 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);
|
|
}
|
|
}
|