communities-contracts/test/CommunityMasterTokenFactory...

137 lines
5.5 KiB
Solidity

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
import { Test } from "forge-std/Test.sol";
import { DeployContracts } from "../script/DeployContracts.s.sol";
import { DeploymentConfig } from "../script/DeploymentConfig.s.sol";
import { BaseTokenFactory } from "../contracts/factories/BaseTokenFactory.sol";
import { CommunityMasterTokenFactory } from "../contracts/factories/CommunityMasterTokenFactory.sol";
import { MasterToken } from "../contracts/tokens/MasterToken.sol";
import { CommunityTokenDeployer } from "../contracts/CommunityTokenDeployer.sol";
contract CommunityMasterTokenFactoryTest is Test {
DeploymentConfig internal deploymentConfig;
address internal deployer;
CommunityTokenDeployer internal tokenDeployer;
CommunityMasterTokenFactory internal masterTokenFactory;
function setUp() public virtual {
DeployContracts deployment = new DeployContracts();
(tokenDeployer,,, masterTokenFactory, deploymentConfig) = deployment.run();
deployer = deploymentConfig.deployer();
}
}
contract DeploymentTest is CommunityMasterTokenFactoryTest {
function setUp() public virtual override {
CommunityMasterTokenFactoryTest.setUp();
}
function test_Deployment() public {
assertEq(masterTokenFactory.owner(), deployer);
assertEq(masterTokenFactory.tokenDeployer(), address(tokenDeployer));
}
}
contract SetTokenDeployerAddressTest is CommunityMasterTokenFactoryTest {
event TokenDeployerAddressChange(address indexed);
function setUp() public virtual override {
CommunityMasterTokenFactoryTest.setUp();
}
function test_RevertWhen_SenderIsNotOwner() public {
vm.expectRevert(bytes("Ownable: caller is not the owner"));
masterTokenFactory.setTokenDeployerAddress(makeAddr("something"));
}
function test_RevertWhen_InvalidTokenDeployerAddress() public {
vm.prank(deployer);
vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenDeployerAddress.selector);
masterTokenFactory.setTokenDeployerAddress(address(0));
}
function test_SetTokenDeployerAddress() public {
address someAddress = makeAddr("someAddress");
vm.prank(deployer);
vm.expectEmit(true, true, true, true);
emit TokenDeployerAddressChange(someAddress);
masterTokenFactory.setTokenDeployerAddress(someAddress);
assertEq(masterTokenFactory.tokenDeployer(), someAddress);
}
}
contract CreateTest is CommunityMasterTokenFactoryTest {
event CreateToken(address indexed);
function setUp() public virtual override {
CommunityMasterTokenFactoryTest.setUp();
}
function test_RevertWhen_SenderIsNotTokenDeployer() public {
string memory name = "TestToken";
string memory symbol = "TEST";
string memory baseURI = "http://test.dev";
address ownerToken = makeAddr("ownerToken");
bytes memory signerPublicKey = bytes("");
vm.prank(makeAddr("notTokenDeployer"));
vm.expectRevert(BaseTokenFactory.BaseTokenFactory_NotAuthorized.selector);
masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
}
function test_RevertWhen_InvalidTokenMetadata() public {
string memory name = "";
string memory symbol = "";
string memory baseURI = "";
address ownerToken = makeAddr("ownerToken");
bytes memory signerPublicKey = bytes("");
vm.startPrank(address(tokenDeployer));
vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenMetadata.selector);
masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
baseURI = "http://test.dev";
vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenMetadata.selector);
masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
symbol = "TEST";
vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenMetadata.selector);
masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
}
function test_RevertWhen_InvalidOwnerTokenAddress() public {
string memory name = "TestToken";
string memory symbol = "TEST";
string memory baseURI = "http://test.dev";
address ownerToken = address(0);
bytes memory signerPublicKey = bytes("");
vm.prank(address(tokenDeployer));
vm.expectRevert(CommunityMasterTokenFactory.CommunityMasterTokenFactory_InvalidOwnerTokenAddress.selector);
masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
}
function test_Create() public {
string memory name = "TestToken";
string memory symbol = "TEST";
string memory baseURI = "http://test.dev";
address ownerToken = makeAddr("ownerToken");
bytes memory signerPublicKey = bytes("some public key");
vm.prank(address(tokenDeployer));
vm.expectEmit(false, false, false, false);
emit CreateToken(makeAddr("some address"));
address masterTokenAddress = masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
assertEq(MasterToken(masterTokenAddress).totalSupply(), 0);
assertEq(MasterToken(masterTokenAddress).maxSupply(), type(uint256).max);
assertEq(MasterToken(masterTokenAddress).transferable(), false);
assertEq(MasterToken(masterTokenAddress).remoteBurnable(), true);
assertEq(MasterToken(masterTokenAddress).ownerToken(), ownerToken);
}
}