Solidity
將 JavaScript 數字轉換為 uint256
我正在嘗試使用 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
對象(或BigNumber
web3.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)) ]