Web3 js 1.0 gibt beim Übertragen von Token einen großen Zahlenfehler aus

Wenn ich versucht habe, mehr als 1000 Token zu übertragen, wird ein Fehler wie unten erwähnt ausgegeben (ich verwende die Beta-Version von web3 js 1.0.0 34).

Fehler: [number-to-bn] beim Konvertieren der Nummer 1e+23 in die BN.js-Instanz, Fehler: ungültiger Zahlenwert. Der Wert muss eine Ganzzahl, ein Hex-String, eine BN- oder eine BigNumber-Instanz sein. Beachten Sie, dass Dezimalzahlen nicht unterstützt werden. Gegebener Wert: "1e+23

Finden Sie Codebeispiele, die ich ausprobiert habe.

//var tokens = amount * 1e18;
//var tokens = amount * (10 ** 18);
//var tokens = parseInt(amount) * 1e18;
//var tokens = web3.utils.toBN(amount);
//var tokens = amount * Math.pow(10, decimal)
var tokens = web3.utils.toBN(amount * 1e18) ;

Hat jemand mit diesem Problem konfrontiert?

Antworten (2)

Wenn Sie Web3.js verwenden und Ihr Token die Standarddezimalzahl 10 18 verwendet , können Sie auch web3.utils.toWei()und verwenden web3.utils.fromWei(), um ganz einfach zu und von den gewünschten großen Zahlen zu gelangen.

In dieser Situation können Sie Folgendes versuchen:

var amount = 1000
var tokens = web3.utils.toWei(amount.toString(), 'ether')

"1000000000000000000000"

Das kannst du dann ganz einfach in eine BN umwandeln:

var bntokens = web3.utils.toBN(tokens)
Danke für die Antwort. wenn ich den obigen Code versuche. Ich bekomme folgenden Fehler. UnhandledPromiseRejectionWarning: Fehler: Bitte übergeben Sie Zahlen als Zeichenfolgen oder BigNumber-Objekte, um Genauigkeitsfehler zu vermeiden. Code: var Betrag="10000000"; var token = SmartContractHelper.web3Provider.utils.toWei(parseInt(amount), 'ether'); var tokens = SmartContractHelper.web3Provider.utils.toBN(token)
Wenn ich die Token-Menge hartcodiert habe, funktioniert es einwandfrei. Wenn ich es von der Variablen übergebe, funktioniert es nicht. Fehlt mir etwas?
Schau dir meine Bearbeitung an. Grundsätzlich müssen Sie Zahlen verwenden, die als Zeichenfolgen dargestellt werden.
Ich bin froh, dass es geklappt hat. Fühlen Sie sich frei, diese Antwort als richtig zu markieren, damit die Frage korrekt als "beantwortet" indexiert wird.
<pre>
import { BigNumber} from 'ethers';

....

const decimals = 18;
const trans_amount = 1500;
const amount= BigNumber.from(trans_amount).mul(BigNumber.from(10).pow(decimals));

consoel.og("amount is ", amount);
</pre>