Javascript
在安全帽測試中設置和更改常量變數
我的穩固性有一個不變的變數:
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
,所以我們把它去掉。請注意,在處理可能重複的數字時,這會變得更加困難。使用地址很容易,因為當不引用您要替換的地址時,地址不太可能出現在您的字節碼中。
可能是這個星球上最醜的東西。我認為我們應該提出一個安全帽問題。