Javascript

在安全帽測試中設置和更改常量變數

  • October 15, 2022

我的穩固性有一個不變的變數:

address private constant MY_ADDRESS = 0x000000000

但是,MY_ADDRESS可能會因我的測試而改變,但在我的契約中,我希望將其保持不變。

我該如何解決這個問題?

您不能更改常量的值,因為它的值是硬編碼的。

看到這個

您可以在建構子中設置 MY_ADDRESS 以便為每個測試動態設置嗎?

您需要在測試期間換出字節碼,然後設置程式碼。

const CONSTANT_VARIABLE_TO_REPLACE = "0xC1E088fC1323b20BCBee9bd1B9fC9546db5624C5"

async function swapOutConstant(contractAddress, newConstantVariable) {
 let contractJson = fs.readFileSync(
   `./artifacts/contracts/MyContract.sol/MyContract.json`
 );

 const constantToReplaceSubstring = CONSTANT_VARIABLE_TO_REPLACE.substring(2);

 await network.provider.send("hardhat_setCode", [
   contractAddress,
   JSON.parse(contractJson).deployedBytecode.replaceAll(
     constantToReplaceSubstring.toLowerCase(),
     newConstantVariable.substring(2).toLowerCase()
   ),
 ]);

 const myContract = await ethers.getContractAt("MyContract", contractAddress);
 return myContract;
}

然後,在你的測試中導入這個函式,並設置你想要測試的合約。

在這個例子中,我們使用,substring因為地址的字節碼沒有0x,所以我們把它去掉。

請注意,在處理可能重複的數字時,這會變得更加困難。使用地址很容易,因為當不引用您要替換的地址時,地址不太可能出現在您的字節碼中。

可能是這個星球上最醜的東西。我認為我們應該提出一個安全帽問題。

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