Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- DeployFactory
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2025-09-03T14:05:17.004497Z
Constructor Arguments
0x00000000000000000000000021ad6ef3979638d8e73747f22b92c4aade145d8200000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000009c4
Arg [0] (address) : 0x21ad6ef3979638d8e73747f22b92c4aade145d82
Arg [1] (uint256) : 1600000000000000000
Arg [2] (uint256) : 2500
Contract source code
// SPDX-License-Identifier: MIT
// File: contracts/BasicContract.sol
pragma solidity ^0.8.20;
contract BasicContract {
address public owner;
constructor(address _owner) {
owner = _owner;
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/DeployFactory.sol
pragma solidity ^0.8.20;
contract DeployFactory is Ownable {
address public treasury;
uint256 public fee;
uint256 public referralFees;
uint256 public constant BASIS_POINTS = 10000;
struct DeploymentInfo {
address contractAddress;
uint256 deployedAt;
}
uint256 public totalDeployments;
mapping(address => DeploymentInfo[]) private userDeployments;
error InsufficientETH();
error ReferralTransferFailed();
error FeeTransferFailed();
error SelfReferral();
event ContractDeployed(address contractAddress, address owner);
constructor(address _treasury, uint256 _fee, uint256 _referralFees)
Ownable(msg.sender)
{
treasury = _treasury;
fee = _fee;
referralFees = _referralFees;
}
function deploy(address referral) external payable {
if (msg.value < fee) {
revert InsufficientETH();
}
if (referral == msg.sender) {
revert SelfReferral();
}
BasicContract newContract = new BasicContract(msg.sender);
DeploymentInfo memory info = DeploymentInfo({
contractAddress: address(newContract),
deployedAt: block.timestamp
});
userDeployments[msg.sender].push(info);
totalDeployments++;
uint256 referralAmount = 0;
if (referral != address(0)) {
referralAmount = (msg.value * referralFees) / BASIS_POINTS;
(bool refSuccess, ) = referral.call{value: referralAmount}("");
if (!refSuccess) {
revert ReferralTransferFailed();
}
}
uint256 remaining = msg.value - referralAmount;
(bool success, ) = treasury.call{value: remaining}("");
if (!success) {
revert FeeTransferFailed();
}
emit ContractDeployed(address(newContract), msg.sender);
}
/**
* @dev Returns all deployment information for a specific user
* @param user The address of the user whose deployments to fetch
* @return DeploymentInfo[] Array of deployment information
*/
function getUserDeployments(
address user
) external view returns (DeploymentInfo[] memory) {
return userDeployments[user];
}
/**
* @dev Returns the timestamp of the user's latest deployment or 0 if none exists
* @param user The address of the user
* @return uint256 Timestamp of the last deployment
*/
function getLastDeploymentTime(
address user
) external view returns (uint256) {
DeploymentInfo[] memory userDeploys = userDeployments[user];
if (userDeploys.length == 0) {
return 0;
}
return userDeploys[userDeploys.length - 1].deployedAt;
}
function setTreasury(address _treasury) external onlyOwner {
require(_treasury != address(0), "Invalid treasury address");
treasury = _treasury;
}
function setFee(uint256 _fee) external onlyOwner {
require(_fee > 0, "Invalid fee");
fee = _fee;
}
function setReferralFees(uint256 _referralFees) external onlyOwner {
require(_referralFees < BASIS_POINTS, "Invalid referral fees");
referralFees = _referralFees;
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_treasury","internalType":"address"},{"type":"uint256","name":"_fee","internalType":"uint256"},{"type":"uint256","name":"_referralFees","internalType":"uint256"}]},{"type":"error","name":"FeeTransferFailed","inputs":[]},{"type":"error","name":"InsufficientETH","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"ReferralTransferFailed","inputs":[]},{"type":"error","name":"SelfReferral","inputs":[]},{"type":"event","name":"ContractDeployed","inputs":[{"type":"address","name":"contractAddress","internalType":"address","indexed":false},{"type":"address","name":"owner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BASIS_POINTS","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deploy","inputs":[{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLastDeploymentTime","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct DeployFactory.DeploymentInfo[]","components":[{"type":"address","name":"contractAddress","internalType":"address"},{"type":"uint256","name":"deployedAt","internalType":"uint256"}]}],"name":"getUserDeployments","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"referralFees","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFee","inputs":[{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReferralFees","inputs":[{"type":"uint256","name":"_referralFees","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTreasury","inputs":[{"type":"address","name":"_treasury","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDeployments","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50604051610c1c380380610c1c83398101604081905261002f916100db565b338061005557604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61005e8161008b565b50600180546001600160a01b0319166001600160a01b03949094169390931790925560025560035561011e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000606084860312156100f057600080fd5b83516001600160a01b038116811461010757600080fd5b602085015160409095015190969495509392505050565b610aef8061012d6000396000f3fe6080604052600436106100dd5760003560e01c8063926305461161007f578063efdf07d511610059578063efdf07d51461022e578063f0f4426014610244578063f2fde38b14610264578063fb35b4e41461028457600080fd5b806392630546146101e2578063ddca3f4314610202578063e1f1c4a71461021857600080fd5b8063630bdfac116100bb578063630bdfac1461016257806369fe0e2d1461018f578063715018a6146101af5780638da5cb5b146101c457600080fd5b80634c371855146100e25780634c96a3891461011557806361d027b31461012a575b600080fd5b3480156100ee57600080fd5b506101026100fd36600461085e565b61029a565b6040519081526020015b60405180910390f35b61012861012336600461085e565b610360565b005b34801561013657600080fd5b5060015461014a906001600160a01b031681565b6040516001600160a01b03909116815260200161010c565b34801561016e57600080fd5b5061018261017d36600461085e565b6105d1565b60405161010c919061088e565b34801561019b57600080fd5b506101286101aa3660046108e6565b61065c565b3480156101bb57600080fd5b506101286106ac565b3480156101d057600080fd5b506000546001600160a01b031661014a565b3480156101ee57600080fd5b506101286101fd3660046108e6565b6106c0565b34801561020e57600080fd5b5061010260025481565b34801561022457600080fd5b5061010261271081565b34801561023a57600080fd5b5061010260035481565b34801561025057600080fd5b5061012861025f36600461085e565b610716565b34801561027057600080fd5b5061012861027f36600461085e565b610796565b34801561029057600080fd5b5061010260045481565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493849084015b82821015610315576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016102cd565b505050509050805160000361032d5750600092915050565b806001825161033c9190610915565b8151811061034c5761034c61092e565b602002602001015160200151915050919050565b60025434101561038357604051631a84bc4160e21b815260040160405180910390fd5b336001600160a01b038216036103ac57604051632af47b8760e11b815260040160405180910390fd5b6000336040516103bb90610851565b6001600160a01b039091168152602001604051809103906000f0801580156103e7573d6000803e3d6000fd5b506040805180820182526001600160a01b03838116825242602080840191825233600090815260058252948520805460018082018355918752918620855160029093020180546001600160a01b0319169290941691909117835590519101556004805493945090929161045983610944565b90915550600090506001600160a01b038416156105035761271060035434610481919061095d565b61048b9190610974565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146104da576040519150601f19603f3d011682016040523d82523d6000602084013e6104df565b606091505b5050905080610501576040516387df070960e01b815260040160405180910390fd5b505b600061050f8234610915565b6001546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114610561576040519150601f19603f3d011682016040523d82523d6000602084013e610566565b606091505b505090508061058857604051634033e4e360e01b815260040160405180910390fd5b604080516001600160a01b03871681523360208201527f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688910160405180910390a1505050505050565b6001600160a01b0381166000908152600560209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610651576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610609565b505050509050919050565b6106646107d4565b600081116106a75760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b60448201526064015b60405180910390fd5b600255565b6106b46107d4565b6106be6000610801565b565b6106c86107d4565b61271081106107115760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420726566657272616c206665657360581b604482015260640161069e565b600355565b61071e6107d4565b6001600160a01b0381166107745760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420747265617375727920616464726573730000000000000000604482015260640161069e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b61079e6107d4565b6001600160a01b0381166107c857604051631e4fbdf760e01b81526000600482015260240161069e565b6107d181610801565b50565b6000546001600160a01b031633146106be5760405163118cdaa760e01b815233600482015260240161069e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6101238061099783390190565b60006020828403121561087057600080fd5b81356001600160a01b038116811461088757600080fd5b9392505050565b602080825282518282018190526000919060409081850190868401855b828110156108d957815180516001600160a01b031685528601518685015292840192908501906001016108ab565b5091979650505050505050565b6000602082840312156108f857600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610928576109286108ff565b92915050565b634e487b7160e01b600052603260045260246000fd5b600060018201610956576109566108ff565b5060010190565b8082028115828204841417610928576109286108ff565b60008261099157634e487b7160e01b600052601260045260246000fd5b50049056fe608060405234801561001057600080fd5b5060405161012338038061012383398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6091806100926000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80638da5cb5b14602d575b600080fd5b600054603f906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f3fea2646970667358221220e63ef1a5b696460efae09591ae5fcc41de96444889fe861fb3b35d3341f9451164736f6c63430008140033a2646970667358221220af12bc699c5d6c55faf2a144146e0f52a90f4ca4ad29367b7f4dce251985175364736f6c6343000814003300000000000000000000000021ad6ef3979638d8e73747f22b92c4aade145d8200000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000009c4
Deployed ByteCode
0x6080604052600436106100dd5760003560e01c8063926305461161007f578063efdf07d511610059578063efdf07d51461022e578063f0f4426014610244578063f2fde38b14610264578063fb35b4e41461028457600080fd5b806392630546146101e2578063ddca3f4314610202578063e1f1c4a71461021857600080fd5b8063630bdfac116100bb578063630bdfac1461016257806369fe0e2d1461018f578063715018a6146101af5780638da5cb5b146101c457600080fd5b80634c371855146100e25780634c96a3891461011557806361d027b31461012a575b600080fd5b3480156100ee57600080fd5b506101026100fd36600461085e565b61029a565b6040519081526020015b60405180910390f35b61012861012336600461085e565b610360565b005b34801561013657600080fd5b5060015461014a906001600160a01b031681565b6040516001600160a01b03909116815260200161010c565b34801561016e57600080fd5b5061018261017d36600461085e565b6105d1565b60405161010c919061088e565b34801561019b57600080fd5b506101286101aa3660046108e6565b61065c565b3480156101bb57600080fd5b506101286106ac565b3480156101d057600080fd5b506000546001600160a01b031661014a565b3480156101ee57600080fd5b506101286101fd3660046108e6565b6106c0565b34801561020e57600080fd5b5061010260025481565b34801561022457600080fd5b5061010261271081565b34801561023a57600080fd5b5061010260035481565b34801561025057600080fd5b5061012861025f36600461085e565b610716565b34801561027057600080fd5b5061012861027f36600461085e565b610796565b34801561029057600080fd5b5061010260045481565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493849084015b82821015610315576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016102cd565b505050509050805160000361032d5750600092915050565b806001825161033c9190610915565b8151811061034c5761034c61092e565b602002602001015160200151915050919050565b60025434101561038357604051631a84bc4160e21b815260040160405180910390fd5b336001600160a01b038216036103ac57604051632af47b8760e11b815260040160405180910390fd5b6000336040516103bb90610851565b6001600160a01b039091168152602001604051809103906000f0801580156103e7573d6000803e3d6000fd5b506040805180820182526001600160a01b03838116825242602080840191825233600090815260058252948520805460018082018355918752918620855160029093020180546001600160a01b0319169290941691909117835590519101556004805493945090929161045983610944565b90915550600090506001600160a01b038416156105035761271060035434610481919061095d565b61048b9190610974565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146104da576040519150601f19603f3d011682016040523d82523d6000602084013e6104df565b606091505b5050905080610501576040516387df070960e01b815260040160405180910390fd5b505b600061050f8234610915565b6001546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114610561576040519150601f19603f3d011682016040523d82523d6000602084013e610566565b606091505b505090508061058857604051634033e4e360e01b815260040160405180910390fd5b604080516001600160a01b03871681523360208201527f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688910160405180910390a1505050505050565b6001600160a01b0381166000908152600560209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610651576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610609565b505050509050919050565b6106646107d4565b600081116106a75760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b60448201526064015b60405180910390fd5b600255565b6106b46107d4565b6106be6000610801565b565b6106c86107d4565b61271081106107115760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420726566657272616c206665657360581b604482015260640161069e565b600355565b61071e6107d4565b6001600160a01b0381166107745760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420747265617375727920616464726573730000000000000000604482015260640161069e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b61079e6107d4565b6001600160a01b0381166107c857604051631e4fbdf760e01b81526000600482015260240161069e565b6107d181610801565b50565b6000546001600160a01b031633146106be5760405163118cdaa760e01b815233600482015260240161069e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6101238061099783390190565b60006020828403121561087057600080fd5b81356001600160a01b038116811461088757600080fd5b9392505050565b602080825282518282018190526000919060409081850190868401855b828110156108d957815180516001600160a01b031685528601518685015292840192908501906001016108ab565b5091979650505050505050565b6000602082840312156108f857600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610928576109286108ff565b92915050565b634e487b7160e01b600052603260045260246000fd5b600060018201610956576109566108ff565b5060010190565b8082028115828204841417610928576109286108ff565b60008261099157634e487b7160e01b600052601260045260246000fd5b50049056fe608060405234801561001057600080fd5b5060405161012338038061012383398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6091806100926000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80638da5cb5b14602d575b600080fd5b600054603f906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f3fea2646970667358221220e63ef1a5b696460efae09591ae5fcc41de96444889fe861fb3b35d3341f9451164736f6c63430008140033a2646970667358221220af12bc699c5d6c55faf2a144146e0f52a90f4ca4ad29367b7f4dce251985175364736f6c63430008140033