Не могу использовать функцию передачи, как она написана. Предполагается, что владелец использует его. Таким образом, была создана новая функция для функции «чеканки» для использования сборщиком. Не знаю, почему сообщение компилятора такое загадочное.
totalSupply_ = totalSupply_.add(_amount);
balances[_to] = balances[_to].add(_amount);
emit Mint(_to, _amount);
emit Transfer(address(0), _to, _amount);
Пытаюсь создать Faucet для моего токена ERC-20 и получаю сообщение «Ошибка оценки газа» при запуске моей dripToken
функции, которая выглядит следующим образом (ОБНОВЛЕНО):
function dripToken() public {
require(faucetStatus);
if(!checkStatus(msg.sender)) revert();
tokenInstance.updateSupply(oneToken);
updateStatus(msg.sender, oneMinute);
tokenInstance.transfer(msg.sender, oneToken);
}
Я сузил его до строки с вызовом передачи, которая вызывает ошибку. Теперь я развертываю свой токен ERC-20 и передаю его в контракт крана следующим образом:
constructor(string _fname, address _tokenInstance) public {
tokenInstance = MyToken(_tokenInstance);
faucetName = _fname;
faucetStatus = true;
emit FaucetOn(faucetStatus);
}
Моя функция передачи токена взята из https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol . Я только что заметил, что получаю предупреждение компилятора о функции передачи, которая намекает на проблему. , но я не понимаю, почему (пока). Вот предупреждение:
Требование к газу функции StandardToken.transfer(address,uint256) высокое: бесконечно. Если потребность в газе для функции выше, чем лимит газа в блоке, она не может быть выполнена. Пожалуйста, избегайте циклов в ваших функциях или действиях, которые изменяют большие области хранилища (включая очистку или копирование массивов в хранилище).
function transfer(address _to, uint256 _value) public returns (bool) {
require(_value <= balances[msg.sender]);
require(_to != address(0));
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
Я создаю свой токен следующим образом. Теперь я инициализирую его с небольшим запасом.
contract MyToken is StandardToken {
string public name;
uint8 public decimals;
string public symbol;
constructor() public {
StandardToken.balances[msg.sender] = 1000000000000000000;
StandardToken.totalSupply_ = 1000000000000000000;
name = "My Token";
decimals = 18;
symbol = "MY";
}
}
Разместил мой код на диске Google: https://drive.google.com/open?id=1EvKEVhD8bR2oKS2W1XNRQpTqVbieUcmC
См. ответ в верхней части ОП. Я думаю, что это был блок require, который не удался. Не уверен, почему компилятор так загадочен в этом.
Необходимо указать адрес, с которого осуществляется перевод. Например, если вы пытаетесь передать токен ERC20, код будет следующим:
ERC20TokenAddress.transfer(msg.sender, oneToken);
Без ведущего адреса EVM не знает, что передается.
setAddress()
функцию. Это будет выглядеть какfunction setAddress(address tokenAddress) onlyOwner { ERC20TokenAddress = tokenAddress; }
dripToken()
.
пользователь19510
transfer
, но я предполагаю, что это не сработает, если сам контракт не имеет достаточно высокого баланса. Вы можете просто хотетьtotalSupply_ += oneToken; balanceOf[msg.sender] += oneToken; emit Transfer(0, msg.sender, oneToken);
.Том Бердж
пользователь19510
Transfer
— это событие, которое должно генерироваться вашим токеном каждый раз, когда токен передается. (По соглашению генерируется событие, показывающее перевод с адреса 0, когда чеканятся новые токены.)Том Бердж
пользователь19510
Том Бердж
пользователь19510