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
Möglicherweise hat das Konto dem Konto nicht from
erlaubt ,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 from
Konto es dem Konto erlaubt to
, den tokens
Betrag abzuheben, und es sollte funktionieren
The constructor should be payable if you send value
.transferFrom()
Funktion, die ich Ihnen gegeben habe, ist die von openZeppelin: github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… plus Ihre hinzugefügten ModifikationentransferFrom(from, to, amount)
Sie die anrufen, müssen Sie auch approve(to, amount)
von der oben genannten from -Adresse anrufen.approve(to,amount)
Methode von from
Adresse aufrufen. Meine from
Adresse 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 Fehlerapprove()
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).
Tudor Constantin
transactionLock
definiert? ist das eingestelltfalse
?Ajit Soman
false
im Konstruktor initialisiert