contract CMErc20MintPauseSnap is CMERC20Mintable, CMERC20Pausable, CMERC20Snapshot,  CM {

    constructor(string memory name, string memory symbol, uint256 amount, uint8 decimals) ERC20(name, symbol) public payable {
        _supportCM();
        cmContractType = "CMErc20MintPauseSnap";
        _setupDecimals(decimals);
        _mint(msg.sender, amount);
        
        // set up required roles
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
        _setupRole(SNAPSHOT_ROLE, _msgSender());
        
        
    }

    
    // overrides
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Pausable) {
        super._beforeTokenTransfer(from, to, amount);
	}function _burn(address account, uint256 value) internal override(ERC20, ERC20Snapshot) {
        super._burn(account, value);
    }

    function _mint(address account, uint256 value) internal override(ERC20, ERC20Snapshot) {
        super._mint(account, value);
    }

    function _transfer(address from, address to, uint256 value)internal override(ERC20, ERC20Snapshot) {
        super._transfer(from, to, value);
    }
    

}
// imports
function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Pausable) {
        super._beforeTokenTransfer(from, to, amount);
	}
// overrides