Solidity

將 JavaScript 數字轉換為 uint256

  • November 6, 2020

我正在嘗試使用 Web3 部署 ERC20 合約。

這是合約建構子的樂趣:

constructor(
       string memory name,
       string memory symbol,
       uint8 decimals,
       uint256 totalSupply
       uint256 tokenCap,
   )

這是使用 Web3 的輸入變數:

const tx = erc20.deploy({
   data: erc20Contract.bytecode,
   arguments: [
     name,
     symbol,
     decimalPrecision,
     web3.utils.toBN(totalSupply), 
     web3.utils.toBN(tokenCap),
   ]
 });

// Input variables
{
   "name": "leo",
   "symbol": "LEO",
   "totalSupply": 123,
   "tokenCap": 220000,
   "decimalPrecision": 11
}

在 Etherscan 中檢查後,我得到了以下十進制數,

輸出:0.00000000123 LEO

預計:123 LEO

所以我的問題是,由於缺少 JavaScript 編號到 Solidity uint256 之間的轉換?

在此處輸入圖像描述

這是因為 JavaScript 編號與 Solidity uint256 之間缺少轉換嗎?

不,當使用 web3.js 與合約函式互動時,你可以通過:

  • 一個整數
  • 以十進制格式表示整數的字元串
  • 以十六進制格式表示整數的字元串
  • 一個BN對象(或BigNumberweb3.js 舊版本 v0.x 上的一個對象)

您的問題源於這樣一個事實,即對於 ERC20 函式,輸入和輸出量始終以“10 ^ 小數”解析度指定,而您使用“令牌”解析度。

換句話說,您需要:

  • 將每個金額從“令牌”解析度轉換為“10 ^ 小數”解析度,然後將其作為輸入傳遞給 ERC20 函式
  • 在接收到 ERC20 函式的輸出後,將每個金額從“10 ^ 小數”解析度轉換為“令牌”解析度

在你的情況下,你可以簡單地改變這個:

arguments: [
   name,
   symbol,
   decimalPrecision,
   web3.utils.toBN(totalSupply), 
   web3.utils.toBN(tokenCap)
]

對此:

arguments: [
   name,
   symbol,
   decimalPrecision,
   web3.utils.toBN(String(totalSupply) + "0".repeat(decimalPrecision)), 
   web3.utils.toBN(String(tokenCap) + "0".repeat(decimalPrecision))
]

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