getCode
签名
function getCode(string calldata) external returns (bytes memory);
描述
根据合约的路径返回项目中合约的 创建 字节码。
calldata 参数可以是 ContractFile.sol
(如果文件名和合约名相同),ContractFile.sol:ContractName
,或者是相对于项目根目录的工件路径。
ℹ️ 注意
getCode
需要输出目录的读取权限,请参阅 文件作弊码 。要授予读取访问权限,请在您的
foundry.toml
中设置fs_permissions = [{ access = "read", path = "./out"}]
。
例子
MyContract myContract = new MyContract(arg1, arg2);
// Let's do the same thing with `getCode`
bytes memory args = abi.encode(arg1, arg2);
bytes memory bytecode = abi.encodePacked(vm.getCode("MyContract.sol:MyContract"), args);
address anotherAddress;
assembly {
anotherAddress := create(0, add(bytecode, 0x20), mload(bytecode))
}
assertEq0(address(myContract).code, anotherAddress.code); // [PASS]
通过结合 getCode
和 etch
将合约部署到任意地址
// Deploy
bytes memory args = abi.encode(arg1, arg2);
bytes memory bytecode = abi.encodePacked(vm.getCode("MyContract.sol:MyContract"), args);
address deployed;
assembly {
deployed := create(0, add(bytecode, 0x20), mload(bytecode))
}
// Set the bytecode of an arbitrary address
vm.etch(targetAddr, deployed.code);
Supported formats
你可以通过合约路径或合约名称获取构件。也支持获取特定版本的构件。如果未提供版本,cheatcode 将默认为正在执行的测试版本或构件编译时的唯一版本。
vm.getCode("MyContract.sol:MyContract");
vm.getCode("MyContract");
vm.getCode("MyContract.sol:0.8.18");
vm.getCode("MyContract:0.8.18");
另请参阅
Forge 标准库