Address Contract Verified
Address
0x6513Aedb4D1593BA12e50644401D976aebDc90d8
Balance
0 ETH
Nonce
112
Code Size
3164 bytes
Creator
0x98B2920D...919e at tx 0xb8c81da6...1a7982
Indexed Transactions
0
Contract Bytecode
3164 bytes
0x6080604052600436106100345760003560e01c80634af63f0214610039578063c2b1041c14610075578063cf4d643214610095575b600080fd5b61004c6100473660046108b7565b6100a8565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b34801561008157600080fd5b5061004c6100903660046108fc565b61018c565b61004c6100a336600461096f565b6101e5565b6040805133602082015290810182905260009081906060016040516020818303038152906040528051906020012090506100e28482610372565b9150341561010a5761010a73ffffffffffffffffffffffffffffffffffffffff83163461048b565b61011484826104d5565b9150823373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd579261046780ec80c4dae1bc57abdb62c58df8af1531e63b4e8bcc08bcf46ec878051906020012060405161017d91815260200190565b60405180910390a45092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602082015290810182905260009081906060016040516020818303038152906040528051906020012090506101dc8582610372565b95945050505050565b60408051336020820152908101849052600090819060600160405160208183030381529060405280519060200120905061021f8682610372565b915034156102475761024773ffffffffffffffffffffffffffffffffffffffff83163461048b565b61025186826104d5565b9150843373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd579261046780ec80c4dae1bc57abdb62c58df8af1531e63b4e8bcc08bcf46ec89805190602001206040516102ba91815260200190565b60405180910390a460008273ffffffffffffffffffffffffffffffffffffffff1685856040516102eb929190610a0a565b6000604051808303816000865af19150503d8060008114610328576040519150601f19603f3d011682016040523d82523d6000602084013e61032d565b606091505b5050905080610368576040517f139c636700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050949350505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000030606090811b82166021850152603584018690527ff9bf726c56f6eb7a6a041cc888f1adb1231fafec3ca5392bf47fa10cf8df67fd605580860191909152855180860390910181526075850186528051908401207fd6940000000000000000000000000000000000000000000000000000000000006095860152901b1660978301527f010000000000000000000000000000000000000000000000000000000000000060ab8301528251808303608c01815260ac90920190925280519101206000905b9392505050565b600080600080600085875af19050806104d0576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006104848383604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000030606090811b82166021850152603584018690527ff9bf726c56f6eb7a6a041cc888f1adb1231fafec3ca5392bf47fa10cf8df67fd605580860191909152855180860390910181526075850186528051908401207fd6940000000000000000000000000000000000000000000000000000000000006095860152901b1660978301527f010000000000000000000000000000000000000000000000000000000000000060ab8301528251808303608c01815260ac90920190925280519101208251600003610625576040517f21744a5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106448173ffffffffffffffffffffffffffffffffffffffff16610783565b1561067b576040517fa6ef0ba100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260405161068a906107d0565b8190604051809103906000f59050801580156106aa573d6000803e3d6000fd5b50905073ffffffffffffffffffffffffffffffffffffffff81166106fa576040517fb4f5411100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517e77436000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690627743609061074a908790600401610a1a565b600060405180830381600087803b15801561076457600080fd5b505af1158015610778573d6000803e3d6000fd5b505050505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82163f801580159061048457507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b6101a080610a8783390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261081d57600080fd5b813567ffffffffffffffff80821115610838576108386107dd565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561087e5761087e6107dd565b8160405283815286602085880101111561089757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156108ca57600080fd5b823567ffffffffffffffff8111156108e157600080fd5b6108ed8582860161080c565b95602094909401359450505050565b60008060006060848603121561091157600080fd5b833567ffffffffffffffff81111561092857600080fd5b6109348682870161080c565b935050602084013573ffffffffffffffffffffffffffffffffffffffff8116811461095e57600080fd5b929592945050506040919091013590565b6000806000806060858703121561098557600080fd5b843567ffffffffffffffff8082111561099d57600080fd5b6109a98883890161080c565b95506020870135945060408701359150808211156109c657600080fd5b818701915087601f8301126109da57600080fd5b8135818111156109e957600080fd5b8860208285010111156109fb57600080fd5b95989497505060200194505050565b8183823760009101908152919050565b600060208083528351808285015260005b81811015610a4757858101830151858201604001528201610a2b565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509291505056fe608060405234801561001057600080fd5b50610180806100206000396000f3fe60806040526004361061001d5760003560e01c806277436014610022575b600080fd5b61003561003036600461007b565b610037565b005b8051602082016000f061004957600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561008d57600080fd5b813567ffffffffffffffff808211156100a557600080fd5b818401915084601f8301126100b957600080fd5b8135818111156100cb576100cb61004c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101115761011161004c565b8160405282815287602084870101111561012a57600080fd5b82602086016020830137600092810160200192909252509594505050505056fea2646970667358221220a30aa0b079a504f6336b7e339659f909f468dcfe513766d3086e1efce2657d5164736f6c63430008130033a26469706673582212203a8a2818751a76f13bac296ad23080c23254ec57b82f46e2953af00c5cc5ecb464736f6c63430008130033
Verified Source Code Full Match
Compiler: v0.8.19+commit.7dd6d404
EVM: london
Optimization: Yes (1000000 runs)
Create3.sol 41 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IDeploy } from '../interfaces/IDeploy.sol';
import { ContractAddress } from '../libs/ContractAddress.sol';
import { CreateDeploy } from './CreateDeploy.sol';
import { Create3Address } from './Create3Address.sol';
/**
* @title Create3 contract
* @notice This contract can be used to deploy a contract with a deterministic address that depends only on
* the deployer address and deployment salt, not the contract bytecode and constructor parameters.
*/
contract Create3 is Create3Address, IDeploy {
using ContractAddress for address;
/**
* @notice Deploys a new contract using the `CREATE3` method.
* @dev This function first deploys the CreateDeploy contract using
* the `CREATE2` opcode and then utilizes the CreateDeploy to deploy the
* new contract with the `CREATE` opcode.
* @param bytecode The bytecode of the contract to be deployed
* @param deploySalt A salt to influence the contract address
* @return deployed The address of the deployed contract
*/
function _create3(bytes memory bytecode, bytes32 deploySalt) internal returns (address deployed) {
deployed = _create3Address(deploySalt);
if (bytecode.length == 0) revert EmptyBytecode();
if (deployed.isContract()) revert AlreadyDeployed();
// Deploy using create2
CreateDeploy create = new CreateDeploy{ salt: deploySalt }();
if (address(create) == address(0)) revert DeployFailed();
// Deploy using create
create.deploy(bytecode);
}
}
Deployer.sol 110 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IDeployer } from '../interfaces/IDeployer.sol';
import { SafeNativeTransfer } from '../libs/SafeNativeTransfer.sol';
/**
* @title Deployer Contract
* @notice This contract is responsible for deploying and initializing new contracts using
* a deployment method, such as `CREATE2` or `CREATE3`.
*/
abstract contract Deployer is IDeployer {
using SafeNativeTransfer for address;
/**
* @notice Deploys a contract using a deployment method defined by derived contracts.
* @dev The address where the contract will be deployed can be known in
* advance via {deployedAddress}.
*
* The bytecode for a contract can be obtained from Solidity with
* `type(contractName).creationCode`.
*
* Requirements:
*
* - `bytecode` must not be empty.
* - `salt` must have not been used for `bytecode` already by the same `msg.sender`.
*
* @param bytecode The bytecode of the contract to be deployed
* @param salt A salt to influence the contract address
* @return deployedAddress_ The address of the deployed contract
*/
// slither-disable-next-line locked-ether
function deploy(bytes memory bytecode, bytes32 salt) external payable returns (address deployedAddress_) {
bytes32 deploySalt = keccak256(abi.encode(msg.sender, salt));
deployedAddress_ = _deployedAddress(bytecode, deploySalt);
if (msg.value > 0) {
// slither-disable-next-line unused-return
deployedAddress_.safeNativeTransfer(msg.value);
}
deployedAddress_ = _deploy(bytecode, deploySalt);
emit Deployed(deployedAddress_, msg.sender, salt, keccak256(bytecode));
}
/**
* @notice Deploys a contract using a deployment method defined by derived contracts and initializes it.
* @dev The address where the contract will be deployed can be known in advance
* via {deployedAddress}.
*
* The bytecode for a contract can be obtained from Solidity with
* `type(contractName).creationCode`.
*
* Requirements:
*
* - `bytecode` must not be empty.
* - `salt` must have not been used for `bytecode` already by the same `msg.sender`.
* - `init` is used to initialize the deployed contract as an option to not have the
* constructor args affect the address derived by `CREATE2`.
*
* @param bytecode The bytecode of the contract to be deployed
* @param salt A salt to influence the contract address
* @param init Init data used to initialize the deployed contract
* @return deployedAddress_ The address of the deployed contract
*/
// slither-disable-next-line locked-ether
function deployAndInit(
bytes memory bytecode,
bytes32 salt,
bytes calldata init
) external payable returns (address deployedAddress_) {
bytes32 deploySalt = keccak256(abi.encode(msg.sender, salt));
deployedAddress_ = _deployedAddress(bytecode, deploySalt);
if (msg.value > 0) {
// slither-disable-next-line unused-return
deployedAddress_.safeNativeTransfer(msg.value);
}
deployedAddress_ = _deploy(bytecode, deploySalt);
emit Deployed(deployedAddress_, msg.sender, salt, keccak256(bytecode));
(bool success, ) = deployedAddress_.call(init);
if (!success) revert DeployInitFailed();
}
/**
* @notice Returns the address where a contract will be stored if deployed via {deploy} or {deployAndInit} by `sender`.
* @dev Any change in the `bytecode` (except for `CREATE3`), `sender`, or `salt` will result in a new deployed address.
* @param bytecode The bytecode of the contract to be deployed
* @param sender The address that will deploy the contract via the deployment method
* @param salt The salt that will be used to influence the contract address
* @return deployedAddress_ The address that the contract will be deployed to
*/
function deployedAddress(
bytes memory bytecode,
address sender,
bytes32 salt
) public view returns (address) {
bytes32 deploySalt = keccak256(abi.encode(sender, salt));
return _deployedAddress(bytecode, deploySalt);
}
function _deploy(bytes memory bytecode, bytes32 deploySalt) internal virtual returns (address);
function _deployedAddress(bytes memory bytecode, bytes32 deploySalt) internal view virtual returns (address);
}
IDeploy.sol 13 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title IDeploy Interface
* @notice This interface defines the errors for a contract that is responsible for deploying new contracts.
*/
interface IDeploy {
error EmptyBytecode();
error AlreadyDeployed();
error DeployFailed();
}
CreateDeploy.sol 23 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title CreateDeploy Contract
* @notice This contract deploys new contracts using the `CREATE` opcode and is used as part of
* the `CREATE3` deployment method.
*/
contract CreateDeploy {
/**
* @dev Deploys a new contract with the specified bytecode using the `CREATE` opcode.
* @param bytecode The bytecode of the contract to be deployed
*/
// slither-disable-next-line locked-ether
function deploy(bytes memory bytecode) external payable {
assembly {
if iszero(create(0, add(bytecode, 32), mload(bytecode))) {
revert(0, 0)
}
}
}
}
IDeployer.sol 50 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IDeploy } from './IDeploy.sol';
/**
* @title IDeployer Interface
* @notice This interface defines the contract responsible for deploying and optionally initializing new contracts
* via a specified deployment method.
*/
interface IDeployer is IDeploy {
error DeployInitFailed();
event Deployed(address indexed deployedAddress, address indexed sender, bytes32 indexed salt, bytes32 bytecodeHash);
/**
* @notice Deploys a contract using a deployment method defined by derived contracts.
* @param bytecode The bytecode of the contract to be deployed
* @param salt A salt to influence the contract address
* @return deployedAddress_ The address of the deployed contract
*/
function deploy(bytes memory bytecode, bytes32 salt) external payable returns (address deployedAddress_);
/**
* @notice Deploys a contract using a deployment method defined by derived contracts and initializes it.
* @param bytecode The bytecode of the contract to be deployed
* @param salt A salt to influence the contract address
* @param init Init data used to initialize the deployed contract
* @return deployedAddress_ The address of the deployed contract
*/
function deployAndInit(
bytes memory bytecode,
bytes32 salt,
bytes calldata init
) external payable returns (address deployedAddress_);
/**
* @notice Returns the address where a contract will be stored if deployed via {deploy} or {deployAndInit} by `sender`.
* @param bytecode The bytecode of the contract
* @param sender The address that will deploy the contract
* @param salt The salt that will be used to influence the contract address
* @return deployedAddress_ The address that the contract will be deployed to
*/
function deployedAddress(
bytes calldata bytecode,
address sender,
bytes32 salt
) external view returns (address deployedAddress_);
}
ContractAddress.sol 15 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library ContractAddress {
function isContract(address contractAddress) internal view returns (bool) {
bytes32 existingCodeHash = contractAddress.codehash;
// https://eips.ethereum.org/EIPS/eip-1052
// keccak256('') == 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
return
existingCodeHash != bytes32(0) &&
existingCodeHash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
}
}
Create3Address.sol 31 lines
// SPDX-License-Identifier: MIT
import { CreateDeploy } from './CreateDeploy.sol';
pragma solidity ^0.8.0;
/**
* @title Create3Address contract
* @notice This contract can be used to predict the deterministic deployment address of a contract deployed with the `CREATE3` technique.
*/
contract Create3Address {
/// @dev bytecode hash of the CreateDeploy helper contract
bytes32 internal immutable createDeployBytecodeHash;
constructor() {
createDeployBytecodeHash = keccak256(type(CreateDeploy).creationCode);
}
/**
* @notice Compute the deployed address that will result from the `CREATE3` method.
* @param deploySalt A salt to influence the contract address
* @return deployed The deterministic contract address if it was deployed
*/
function _create3Address(bytes32 deploySalt) internal view returns (address deployed) {
address deployer = address(
uint160(uint256(keccak256(abi.encodePacked(hex'ff', address(this), deploySalt, createDeployBytecodeHash))))
);
deployed = address(uint160(uint256(keccak256(abi.encodePacked(hex'd6_94', deployer, hex'01')))));
}
}
Create3Deployer.sol 24 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { Deployer } from './Deployer.sol';
import { Create3 } from './Create3.sol';
/**
* @title Create3Deployer Contract
* @notice This contract is responsible for deploying and initializing new contracts using the `CREATE3` method
* which computes the deployed contract address based on the deployer address and deployment salt.
*/
contract Create3Deployer is Create3, Deployer {
function _deploy(bytes memory bytecode, bytes32 deploySalt) internal override returns (address) {
return _create3(bytecode, deploySalt);
}
function _deployedAddress(
bytes memory, /* bytecode */
bytes32 deploySalt
) internal view override returns (address) {
return _create3Address(deploySalt);
}
}
SafeNativeTransfer.sol 27 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
error NativeTransferFailed();
/*
* @title SafeNativeTransfer
* @dev This library is used for performing safe native value transfers in Solidity by utilizing inline assembly.
*/
library SafeNativeTransfer {
/*
* @notice Perform a native transfer to a given address.
* @param receiver The recipient address to which the amount will be sent.
* @param amount The amount of native value to send.
* @throws NativeTransferFailed error if transfer is not successful.
*/
function safeNativeTransfer(address receiver, uint256 amount) internal {
bool success;
assembly {
success := call(gas(), receiver, amount, 0, 0, 0, 0)
}
if (!success) revert NativeTransferFailed();
}
}
Read Contract
deployedAddress 0xc2b1041c → address
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
deploy 0x4af63f02
bytes bytecode
bytes32 salt
returns: address
deployAndInit 0xcf4d6432
bytes bytecode
bytes32 salt
bytes init
returns: address
Recent Transactions
No transactions found for this address