Solidity

Metamask web3js ERC20代幣傳輸函式在數量小於1時拋出錯誤

  • December 18, 2017

我正在開發一個允許使用者使用 ERC20 代幣支付的 Dapp。我製作了一個標準的 ERC20 代幣,並將合約部署到一個帶有 truffle 的 testrpc 節點,並且我能夠在 truffle 合約中獲得一個代幣合約的實例。

我可以呼叫金額大於 1 的代幣轉移函式,用 metamask 簽署交易後,一切正常,我得到交易收據,代幣餘額被扣除。

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

但是,當 amount 參數小於 1 時,我在 chrome 控制台中收到錯誤消息:

errors.js:35 未擷取(承諾中)錯誤:錯誤:

$$ ethjs-rpc $$有效載荷 {“id”:7447005951567,“jsonrpc”:“2.0”,“params”:$$ “0xf8b0178504a817c8008346612494e7194e2016d5454d5791d94d8a6aff6c1ead645780b844a9059cbb00000000000000000000000000d1ae0a6fc13b9ecdefa118b94cf95ac16d4ab000000000000000000000000000000000000000000000000000000000000000008602c0d0e327cba0a30d94d6e74e0e2f602c5fba9ea677f5d81d99e52acde754bbbe65b9dd295d9fa01e5d09addbdcd9f5cd311f06790406b69d92b162386789277bdde2de6d18cb13” $$“method”:“eth_sendRawTransaction”} 錯誤:處理事務時出現 VM 異常:revert

起初我認為你不能將浮點數發送到松露合約實例中,因為solidity 不處理浮點數,但呼叫金額1.1就可以了。我還嘗試通過將數量設置為來將浮點數轉換為 BigNumber new BigNumber(0.1),但同樣的錯誤仍然存在。

我在這裡錯過了什麼嗎?能夠發送少於 1 個令牌似乎是一個非常典型的案例。

Solidity 不支持浮點數,因此當您處理令牌時,這就是您擁有 decimals 狀態變數的原因。

創建令牌時,您可能指定了 18 位小數,這是最常見的數字,但也可能是 0(在這種情況下它們不能被整除)。

所以,實際上,一個單位的代幣不會是“1”,而是 1000000000000000000 或 1 * (10 ** 18)。

如果您想轉移少於 1 個單位的代幣,您將轉移 5 * (10 ** 17) -> 那將是 0.5(或一半)一個代幣。

然後,在前端,您必須知道代幣使用了多少小數,並將使用者的餘額除以小數,這樣您就可以獲得某人持有的正確數量的代幣。

例如,如果我的餘額為 240000000000000000000 (240 * 10 ** 18),我的實際代幣餘額將是 240 個代幣。

引用自:https://ethereum.stackexchange.com/questions/33697