In my project I'm using an EIP-1167-enabled Clone Factory:
function createClone(address target) external returns (address result) {
bytes20 targetBytes = bytes20(target);
assembly {
let clone := mload(0x40)
mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(clone, 0x14), targetBytes)
mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
result := create(0, clone, 0x37)
}
addr = result;
}
It works for contracts without constructor or contracts with empty constructors.
Here is a constructor for most of my contracts:
constructor(
bytes32 pRegistryGroupName,
bytes32 pRegistryName
)
internal
{
m_RegistrableData.registryGroupName = pRegistryGroupName;
m_RegistrableData.registryName = pRegistryName;
}
When I clone my contract, as expected, the new one doesn't contain group name nor name.
I would like to have it like:
function createClone(address target, bytes32 groupName, bytes32 name)
How can I do that?
Also I'm curious what are these addresses and what they represent, why they look like that:
- 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
- 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000