Metamask web3js ERC20-Token-Übertragungsfunktion gibt einen Fehler aus, wenn der Betrag kleiner als 1 ist

Ich arbeite an einer Dapp, die es Benutzern ermöglicht, mit einem ERC20-Token zu bezahlen. Ich habe ein Standard-ERC20-Token erstellt und den Vertrag auf einem Testrpc-Knoten mit Truffle bereitgestellt, und ich konnte eine Instanz des Token-Vertrags mit Truffle Contract abrufen.

Ich kann die Token-Übertragungsfunktion mit einem Betrag größer als 1 aufrufen, und nachdem ich die Transaktion mit Metamask signiert habe, funktioniert alles ordnungsgemäß, ich erhalte die Transaktionsquittung und das Token-Guthaben wird abgezogen.

tokenContract.deployed().then(async token => {
      token.transfer(toAddress, amount, {
        from: web3.eth.accounts[0],
        gas: 4612388
      });
    });

Wenn der Betragsparameter jedoch kleiner als eins ist, erhalte ich einen Fehler in der Chrome-Konsole:

errors.js:35 Uncaught (in promise) Error: Error: [ethjs-rpc] rpc error with payload {"id":7447005951567,"jsonrpc":"2.0","params":["0xf8b0178504a817c8008346612494e7194e2016d5454d5791d94d8a6aff6c1ead645780b844a9059cbb00000000000000000000000000d1ae0a6fc13b9ecdefa118b94cf95ac16d4ab000000000000000000000000000000000000000000000000000000000000000008602c0d0e327cba0a30d94d6e74e0e2f602c5fba9ea677f5d81d99e52acde754bbbe65b9dd295d9fa01e5d09addbdcd9f5cd311f06790406b69d92b162386789277bdde2de6d18cb13"],"method ":"eth_sendRawTransaction"} Fehler: VM-Ausnahme beim Verarbeiten der Transaktion: zurücksetzen

Zuerst dachte ich, dass Sie Floats nicht in Trüffelvertragsinstanzen senden können, weil Solidity Floats nicht verarbeitet, aber das Aufrufen des Betrags mit 1.1funktioniert einwandfrei. Ich habe auch versucht, den Float in eine BigNumber umzuwandeln, indem ich den Betrag auf gesetzt habe new BigNumber(0.1), und derselbe Fehler bleibt bestehen.

Übersehe ich hier etwas? Weniger als 1 Token senden zu können, scheint ein sehr typischer Anwendungsfall zu sein.

Antworten (1)

Solidity unterstützt keine Gleitkommazahlen. Wenn Sie also mit Token arbeiten, haben Sie deshalb die Zustandsvariable decimals.

Als Sie Ihr Token erstellt haben, haben Sie möglicherweise 18 Dezimalstellen angegeben, was die häufigste Zahl ist, aber auch 0 sein könnte (in diesem Fall wären sie nicht teilbar).

Eine Einheit Ihres Tokens wäre also nicht "1", sondern 1000000000000000000 oder 1 * (10 ** 18).

Wenn Sie weniger als 1 Einheit Ihres Tokens übertragen möchten, würden Sie 5 * (10 ** 17) übertragen -> Das wären 0,5 (oder die Hälfte) eines Tokens.

Dann müssten Sie am Frontend wissen, wie viele Dezimalstellen der Token verwendet, und das Guthaben des Benutzers durch die Dezimalstellen dividieren, damit Sie die richtige Menge an Token erhalten, die jemand hält.

Wenn ich zum Beispiel ein Guthaben von 240000000000000000000 (240 * 10 ** 18) habe, wäre mein echtes Token-Guthaben 240 Token.