Вопросы по контракту MinterRole в openzeppelin - PullRequest
0 голосов
/ 26 декабря 2018

Я использую openzeppelin для создания контракта ICO.Я обеспокоен MinterRole здесь.После того, как я разработал контракт Token, я добавил договор купли-продажи с помощью функции addMinter.

Вопрос

После того, как продажа закончится

  1. Я не вижу способа удалить адрес контракта как минера,Я вижу, что "renounceMinter" удалит только того, кто вызывает этот метод.Я понимаю, даже если я удаляю (или не удаляю) адрес контракта как майнер в тот момент (т. Е. После того, как продажа закончена), договор купли-продажи будет определен таким образом, что он вообще не будет работать.безопасно ли это, даже если мы оставляем адрес контракта в списке minter?

  2. Почему 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);
  }
}
...