83 lines
2.8 KiB
Solidity
83 lines
2.8 KiB
Solidity
|
pragma solidity 0.6.12;
|
||
|
|
||
|
// This is adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.0/contracts/presets/ERC721PresetMinterPauserAutoId.sol
|
||
|
|
||
|
import "./utils/AccessControl.sol";
|
||
|
import "@openzeppelin/contracts/GSN/Context.sol";
|
||
|
import "@openzeppelin/contracts/utils/Counters.sol";
|
||
|
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
|
||
|
import "@openzeppelin/contracts/token/ERC721/ERC721Burnable.sol";
|
||
|
import "@openzeppelin/contracts/token/ERC721/ERC721Pausable.sol";
|
||
|
|
||
|
|
||
|
contract ERC721MinterBurnerPauser is Context, AccessControl, ERC721Burnable, ERC721Pausable {
|
||
|
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
|
||
|
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
|
||
|
|
||
|
/**
|
||
|
* @dev Grants `DEFAULT_ADMIN_ROLE` and `MINTER_ROLE`to the account that
|
||
|
* deploys the contract.
|
||
|
*
|
||
|
* Token URIs will be autogenerated based on `baseURI` and their token IDs.
|
||
|
* See {ERC721-tokenURI}.
|
||
|
*/
|
||
|
constructor(string memory name, string memory symbol, string memory baseURI) public ERC721(name, symbol) {
|
||
|
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
|
||
|
|
||
|
_setupRole(MINTER_ROLE, _msgSender());
|
||
|
_setupRole(PAUSER_ROLE, _msgSender());
|
||
|
|
||
|
_setBaseURI(baseURI);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Creates a new token for `to`. Its token ID will be automatically
|
||
|
* assigned (and available on the emitted {Transfer} event), and the token
|
||
|
* URI autogenerated based on the base URI passed at construction.
|
||
|
*
|
||
|
* See {ERC721-_mint}.
|
||
|
*
|
||
|
* Requirements:
|
||
|
*
|
||
|
* - the caller must have the `MINTER_ROLE`.
|
||
|
*/
|
||
|
function mint(address to, uint256 tokenId, string memory _data) public {
|
||
|
require(hasRole(MINTER_ROLE, _msgSender()), "ERC721MinterBurnerPauser: must have minter role to mint");
|
||
|
|
||
|
_mint(to, tokenId);
|
||
|
_setTokenURI(tokenId, _data);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Pauses all token transfers.
|
||
|
*
|
||
|
* See {ERC721Pausable} and {Pausable-_pause}.
|
||
|
*
|
||
|
* Requirements:
|
||
|
*
|
||
|
* - the caller must have the `PAUSER_ROLE`.
|
||
|
*/
|
||
|
function pause() public {
|
||
|
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721MinterBurnerPauser: must have pauser role to pause");
|
||
|
_pause();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Unpauses all token transfers.
|
||
|
*
|
||
|
* See {ERC721Pausable} and {Pausable-_unpause}.
|
||
|
*
|
||
|
* Requirements:
|
||
|
*
|
||
|
* - the caller must have the `PAUSER_ROLE`.
|
||
|
*/
|
||
|
function unpause() public {
|
||
|
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721MinterBurnerPauser: must have pauser role to unpause");
|
||
|
_unpause();
|
||
|
}
|
||
|
|
||
|
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Pausable) {
|
||
|
super._beforeTokenTransfer(from, to, tokenId);
|
||
|
}
|
||
|
}
|