/ test / CommunityMasterTokenFactory.t.sol
CommunityMasterTokenFactory.t.sol
  1  // SPDX-License-Identifier: UNLICENSED
  2  pragma solidity ^0.8.17;
  3  
  4  import { Test } from "forge-std/Test.sol";
  5  import { DeployContracts } from "../script/DeployContracts.s.sol";
  6  import { DeploymentConfig } from "../script/DeploymentConfig.s.sol";
  7  import { BaseTokenFactory } from "../contracts/factories/BaseTokenFactory.sol";
  8  import { CommunityMasterTokenFactory } from "../contracts/factories/CommunityMasterTokenFactory.sol";
  9  import { MasterToken } from "../contracts/tokens/MasterToken.sol";
 10  import { CommunityTokenDeployer } from "../contracts/CommunityTokenDeployer.sol";
 11  
 12  contract CommunityMasterTokenFactoryTest is Test {
 13      DeploymentConfig internal deploymentConfig;
 14  
 15      address internal deployer;
 16  
 17      CommunityTokenDeployer internal tokenDeployer;
 18  
 19      CommunityMasterTokenFactory internal masterTokenFactory;
 20  
 21      function setUp() public virtual {
 22          DeployContracts deployment = new DeployContracts();
 23          (tokenDeployer,,, masterTokenFactory, deploymentConfig) = deployment.run();
 24          deployer = deploymentConfig.deployer();
 25      }
 26  }
 27  
 28  contract DeploymentTest is CommunityMasterTokenFactoryTest {
 29      function setUp() public virtual override {
 30          CommunityMasterTokenFactoryTest.setUp();
 31      }
 32  
 33      function test_Deployment() public {
 34          assertEq(masterTokenFactory.owner(), deployer);
 35          assertEq(masterTokenFactory.tokenDeployer(), address(tokenDeployer));
 36      }
 37  }
 38  
 39  contract SetTokenDeployerAddressTest is CommunityMasterTokenFactoryTest {
 40      event TokenDeployerAddressChange(address indexed);
 41  
 42      function setUp() public virtual override {
 43          CommunityMasterTokenFactoryTest.setUp();
 44      }
 45  
 46      function test_RevertWhen_SenderIsNotOwner() public {
 47          vm.expectRevert(bytes("Ownable: caller is not the owner"));
 48          masterTokenFactory.setTokenDeployerAddress(makeAddr("something"));
 49      }
 50  
 51      function test_RevertWhen_InvalidTokenDeployerAddress() public {
 52          vm.prank(deployer);
 53          vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenDeployerAddress.selector);
 54          masterTokenFactory.setTokenDeployerAddress(address(0));
 55      }
 56  
 57      function test_SetTokenDeployerAddress() public {
 58          address someAddress = makeAddr("someAddress");
 59          vm.prank(deployer);
 60          vm.expectEmit(true, true, true, true);
 61          emit TokenDeployerAddressChange(someAddress);
 62          masterTokenFactory.setTokenDeployerAddress(someAddress);
 63          assertEq(masterTokenFactory.tokenDeployer(), someAddress);
 64      }
 65  }
 66  
 67  contract CreateTest is CommunityMasterTokenFactoryTest {
 68      event CreateToken(address indexed);
 69  
 70      function setUp() public virtual override {
 71          CommunityMasterTokenFactoryTest.setUp();
 72      }
 73  
 74      function test_RevertWhen_SenderIsNotTokenDeployer() public {
 75          string memory name = "TestToken";
 76          string memory symbol = "TEST";
 77          string memory baseURI = "http://test.dev";
 78          address ownerToken = makeAddr("ownerToken");
 79          bytes memory signerPublicKey = bytes("");
 80  
 81          vm.prank(makeAddr("notTokenDeployer"));
 82          vm.expectRevert(BaseTokenFactory.BaseTokenFactory_NotAuthorized.selector);
 83          masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
 84      }
 85  
 86      function test_RevertWhen_InvalidTokenMetadata() public {
 87          string memory name = "";
 88          string memory symbol = "";
 89          string memory baseURI = "";
 90          address ownerToken = makeAddr("ownerToken");
 91          bytes memory signerPublicKey = bytes("");
 92  
 93          vm.startPrank(address(tokenDeployer));
 94          vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenMetadata.selector);
 95          masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
 96  
 97          baseURI = "http://test.dev";
 98          vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenMetadata.selector);
 99          masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
100  
101          symbol = "TEST";
102          vm.expectRevert(BaseTokenFactory.BaseTokenFactory_InvalidTokenMetadata.selector);
103          masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
104      }
105  
106      function test_RevertWhen_InvalidOwnerTokenAddress() public {
107          string memory name = "TestToken";
108          string memory symbol = "TEST";
109          string memory baseURI = "http://test.dev";
110          address ownerToken = address(0);
111          bytes memory signerPublicKey = bytes("");
112  
113          vm.prank(address(tokenDeployer));
114          vm.expectRevert(CommunityMasterTokenFactory.CommunityMasterTokenFactory_InvalidOwnerTokenAddress.selector);
115          masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
116      }
117  
118      function test_Create() public {
119          string memory name = "TestToken";
120          string memory symbol = "TEST";
121          string memory baseURI = "http://test.dev";
122          address ownerToken = makeAddr("ownerToken");
123          bytes memory signerPublicKey = bytes("some public key");
124  
125          vm.prank(address(tokenDeployer));
126          vm.expectEmit(false, false, false, false);
127          emit CreateToken(makeAddr("some address"));
128          address masterTokenAddress = masterTokenFactory.create(name, symbol, baseURI, ownerToken, signerPublicKey);
129  
130          assertEq(MasterToken(masterTokenAddress).totalSupply(), 0);
131          assertEq(MasterToken(masterTokenAddress).maxSupply(), type(uint256).max);
132          assertEq(MasterToken(masterTokenAddress).transferable(), false);
133          assertEq(MasterToken(masterTokenAddress).remoteBurnable(), true);
134          assertEq(MasterToken(masterTokenAddress).ownerToken(), ownerToken);
135      }
136  }