BeaconProxyFactory
0xc302ccbc357a39a7231a681c61943b2dc032dd51
Verification
Verified
v0.8.16+commit.07a7930e
Type
Contract
3,220 bytes
ABI entries
7
5 read · 2 write
License
none
Contract information
- Address
- 0xc302ccbc357a39a7231a681c61943b2dc032dd51
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.16+commit.07a7930e
- Optimization
- Enabled
- Creator
- 0xE83b11Faa5…C6805dFb9a
- Creation tx
- 0x05317cd173…dbb1f56b12
Token
Not a token
This contract does not expose ERC-20 metadata.
Read contract (5)
beacon() → address
calculateExpectedAddress(bytes32) → address
calculateExpectedAddress(address, bytes32) → address
cloneableProxyHash() → bytes32
getSalt(address, bytes32) → bytes32
ABI
[
{
"inputs": [],
"name": "beacon",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "calculateExpectedAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "bytes32",
"name": "userSalt",
"type": "bytes32"
}
],
"name": "calculateExpectedAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "cloneableProxyHash",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "userSalt",
"type": "bytes32"
}
],
"name": "createProxy",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "bytes32",
"name": "userSalt",
"type": "bytes32"
}
],
"name": "getSalt",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_beacon",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: Apache-2.0
// solhint-disable-next-line compiler-version
pragma solidity >=0.6.0 <0.9.0;
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "@openzeppelin/contracts/utils/Create2.sol";
interface ProxySetter {
function beacon() external view returns (address);
}
contract ClonableBeaconProxy is BeaconProxy {
constructor() BeaconProxy(ProxySetter(msg.sender).beacon(), "") {}
}
contract BeaconProxyFactory is ProxySetter {
bytes32 public constant cloneableProxyHash = keccak256(type(ClonableBeaconProxy).creationCode);
/**
* @notice utility function used in ClonableBeaconProxy.
* @dev this method makes it possible to use ClonableBeaconProxy.creationCode without encoding constructor parameters
* @return the beacon to be used by the proxy contract.
*/
address public override beacon;
function initialize(address _beacon) external {
require(_beacon != address(0), "INVALID_BEACON");
require(beacon == address(0), "ALREADY_INIT");
beacon = _beacon;
}
function getSalt(address user, bytes32 userSalt) public pure returns (bytes32) {
return keccak256(abi.encode(user, userSalt));
}
function createProxy(bytes32 userSalt) external returns (address) {
// deployment will fail and this function will revert if contract `salt` is not unique
bytes32 salt = getSalt(msg.sender, userSalt);
address createdContract = address(new ClonableBeaconProxy{ salt: salt }());
return createdContract;
}
function calculateExpectedAddress(address user, bytes32 userSalt)
public
view
returns (address)
{
bytes32 salt = getSalt(user, userSalt);
return Create2.computeAddress(salt, cloneableProxyHash, address(this));
}
function calculateExpectedAddress(bytes32 salt) public view returns (address) {
return Create2.computeAddress(salt, cloneableProxyHash, address(this));
}
}
Chain explorer6026msChain node93ms