// contracts/zkAsset.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "../localhost/@openzeppelin/contracts/access/AccessControl.sol"; import "../localhost/@openzeppelin/contracts/GSN/Context.sol"; import "../localhost/@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "../localhost/@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol"; import "../localhost/@openzeppelin/contracts/token/ERC20/ERC20Pausable.sol"; contract zkAsset is ERC20, AccessControl, ERC20Burnable, ERC20Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); constructor() public ERC20("zkTEST-Asset", "zkA") { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(MINTER_ROLE, msg.sender); _setupRole(BURNER_ROLE, msg.sender); _setupRole(PAUSER_ROLE, msg.sender); } /** * @dev Destroys `amount` tokens for `from`. * * See {ERC20-_burn}. * * Requirements: * * - the caller must have the `BURNER_ROLE`. */ function burn(address from, uint256 amount) public { require(hasRole(BURNER_ROLE, msg.sender), "zkAsset: must have burner role to burn"); _burn(from, amount); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public { require(hasRole(MINTER_ROLE, _msgSender()), "zkAsset: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public { require(hasRole(PAUSER_ROLE, _msgSender()), "zkAsset: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public { require(hasRole(PAUSER_ROLE, _msgSender()), "zkAsset: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Pausable) { super._beforeTokenTransfer(from, to, amount); } }