Solidity
Ethers JS BigNumber 錯誤
我正在嘗試將以下數字傳遞
approve()
給標準ERC20
Token 合約的函式:2^256-1
我讀到這應該
BigNumber
使用以下程式碼來完成:const maxInt = new BN("2").pow(new BN("256").sub(new BN("1"))); // Will pass into solidity as uint 2**256 - 1
好吧,我使用該程式碼遇到了各種各樣的錯誤-對於初學者來說,它的語法和命令看起來
BigNumber
完全不同,具體取決於ethers
您碰巧使用的版本-而且我碰巧在 V. 4.0 上-並且會非常更願意現在就堅持下去,以避免其他潛在的麻煩。因此,我嘗試了上述程式碼的各種變體 - 這是我將該公式的每個組件分解成它自己的單獨部分的地方 - 只是為了看看發生了什麼:
// ==>Using 'bigNumberify' let bigNum2 = ethers.utils.bigNumberify("2"); console.log("'bigNum2' -> '2' = ", bigNum2); let bigNum256 = ethers.utils.bigNumberify("256"); console.log("'bigNum256' -> '256' = ", bigNum256); let bigNum2power256 = ethers.utils.bigNumberify(bigNum2.pow(bigNum256)); console.log("'bigNum2power256' -> 2^256= ", bigNum2power256); let bigNum1 = ethers.utils.bigNumberify("1"); console.log("'bigNum1' -> '1' = ", bigNum1); let finalNumber = ethers.utils.bigNumberify(bigNum2power256 - bigNum1); console.log("'finalNumber' = ", finalNumber);
好吧,當我將其傳遞
finalNumber
給approve()
我時,會出現此錯誤:Uncaught (in promise) Error: underflow (operation="setValue", fault="underflow", value=1.157920892373162e+77, outputValue=1, version=4.0.45)
我在這段程式碼上嘗試了各種變體——比如替換這一行:
let bigNum2power256 = ethers.utils.bigNumberify(bigNum2.pow(bigNum256));
和:
let bigNum2power256 = bigNum1.pow(bigNum2);
但這也不起作用。
我嘗試的每一個變化——而且有很多——似乎給了我另一種錯誤——為什麼這很難?這樣做的正確方法是什麼?
==========================
更新:
需要明確的是
2^256-1
,我儲存在bigNum2power256
變數中的 - 的值最終需要作為以下合約函式呼叫的第二個參數傳入:tokenContractInstance.approve(contractAddress, bigNum2power256, { gasLimit: 500_000 }).then((txResult) => { console.log("Back from 'tokenContractInstance' 'approve'"); console.log(">Here's the 'approve' txResult = \n", txResult); ..... }
如果你使用 ethers.js,有一個常量模組可以直接使用:這裡
const maxNumber = ethers.constants.MaxUint256