有一个来自另一个作者的未回答的问题存在着同样的问题,我正在创建一个更详细的,希望两者都能被关闭。
根据这个职位的想法,我有一份坚实的合同。从根本上说,是工厂合同允许货运代理合同的部署。为了将天然气成本降到最低,在创建一个转发器之后,您可以创建一个它的克隆体。
我希望计算将使用create2生成的地址,该地址与createForwarder函数工作得很好:
ForwarderFactory.sol
function createForwarder(address forwardAddress, uint256 salt)
public
onlyOwner
returns (Forwarder forwarder)
{
bytes memory bytecode =
abi.encodePacked(
type(Forwarder).creationCode,
uint256(uint160(address(forwardAddress)))
);
assembly {
forwarder := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
}
emit Deployed(address(forwarder), salt);
}CalculateAddress.js
let bytecode = `${forwarderBytecode}${encodeParam(
"address",
forwardAddress
).slice(2)}`;
function buildCreate2Address(creatorAddress, saltHex, byteCode) {
return `0x${web3.utils
.sha3(
`0x${["ff", creatorAddress, saltHex, web3.utils.sha3(byteCode)]
.map((x) => x.replace(/0x/, ""))
.join("")}`
)
.slice(-40)}`.toLowerCase();
}效果很好。但是,当生成新的克隆地址时,以前的buildCreate2Address函数不再工作,因为create2函数中的第二个和第三个参数是不同的。
ForwarderFactory.sol
function generateCloneAddress(address target, uint256 salt)
private
returns (address cloneAddress)
{
bytes20 targetBytes = bytes20(target);
assembly {
let clone := mload(0x40)
mstore(
clone,
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
)
mstore(add(clone, 0x14), targetBytes)
mstore(
add(clone, 0x28),
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
)
cloneAddress := create2(0, clone, 0x37, salt)
}
}我不太确定是字节码正在改变,还是需要更新的是buildCreate2Address。
发布于 2021-06-03 21:31:01
事实证明,克隆是使用标准的EIP 1167创建的,因此它具有与原始转发器不同的创建字节码。因此,要计算克隆的确定性地址,可以修改buildCreate2Address函数的字节码参数,也可以在契约中实现以下函数:
function predictCloneAddress(address forwarderAddress_, uint256 salt_)
public
view
returns (address)
{
address predictedAddress =
Clones.predictDeterministicAddress(
forwarderAddress_,
bytes32(salt_)
);
return predictedAddress;
}https://ethereum.stackexchange.com/questions/100025
复制相似问题