Ich habe eine Vertragsmethode transferFrom
, die fehlgeschlagen ist, als ich sie vom Backend der Site aufgerufen habe, aber gleichzeitig funktioniert sie von Remix.
Beide Aufrufe werden über Metamask durchgeführt. Anfangs dachte ich, dass es mit der Gasmenge zusammenhängen könnte, aber als ich die Methode von Remix aufrief und die Gasmenge angab, die für die fehlgeschlagene Transaktion verwendet wurde - es funktioniert, also habe ich keine Ahnung, was das Problem ist.
Hier ist eine fehlgeschlagene Transaktion , die mit diesem Code aufgerufen wurde:
Eth.contract._approve(toAddress, fromAddress, amount)
.then(async result => {
const tx = await Eth.contract.transferFrom.sendTransaction(fromAddress, toAddress, amount);
return res.json({success: true, data: {from: fromAddress, to: toAddress, amount: amount, tx: tx}});
})
.catch(error => {
return res.boom.badImplementation('Unable to approve transfer ' + amount + ' tokens to the address ' + fromAddress, {success: false});
});
_approve
ist eine spezielle Funktion im Vertrag, die nur für den Vertragsinhaber zugänglich ist und 3 Parameter anstelle von 2 hat, die von der ERC20-Schnittstelle benötigt werden.
Und hier ist eine funktionierende Transaktion , die von Remix mit demselben geladenen Vertrag aufgerufen wird.
Endlich hab ich es. Das Problem hat nichts mit dem Vertragscode zu tun, mit Ausnahme einiger require
darin enthaltener Anweisungen.
Die Methode transferFrom
stützt sich auf ein internes approved
Mitglied, das den zugeteilten Betrag enthält, der zwischen zwei Konten übertragen werden soll. Es wurde getan, um doppelte Funktionalität von Methoden transfer
und zusammenzuführen transferFrom
(siehe ERC20-Token-Schnittstelle). Aber es war ein Fehler.
Auf dem Backend der Website werden folglich 2 Methoden mit aufgerufen await
:
Aber als approve
bereits erwartet wurde und eine Antwort erhalten wurde, wurde sie nicht wirklich vom Netzwerk abgebaut und approved
die Zuordnung enthält nicht die erforderliche Menge. Aussage also require(approved[_from][_to] >= _amount)
fehlgeschlagen.
Lösung: nicht logisch unmergeble zusammenführen.
Die Nutzung transferFrom
umfasst drei Konten:
Jetzt sollte die Reihenfolge sein
der Eigentümer muss den Absender genehmigen
token.approve(sender, amount, { from: owner });
Der Absender kann die Überweisung vornehmen
token.transferFrom(owner, recipient, amount, { from: sender });
Alex GP
Ismael
{ from: sender }
, nicht vorhanden, ohne dass Sie die Transaktion vom Standardkonto senden.Alex GP
Alex GP
Ismael