pragma solidity ^0.6.12; library SafeMath { function mul(uint a, uint b) internal pure returns (uint) { uint c = a * b; require(a == 0 || c / a == b); return c; } function div(uint a, uint b) internal pure returns (uint) { require(b > 0); uint c = a / b; require(a == b * c + a % b); return c; } function sub(uint a, uint b) internal pure returns (uint) { require(b <= a); return a - b; } function add(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a); return c; } function max64(uint64 a, uint64 b) internal pure returns (uint64) { return a >= b ? a : b; } function min64(uint64 a, uint64 b) internal pure returns (uint64) { return a < b ? a : b; } function max256(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min256(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } } contract ADXSupplyController { enum GovernanceLevel { None, Mint, All } mapping (address => uint8) governance; constructor() public { governance[msg.sender] = uint8(GovernanceLevel.All); } function mint(ADXToken token, address owner, uint amount) external { require(governance[msg.sender] >= uint8(GovernanceLevel.Mint), 'NOT_GOVERNANCE'); uint totalSupplyAfter = SafeMath.add(token.totalSupply(), amount); // 10 September 2020 if (now < 1599696000) { // 50M * 10**18 require(totalSupplyAfter <= 50000000000000000000000000, 'EARLY_MINT_TOO_LARGE'); } else { // 150M * 10**18 require(totalSupplyAfter <= 150000000000000000000000000, 'MINT_TOO_LARGE'); } token.mint(owner, amount); } function changeSupplyController(ADXToken token, address newSupplyController) external { require(governance[msg.sender] >= uint8(GovernanceLevel.All), 'NOT_GOVERNANCE'); token.changeSupplyController(newSupplyController); } function setGovernance(address addr, uint8 level) external { require(governance[msg.sender] >= uint8(GovernanceLevel.All), 'NOT_GOVERNANCE'); governance[addr] = level; } }