Remix: Benötigtes Gas übersteigt Freibetrag oder Transaktion immer fehlgeschlagen

Ich habe einen Vertrag mit transferFrom-Funktion

    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;
    }

Wenn ich diese Funktion ausführe, erhalte ich einen Fehler:

Fehlerhafte Gasschätzung mit folgender Meldung (siehe unten). Die Ausführung der Transaktion wird wahrscheinlich fehlschlagen. Möchten Sie das Senden erzwingen?

Das benötigte Gas übersteigt den Freibetrag oder die Transaktion schlägt immer fehl

Ich habe viele Antworten in StackOverflow gelesen. Keine Lösungsarbeit für mich

wie ist das transactionLockdefiniert? ist das eingestellt false?
Ja, es ist falseim Konstruktor initialisiert

Antworten (1)

Möglicherweise hat das Konto dem Konto nicht fromerlaubt ,to Geld abzuheben. Ich empfehle, einige zusätzliche Überprüfungen hinzuzufügen:

  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;
  }

Stellen Sie außerdem sicher, dass das fromKonto es dem Konto erlaubt to, den tokensBetrag abzuheben, und es sollte funktionieren

Ich folge diesem Link für diesen Vertrag. theethereum.wiki/w/index.php/ERC20_Token_Standard
Wenn ich denselben Code mit javascriptVM ausführe. es gibt mir diesen Fehler The constructor should be payable if you send value.
Die transferFrom()Funktion, die ich Ihnen gegeben habe, ist die von openZeppelin: github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… plus Ihre hinzugefügten Modifikationen
Gibt es eine Einschränkung bei der Auswahl dieser von und zu Adressen ODER ich kann jede Adresse verwenden. Ich habe ein Token an die Absenderadresse gesendet, und die Zieladresse ist eine neue Adresse, die kein Token hat. Wenn ich eine Transaktion mache, gibt es diesen Fehler.
Sie können eine beliebige Adresse verwenden , aber bevor transferFrom(from, to, amount)Sie die anrufen, müssen Sie auch approve(to, amount)von der oben genannten from -Adresse anrufen.
Wie kann ich approve(to,amount)Methode von fromAdresse aufrufen. Meine fromAdresse ist eine zufällige Adresse, die ich von Etherscan genommen habe. Ich habe die Methode "approve" von remix ui aus aufgerufen und versucht, eine Übertragung durchzuführen. Ich bekomme denselben Fehler
approve()Sie können nicht von einer zufälligen Adresse anrufen . Sie müssen es von der Adresse aufrufen, die die Tokens hat . Diese Adresse muss unter Ihrer Kontrolle sein (um Transaktionen damit signieren zu können).
Es funktioniert nicht :( Ich habe einen Vertrag mit meiner Coinbase-Adresse bereitgestellt. Ich habe einen Token an Adresse A gesendet. Jetzt wechsle ich das Konto von meiner Coinbase zu A. Jetzt habe ich zuerst die Methode genehmigen an Adresse B aufgerufen, um 10 Token zu erhalten. Dann habe ich transferFrom aufgerufen (Adresse von A, Adresse von B, 10). Ich habe dieselbe Warnung erhalten und eine Transaktion durchgeführt, bei der ich Hash erhalten habe, aber kein Guthaben in B