51 lines
1.7 KiB
Solidity
51 lines
1.7 KiB
Solidity
/*
|
|
|
|
Copyright 2020 DODO ZOO.
|
|
SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
pragma solidity 0.6.9;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
interface ICloneFactory {
|
|
function clone(address prototype) external returns (address proxy);
|
|
function clone2(address prototype,bytes32 salt) external returns (address proxy);
|
|
}
|
|
|
|
// introduction of proxy mode design: https://docs.openzeppelin.com/upgrades/2.8/
|
|
// minimum implementation of transparent proxy: https://eips.ethereum.org/EIPS/eip-1167
|
|
|
|
contract CloneFactory is ICloneFactory {
|
|
function clone(address prototype) external override returns (address proxy) {
|
|
bytes20 targetBytes = bytes20(prototype);
|
|
assembly {
|
|
let clone := mload(0x40)
|
|
mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
|
|
mstore(add(clone, 0x14), targetBytes)
|
|
mstore(
|
|
add(clone, 0x28),
|
|
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
|
|
)
|
|
proxy := create(0, clone, 0x37)
|
|
}
|
|
return proxy;
|
|
}
|
|
|
|
|
|
function clone2(address prototype, bytes32 salt) external override returns (address proxy) {
|
|
bytes20 targetBytes = bytes20(prototype);
|
|
assembly {
|
|
let clone := mload(0x40)
|
|
mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
|
|
mstore(add(clone, 0x14), targetBytes)
|
|
mstore(
|
|
add(clone, 0x28),
|
|
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
|
|
)
|
|
proxy := create2(0, clone, 0x37, salt)
|
|
}
|
|
return proxy;
|
|
}
|
|
}
|