Metamask web3js ERC20代幣傳輸函式在數量小於1時拋出錯誤
我正在開發一個允許使用者使用 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
就可以了。我還嘗試通過將數量設置為來將浮點數轉換為 BigNumbernew BigNumber(0.1)
,但同樣的錯誤仍然存在。我在這裡錯過了什麼嗎?能夠發送少於 1 個令牌似乎是一個非常典型的案例。
Solidity 不支持浮點數,因此當您處理令牌時,這就是您擁有 decimals 狀態變數的原因。
創建令牌時,您可能指定了 18 位小數,這是最常見的數字,但也可能是 0(在這種情況下它們不能被整除)。
所以,實際上,一個單位的代幣不會是“1”,而是 1000000000000000000 或 1 * (10 ** 18)。
如果您想轉移少於 1 個單位的代幣,您將轉移 5 * (10 ** 17) -> 那將是 0.5(或一半)一個代幣。
然後,在前端,您必須知道代幣使用了多少小數,並將使用者的餘額除以小數,這樣您就可以獲得某人持有的正確數量的代幣。
例如,如果我的餘額為 240000000000000000000 (240 * 10 ** 18),我的實際代幣餘額將是 240 個代幣。