Solidity

Ethers JS BigNumber 錯誤

  • September 11, 2022

我正在嘗試將以下數字傳遞approve()給標準ERC20Token 合約的函式:

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);

好吧,當我將其傳遞finalNumberapprove()我時,會出現此錯誤:

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

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