Solidity
需要將十進制數發送到智能合約進行計算
我正在嘗試編寫一個智能合約來執行以下操作。
contract MyContract is ERC20{ IERC20 market; IERC20 coin; uint256 feesFactor = 0; uint256 conversionRatio = 0; function setConversion(uint256 ratio) public { conversionRatio = ratio; } function getConversion() public view returns (uint256) { return conversionRatio; } function setFeesFactor(uint256 fees) public { feesFactor = fees; } function deposit(uint256 _amount) external onlyPositive(_amount) { coin.transferFrom(msg.sender, address(this), _amount); uint256 fees = _amount * feesFactor; market.mint(_amount - fees); uint256 tokens = (_amount - swapFees) * getConversion(); _mint(msg.sender, tokens); } }
使用 web3js,我嘗試將 .03 傳遞給 the
feeFactor
,將 .04 傳遞給conversionRatio
usingweb3.utils.toWei()
。這有效,我可以在使用後顯示這些值web3.utils.fromWei()
。但是我的
deposit
功能默默地失敗了;該_amount
值也使用web3.utils.toWei()
.我需要對智能合約和 web3js 程式碼進行哪些更改,以便我可以使用小數
.03
,.04
並讓存款功能正常工作。是的,在呼叫之前
approval
已經完成。謝謝。coin``deposit
不幸的是,你不能在 Solidity 中使用小數位,至少目前不能。在此處查看 OpenZeppellin 關於小數的註釋,並在此處查看 Solidity文件
我建議以整數計算,以完全消除小數位(和頭痛)。
您可以將
conversionRatio
和feeFactor
視為百分比。例如:.03
是3%
。您只需3
從 web3js 發送號碼,無需與 Wei 進行任何轉換。費用的計算如下所示:uint256 fees = (_amount / 100) * feesFactor;
另一種選擇是費用是否有機會進一步降低。您也可以將
conversionRatio
和feeFactor
視為基點。一個基點(bp 或‱)是 1 個百分點的百分之一。例如:.03
是300bp
或300‱
。您只需300
從 web3js 發送號碼,無需與 Wei 進行任何轉換。費用的計算如下所示:uint256 fees = (_amount / 10000) * feesFactor;
您可以在常量中定義 the
10000
或 the100
,甚至可以創建一個輔助函式來計算百分比。