Solidity

需要將十進制數發送到智能合約進行計算

  • October 29, 2022

我正在嘗試編寫一個智能合約來執行以下操作。

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 傳遞給conversionRatiousing web3.utils.toWei()。這有效,我可以在使用後顯示這些值web3.utils.fromWei()

但是我的deposit功能默默地失敗了;該_amount值也使用web3.utils.toWei().

我需要對智能合約和 web3js 程式碼進行哪些更改,以便我可以使用小數.03.04並讓存款功能正常工作。

是的,在呼叫之前approval已經完成。謝謝。coin``deposit

不幸的是,你不能在 Solidity 中使用小數位,至少目前不能。在此處查看 OpenZeppellin 關於小數的註釋,並在此處查看 Solidity文件

我建議以整數計算,以完全消除小數位(和頭痛)。

您可以將conversionRatiofeeFactor視為百分比。例如:.033%。您只需3從 web3js 發送號碼,無需與 Wei 進行任何轉換。費用的計算如下所示:

uint256 fees = (_amount / 100) * feesFactor;

另一種選擇是費用是否有機會進一步降低。您也可以將conversionRatiofeeFactor視為基點。一個基點(bp 或‱)是 1 個百分點的百分之一。例如:.03300bp300‱。您只需300從 web3js 發送號碼,無需與 Wei 進行任何轉換。費用的計算如下所示:

uint256 fees = (_amount / 10000) * feesFactor;

您可以在常量中定義 the10000或 the 100,甚至可以創建一個輔助函式來計算百分比。

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