Ремикс: требуемый газ превышает норму или всегда не проходит транзакция

У меня есть контракт с функцией TransferFrom

    mapping(address => uint) balances;

    mapping(address => mapping(address => uint)) allowed;

    mapping (address => bool) public frozenAccount;

   // Transfer token from spender account to receiver account
    function transferFrom(address from, address to, uint tokens) public returns (bool success) {
        require(!transactionLock);         // Check for transaction lock
        require(!frozenAccount[from]);     // Check if sender is frozen
        require(!frozenAccount[to]);       // Check if recipient is frozen
        balances[from] = balances[from].sub(tokens);
        allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
        balances[to] = balances[to].add(tokens);
        emit Transfer(from, to, tokens);
        return true;
    }

Когда я выполняю эту функцию, я получаю сообщение об ошибке:

Произошла ошибка оценки газа со следующим сообщением (см. ниже). Выполнение транзакции, скорее всего, завершится ошибкой. Вы хотите принудительно отправить?

требуемый газ превышает норму или всегда не проходит транзакция

Я прочитал много ответов в StackOverflow. Никакое решение не работает для меня

как transactionLockопределяется? это установлено false?
да, он инициализируется falseв конструкторе

Ответы (1)

Возможно, учетная запись fromне позволила учетной записи toвывести средства. Я рекомендую добавить несколько дополнительных проверок:

  function transferFrom(
    address from,
    address to,
    uint256 tokens
  )
    public
    returns (bool)
  {
    require(!transactionLock);         // Check for transaction lock
    require(!frozenAccount[from]);     // Check if sender is frozen
    require(!frozenAccount[to]);       // Check if recipient is frozen

    require(tokens <= _balances[from]);
    require(tokens <= _allowed[from][msg.sender]);
    require(to != address(0));

    _balances[from] = _balances[from].sub(tokens);
    _balances[to] = _balances[to].add(tokens);
    _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(tokens);
    emit Transfer(from, to, tokens);
    return true;
  }

Кроме того, убедитесь, что fromучетная запись позволяет toучетной записи снимать tokensсумму, и она должна работать .

Я перехожу по этой ссылке для этого контракта. theethereum.wiki/w/index.php/ERC20_Token_Standard
Когда я выполняю тот же код с помощью javascriptVM. это дает мне эту ошибку The constructor should be payable if you send value.
функция transferFrom(), которую я вам дал, принадлежит openZeppelin: github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… плюс добавленные вами модификации
Существуют ли какие-либо ограничения в выборе адреса и адреса ИЛИ я могу использовать любой адрес? Я отправил некоторый токен с адреса, а адрес - это новый адрес, на котором нет токена. когда я делаю транзакцию, выдает эту ошибку.
вы можете использовать любой адрес , но прежде чем звонить transferFrom(from, to, amount), вы также должны позвонить approve(to, amount)из указанного выше адреса .
Как я могу вызвать approve(to,amount)метод из fromадреса. мой fromадрес - это случайный адрес, который я взял из etherscan. Я вызвал метод утверждения из пользовательского интерфейса remix и попытался сделать перенос. я получаю ту же ошибку
нельзя звонить approve()со случайного адреса. Вы должны вызывать его с адреса, имеющего токены . Этот адрес должен находиться под вашим контролем (чтобы иметь возможность подписывать с ним транзакции).
Это не работает :( Я развернул контракт, используя свой адрес coinbase. Я отправил токен на адрес A. Теперь я меняю учетную запись с моей coinbase на A. Теперь я сначала вызвал метод утверждения на адресе B, чтобы получить 10 токенов. Затем я вызвал transferFrom (Адрес А, адрес Б, 10). Я получил такое же предупреждение и сделал транзакцию, я получил хэш, но не получил баланс в Б