Contract-Development
為 ico 設置價格時出現小數問題
/// @notice Constructor of the contract function startToken() { IcoIsRunning = true; minimalGoalReached = false; icoIsClosed = false; tokenBalanceOf[this] += _totalSupply; allowed[this][owner] = _totalSupply; currentTokenPrice = 1; // CURRENT price of 1 Token ICOprice = 1; // ICO price updatePrices(); }
如果我想要 1 個代幣兌換 0.001 ETH,我該如何設置?在這段程式碼中,每 1 個代幣 1 ETH(ICOprice)我嘗試了許多不同的方法,但都沒有成功。
Solidity 中的所有計算都是使用 wei 完成的。當您編寫
1 ether
時,它被用作1e18
,即 1 後跟 18 個零。所以你的變數會產生以下效果:
IcoPrice = 1000 * 1e18; buyBackPrice = 1000 * 9e17;
目前尚不清楚您要在哪裡設置它,我希望了解它的含義將使您能夠根據您的要求進行設置。
如果您想為每 0.001 設置 1 個令牌,即每 1 個 ETH 有 1000 個令牌,請按以下方式設置:
uint256 public rate = 1000;
然後根據 msg.value 計算費率:
amountToGive = rate.mul(msg.value); // if user send 1 ETH it will give 1000 tokens.
了解這裡,msg.value 在 WEI 中(所以如果我發送 1 ETH,msg.value = 1000000000000000000 WEI,1000000000000000000 * 1000 = 1×10²¹ 或 1000000000000000000000 WEI,即 1000 ETH/token
因此,如果您的令牌有 18 位小數,此解決方案將有效。
對於 10% 的利率,每個 ETH 將是 900 個代幣,因此:
uint256 public rate = 900; amountToGive = rate.mul(msg.value); // if user send 1 ETH it will give 900 tokens.
注意整個程式碼使用SafeMath 庫