Skip to content

Instantly share code, notes, and snippets.

@Dobrokhvalov
Last active June 7, 2019 12:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dobrokhvalov/b5f18f77269a803b9be1b71c49b522bc to your computer and use it in GitHub Desktop.
Save Dobrokhvalov/b5f18f77269a803b9be1b71c49b522bc to your computer and use it in GitHub Desktop.
/**
* @dev Internal function to deploy a proxy contract for linkdrop master
* @param _linkdropMaster Address of linkdrop master
* @return Proxy contract address
*/
function _deployProxy(address payable _linkdropMaster)
internal
returns (address payable)
{
require(!isDeployed(_linkdropMaster), "Deployed");
require(_linkdropMaster != address(0), "Invalid linkdrop master address");
bytes32 salt = keccak256(abi.encodePacked(_linkdropMaster));
bytes memory initcode = getInitcode();
address payable proxy;
// deploying proxy contract via create2 opcode
assembly {
proxy := create2(0, add(initcode, 0x20), mload(initcode), salt)
if iszero(extcodesize(proxy)) { revert(0, 0) }
}
deployed[_linkdropMaster] = proxy;
// Initialize owner address, linkdrop master address and master copy version in proxy contract
require
(
ILinkdropCommon(proxy).initialize
(
address(this), // Owner address
_linkdropMaster, // Linkdrop master address
masterCopyVersion,
chainId
),
"Failed to initialize"
);
emit Deployed(_linkdropMaster, proxy, salt, now);
return proxy;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment