У меня есть простой контракт ERC20, который называется ERC20Detailed, ERC20Mintable и Ownable.При развертывании я хочу:
- Добавить Minter к новой учетной записи, переданный в аргументе
- Удалить развертыватель из роли Minter
- Передать право собственности на новую учетную запись, переданов аргументе
Те же действия, которые я объявил в другой функции под названием 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),несмотря на то, что он говорит «Выполнение транзакции, скорее всего, завершится неудачей», но я хочу убедиться, что код не содержит ошибок.Любая обратная связь будет принята с благодарностью.Спасибо!
ОБНОВЛЕНИЕ Проблема найдена!В конструкторе я передавал тот же адрес учетной записи, который использовал для развертывания.Таким образом, это привело к добавлению роли Минтера для меня, которая у меня уже была.