Vertragsruf funktioniert nicht über web3

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

_approveist 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.

Antworten (2)

Endlich hab ich es. Das Problem hat nichts mit dem Vertragscode zu tun, mit Ausnahme einiger requiredarin enthaltener Anweisungen.

Die Methode transferFromstützt sich auf ein internes approvedMitglied, das den zugeteilten Betrag enthält, der zwischen zwei Konten übertragen werden soll. Es wurde getan, um doppelte Funktionalität von Methoden transferund zusammenzuführen transferFrom(siehe ERC20-Token-Schnittstelle). Aber es war ein Fehler.

Auf dem Backend der Website werden folglich 2 Methoden mit aufgerufen await:

  • genehmigen
  • Übertragen von

Aber als approvebereits erwartet wurde und eine Antwort erhalten wurde, wurde sie nicht wirklich vom Netzwerk abgebaut und approveddie Zuordnung enthält nicht die erforderliche Menge. Aussage also require(approved[_from][_to] >= _amount)fehlgeschlagen.

Lösung: nicht logisch unmergeble zusammenführen.

Die Nutzung transferFromumfasst drei Konten:

  • Eigentümer: Konto, das die Token hat
  • Empfänger: Konto, das Token erhält
  • sender: Konto, das die Transaktion durchführt

Jetzt sollte die Reihenfolge sein

  1. der Eigentümer muss den Absender genehmigen

    token.approve(sender, amount, { from: owner });
    
  2. Der Absender kann die Überweisung vornehmen

    token.transferFrom(owner, recipient, amount, { from: sender });
    
Genau das habe ich getan, nur den Genehmigungsschritt ausgelassen. Genehmigte korrekte Menge, wie ich bereits erwähnt habe, funktioniert dieser Anruf, wenn er über Remix ausgeführt wird.
@AlexG.P. In Ihrem Code sind die Transaktionsoptionen, dh der letzte Parameter { from: sender }, nicht vorhanden, ohne dass Sie die Transaktion vom Standardkonto senden.
es funktioniert nicht. Standardmäßig habe ich nur eine Brieftasche/Adresse als Absender aller Transaktionen - es ist Vertragsinhaber/Ersteller. Ich habe den Beitrag mit dem vollständigen Genehmigungsübertragungscode aktualisiert. Genehmigung und Übertragung werden vom Vertragsersteller durchgeführt, es ist also dasselbe wie von Ihnen angegeben. Und es hilft nicht.
Wie Sie sehen können, funktioniert außerdem dieselbe Transaktion mit demselben Transaktionsinitiator perfekt von Remix.
Beide Transaktionen sind identisch, in geth vm trace haben sie einen ähnlichen Start, führen zwei externe Anrufe durch, der fehlgeschlagene tx macht einen Rücksprung um Schritt 1050, aber der erfolgreiche läuft weiter bis Schritt 2190. Ohne den Vertragscode ist es unmöglich, mehr zu sagen.