Contract-Development

為 ico 設置價格時出現小數問題

  • February 11, 2022
/// @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 庫

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