Как исправить ошибку «Ошибка оценки газа» при переносе ролей Minter и Owner на новую учетную запись в одной функции? - PullRequest
1 голос
/ 26 сентября 2019

У меня есть простой контракт ERC20, который называется ERC20Detailed, ERC20Mintable и Ownable.При развертывании я хочу:

  1. Добавить Minter к новой учетной записи, переданный в аргументе
  2. Удалить развертыватель из роли Minter
  3. Передать право собственности на новую учетную запись, переданов аргументе

Те же действия, которые я объявил в другой функции под названием TransferRights ()

Проблема в том, что я получаю «Ошибка оценки газа»,Это не потому, что мне не хватает газа, но в коде может быть ошибка.Если я удаляю первые два (addMinter, renounceMinter) действия, то все хорошо (без предупреждения).

Я развернул этот контракт на Ropsten, где я получал ту же ошибку в начале, но комментируя первые двадействия и добавление их снова, транзакция прошла без какого-либо предупреждения, и Контракт работает, как и должно быть.

pragma solidity ^0.5.0;

import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/ownership/Ownable.sol";


contract MyToken is ERC20Detailed, ERC20Mintable, Ownable {    

    uint256 private msgCount;
    address constant ETHER = address(0);
    mapping(uint256 => string) private message;

    constructor(string memory name, string memory symbol, uint8 decimals, address _newOwner) ERC20Detailed(name, symbol, decimals) public {
        addMinter(_newOwner);
        renounceMinter();
        transferOwnership(_newOwner);
    }

    function doMint(uint256 _amount, address _beneficiary1, address _beneficiary2, address _beneficiary3) public onlyOwner {
        require (_amount >= 0);
        require(_beneficiary1 != ETHER && _beneficiary2 != ETHER && _beneficiary3 != ETHER);
        require(mint(_beneficiary1, _amount.mul(20).div(100)));
        require(mint(_beneficiary2, _amount.mul(30).div(100)));
        require(mint(_beneficiary3, _amount.mul(50).div(100)));
    }

    function setMessage(string memory _message) public onlyOwner {
        message[msgCount] = _message;
        msgCount = msgCount.add(1);
    }

    function readMessage(uint256 _msgId) public view returns(string memory) {
        return message[_msgId];
    }

    function transferRights(address _newOwner) public onlyOwner {
        addMinter(_newOwner);
        renounceMinter();
        transferOwnership(_newOwner);
    }
}

Я все еще могу отправить транзакцию и развернуть, я думаю (как упоминалось выше, я сделал это в testnet),несмотря на то, что он говорит «Выполнение транзакции, скорее всего, завершится неудачей», но я хочу убедиться, что код не содержит ошибок.Любая обратная связь будет принята с благодарностью.Спасибо!

ОБНОВЛЕНИЕ Проблема найдена!В конструкторе я передавал тот же адрес учетной записи, который использовал для развертывания.Таким образом, это привело к добавлению роли Минтера для меня, которая у меня уже была.

...