Deploy a smart contract to an arbitrary address
GuildAudits
Posted on December 4, 2022
This is one of the beauties of foundry framework, the ability to deploy a smart contract on any address. web3 developers gain alot from this because it aids you in experimenting with address with smart contract without having to go through hassle of getting an address deployed on the testnet or mainnet with code.
getCode
Signature
function getCode(string calldata) external returns (bytes memory);
Description
Returns the creation bytecode for a contract in the project given the path to the contract.
The calldata parameter can either be in the form ContractFile.sol (if the filename and contract name are the same),ContractFile.sol:ContractName, or the path to an artifact, relative to the root of your project.
ℹ️ Note
getCode requires read permission for the output directory, see file cheatcodes.
To grant read access set fs_permissions = [{ access = "read", path = "./out"}] in your foundry.toml.
Examples
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]
Deploy a contract to an arbitrary address by combining getCode and 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);
for more info check https://book.getfoundry.sh/cheatcodes/get-code?highlight=etch#examples
Posted on December 4, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.