Hi all,
I would like to ask you to advise me about my ERC777 contract implementation.
- Do I follow the best practice and it’s ready to go live or I missed something important?
- What is the best practice for the fee collector account, Shall I use a normal address or contract? and I’ll be very thankful if you can provide me an example of that, please.
My Contract:
// SPDX-License-Identifier: MIT
pragma solidity =0.6.8;
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC777/ERC777.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol";
contract BityEGP is Initializable, ERC777UpgradeSafe, PausableUpgradeSafe, AccessControlUpgradeSafe {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
function initialize(address[] memory defaultOperators) public initializer {
__ERC777_init('BityEGP', 'bEGP', defaultOperators);
__AccessControl_init();
__Pausable_init();
initRoles();
}
function initRoles() internal {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
function deposite(address to, uint256 amount) external {
require(isOperatorFor(msg.sender, to), "Unauthorized token operator!");
require(amount > 0, "No tokens to add!");
_mint(to, amount * 100, "", "");
}
function Withdrawal(address from, uint256 amount, uint256 fee) external {
require(isOperatorFor(msg.sender, from), "Unauthorized token operator!");
require(amount > 0, "No tokens to Withdrawal!");
uint256 total = amount.add(fee);
balanceOf(from).sub(total, "BityEGP: withdrawal amount + fee exceed balance");
operatorBurn(from, amount, "", "");
operatorSend(from, msg.sender, fee, "", ""); //Todo: check the fees address best practice
}
function transfer(address from, address to, uint256 amount, uint256 fee) external {
require(isOperatorFor(msg.sender, from), "Unauthorized token operator!");
require(amount > 0, "No tokens to transfer!");
uint256 total = amount.add(fee);
balanceOf(from).sub(total, "BityEGP: transfer amount + fee exceed balance");
operatorSend(from, to, amount, "", "");
operatorSend(from, msg.sender, fee, "", ""); //Todo: check the fees address best practice
}
function pause() public {
require(hasRole(PAUSER_ROLE, _msgSender()), "BityEGP: must have pauser role to pause");
_pause();
}
function unpause() public {
require(hasRole(PAUSER_ROLE, _msgSender()), "BityEGP: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(address operator, address from, address to, uint256 tokenId) internal virtual override (ERC777UpgradeSafe) {
super._beforeTokenTransfer(operator, from, to, tokenId);
require(!paused(), "BityEGP: token transfer while paused");
}
function version() public pure returns (string memory) {
return "v1";
}
uint256[50] private __gap;
}
Thanks in advance.