Вопросы по контракту MinterRole в openzeppelin
Я использую openzeppelin для создания контракта ICO. Я обеспокоен MinterRole здесь. После того, как я разработал контракт Token, я добавил договор купли-продажи с помощью функции "addMinter".
Вопрос
После окончания продажи
Я не вижу способа удалить адрес договора как минера. Я вижу, что "renounceMinter" удалит только того, кто вызывает этот метод. Я понимаю, даже если я удаляю (или не удаляю) адрес контракта как майнер в тот момент (т. Е. После того, как продажа закончена), договор купли-продажи будет определен таким образом, что он вообще не будет работать. безопасно ли, даже если мы оставим адрес контракта в списке участников?
Почему openzeppelin разработал контракт "MinterRole" с функцией "renounceMinter", которая может удалить только человека, вызывающего этот контракт, но функция "addMinter" может сделать это и для других?
Код
SampleCrowdsale
contract SampleCrowdsale is FinalizableCrowdsale, MintedCrowdsale
MintedCrowdsale
contract MintedCrowdsale is Crowdsale {
constructor() internal {}
function _deliverTokens(
address beneficiary,
uint256 tokenAmount
)
internal
{
// Potentially dangerous assumption about the type of the token.
require(
ERC20Mintable(address(token())).mint(beneficiary, tokenAmount));
}
}
ERC20Mintable
contract ERC20Mintable is ERC20, MinterRole
MinterRole
pragma solidity ^0.4.24;
import "../Roles.sol";
contract MinterRole {
using Roles for Roles.Role;
event MinterAdded(address indexed account);
event MinterRemoved(address indexed account);
Roles.Role private minters;
constructor() internal {
_addMinter(msg.sender);
}
modifier onlyMinter() {
require(isMinter(msg.sender));
_;
}
function isMinter(address account) public view returns (bool) {
return minters.has(account);
}
function addMinter(address account) public onlyMinter {
_addMinter(account);
}
function renounceMinter() public {
_removeMinter(msg.sender);
}
function _addMinter(address account) internal {
minters.add(account);
emit MinterAdded(account);
}
function _removeMinter(address account) internal {
minters.remove(account);
emit MinterRemoved(account);
}
}