This nametag was submitted by Kleros Scout.
Latest 25 from a total of 52,409 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Mint Batch Witho... | 25422743 | 367 days ago | IN | 0.002331 ETH | 0.00000722 | ||||
| Mint Batch Witho... | 25409976 | 367 days ago | IN | 0.002331 ETH | 0.00000323 | ||||
| Mint Batch Witho... | 25394848 | 368 days ago | IN | 0.001554 ETH | 0.00000364 | ||||
| Mint Batch Witho... | 25375015 | 368 days ago | IN | 0.000777 ETH | 0.00000155 | ||||
| Mint Batch Witho... | 25322391 | 370 days ago | IN | 0.002331 ETH | 0.00000237 | ||||
| Mint Batch Witho... | 25307697 | 370 days ago | IN | 0.000777 ETH | 0.00000334 | ||||
| Mint Batch Witho... | 25290697 | 370 days ago | IN | 0.002331 ETH | 0.00000774 | ||||
| Mint Batch Witho... | 25261987 | 371 days ago | IN | 0.001554 ETH | 0.00001103 | ||||
| Mint Batch Witho... | 25153315 | 373 days ago | IN | 0.002331 ETH | 0.00000237 | ||||
| Mint Batch Witho... | 25150069 | 374 days ago | IN | 0.002331 ETH | 0.00000218 | ||||
| Mint Batch Witho... | 25082097 | 375 days ago | IN | 0.001554 ETH | 0.00004494 | ||||
| Mint Batch Witho... | 25031035 | 376 days ago | IN | 0.000777 ETH | 0.00000272 | ||||
| Mint Batch Witho... | 24952922 | 378 days ago | IN | 0.002331 ETH | 0.00000754 | ||||
| Mint Batch Witho... | 24945025 | 378 days ago | IN | 0.002553 ETH | 0.00002215 | ||||
| Mint Batch Witho... | 24879866 | 380 days ago | IN | 0.002331 ETH | 0.00000674 | ||||
| Mint Batch Witho... | 24872543 | 380 days ago | IN | 0.001554 ETH | 0.00001869 | ||||
| Mint Batch Witho... | 24871676 | 380 days ago | IN | 0.002331 ETH | 0.00001744 | ||||
| Mint Batch Witho... | 24862384 | 380 days ago | IN | 0.001554 ETH | 0.00000965 | ||||
| Mint Batch Witho... | 24827702 | 381 days ago | IN | 0.001554 ETH | 0.00000889 | ||||
| Mint Batch Witho... | 24827568 | 381 days ago | IN | 0.002331 ETH | 0.00001326 | ||||
| Mint Batch Witho... | 24797112 | 382 days ago | IN | 0.002331 ETH | 0.00000559 | ||||
| Mint Batch Witho... | 24769937 | 382 days ago | IN | 0.002331 ETH | 0.00000817 | ||||
| Mint Batch Witho... | 24708795 | 384 days ago | IN | 0.000111 ETH | 0.00000696 | ||||
| Mint Batch Witho... | 24706647 | 384 days ago | IN | 0.000111 ETH | 0.00001066 | ||||
| Mint Batch Witho... | 24701360 | 384 days ago | IN | 0.000111 ETH | 0.00000609 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 25422743 | 367 days ago | 0.002331 ETH | ||||
| 25422743 | 367 days ago | Contract Creation | 0 ETH | |||
| 25409976 | 367 days ago | 0.002331 ETH | ||||
| 25409976 | 367 days ago | Contract Creation | 0 ETH | |||
| 25394848 | 368 days ago | 0.001554 ETH | ||||
| 25394848 | 368 days ago | Contract Creation | 0 ETH | |||
| 25375015 | 368 days ago | 0.000777 ETH | ||||
| 25375015 | 368 days ago | Contract Creation | 0 ETH | |||
| 25322391 | 370 days ago | 0.002331 ETH | ||||
| 25322391 | 370 days ago | Contract Creation | 0 ETH | |||
| 25307697 | 370 days ago | 0.000777 ETH | ||||
| 25307697 | 370 days ago | Contract Creation | 0 ETH | |||
| 25290697 | 370 days ago | 0.002331 ETH | ||||
| 25290697 | 370 days ago | Contract Creation | 0 ETH | |||
| 25261987 | 371 days ago | 0.001554 ETH | ||||
| 25261987 | 371 days ago | Contract Creation | 0 ETH | |||
| 25153315 | 373 days ago | 0.002331 ETH | ||||
| 25150069 | 374 days ago | 0.002331 ETH | ||||
| 25082097 | 375 days ago | 0.001554 ETH | ||||
| 25082097 | 375 days ago | Contract Creation | 0 ETH | |||
| 25031035 | 376 days ago | 0.000777 ETH | ||||
| 24952922 | 378 days ago | 0.002331 ETH | ||||
| 24952922 | 378 days ago | Contract Creation | 0 ETH | |||
| 24945025 | 378 days ago | 0.002553 ETH | ||||
| 24879866 | 380 days ago | 0.002331 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ZoraUniversalMinter
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 50000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import {IZoraUniversalMinter} from "./IZoraUniversalMinter.sol";
import {IMinterAgent} from "./IMinterAgent.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
/*
░░░░░░░░░░░░░░
░░▒▒░░░░░░░░░░░░░░░░░░░░
░░▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░
░░▒▒▒▒░░░░░░░░░░░░░░ ░░░░░░░░
░▓▓▒▒▒▒░░░░░░░░░░░░ ░░░░░░░
░▓▓▓▒▒▒▒░░░░░░░░░░░░ ░░░░░░░░
░▓▓▓▒▒▒▒░░░░░░░░░░░░░░ ░░░░░░░░░░
░▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░
░▓▓▓▓▓▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░
░▓▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░
░░▓▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░
░░▓▓▓▓▓▓▒▒▒▒▒▒▒▒░░░░░░░░░▒▒▒▒▒░░
░░▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░
░░▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░░
OURS TRULY,
*/
/// @title Zora Universal Minter.
/// @notice Mints ERC721 or ERC1155 tokens on behalf of an account on any standard ER721 or ERC1155 contract. Optionally collects fees for Zora and rewards for a finder.
/// @author @tbtstl / @oveddan
contract ZoraUniversalMinter is IZoraUniversalMinter {
/// @dev Default fee zora collects per token minted
uint256 constant ZORA_FEE_PER_TOKEN = 0.000222 ether;
/// @dev Default reward finder collects per token minted
uint256 constant FINDER_REWARD_PER_TOKEN = 0.000555 ether;
/// @dev default fee zora collects per token minted when no finder is specified
uint256 constant ZORA_FEE_PER_TOKEN_WHEN_NO_FINDER = ZORA_FEE_PER_TOKEN + FINDER_REWARD_PER_TOKEN;
/// @dev Rewards allocated to addresses that can be withdran from later
mapping(address => uint256) rewardAllocations;
/// @dev How much has been withdrawn so far by each address
mapping(address => uint256) withdrawn;
/// @dev The address of the Protocol's fee recipient
address public immutable zoraFeeRecipient;
/// @dev The address of the minter agent implementation, which is cloned for each EOA
address public immutable agentImpl;
constructor(address _minterAgentImpl, address _zoraFeeRecipient) {
zoraFeeRecipient = _zoraFeeRecipient;
agentImpl = _minterAgentImpl;
}
/// Executes mint calls on a series of target ERC721 or ERC1155 contracts, then transfers the minted tokens to the calling account.
/// Adds a mint fee to the msg.value sent to the contract.
/// Assumes that the mint function for each target follows the ERC721 or ERC1155 standard for minting - which is that
/// the a safe transfer is used to transfer tokens - and the corresponding safeTransfer callbacks on the receiving account are called AFTER minting the tokens.
/// The value sent must include all the values to send to the minting contracts and the fees + reward amount.
/// This can be determined by calling `fee`, and getting the requiredToSend parameter.
/// @param _targets Addresses of contracts to call
/// @param _calldatas Data to pass to the mint functions for each target
/// @param _values Value to send to each target - must match the value required by the target's mint function.
/// @param _tokensMinted Total number of tokens minted across all targets, used to calculate fees
/// @param _finder Optional - address of finder that will receive a portion of the fees
function mintBatch(
address[] calldata _targets,
bytes[] calldata _calldatas,
uint256[] calldata _values,
uint256 _tokensMinted,
address _finder
) external payable {
uint256 totalValue = _uncheckedSum(_values);
// calculate fees
(uint256 zoraFee, uint256 finderReward, uint256 totalWithFees) = fee(totalValue, _tokensMinted, _finder);
emit MintedBatch(_targets, _values, _tokensMinted, _finder, msg.sender, totalWithFees, zoraFee, finderReward);
// allocate the fees to the mint fee receiver and finder, which can be withdrawn against later. Validates
// that proper value has been sent.
_allocateFeesAndRewards(zoraFee, finderReward, totalWithFees, _finder);
_mintAll(msg.sender, totalValue, _targets, _calldatas, _values);
}
/// @notice Executes mint calls on a series of target ERC721 or ERC1155 contracts, then transfers the minted tokens to the calling account.
/// Does not add a mint feee
/// Assumes that the mint function for each target follows the ERC721 or ERC1155 standard for minting - which is that
/// the a safe transfer is used to transfer tokens - and the corresponding safeTransfer callbacks on the receiving account are called AFTER minting the tokens.
/// The value sent must equal the total values to send to the minting contracts.
/// @param _targets Addresses of contracts to call
/// @param _calldatas Data to pass to the mint functions for each target
/// @param _values Value to send to each target - must match the value required by the target's mint function.
function mintBatchWithoutFees(address[] calldata _targets, bytes[] calldata _calldatas, uint256[] calldata _values) external payable {
uint256 totalValue = _uncheckedSum(_values);
// make sure that enough value was sent to cover the fees + values needed to be sent to the contracts
// Cannot realistically overflow
if (totalValue != msg.value) {
revert INSUFFICIENT_VALUE(totalValue, msg.value);
}
emit MintedBatch(_targets, _values, 0, address(0), msg.sender, 0, 0, 0);
_mintAll(msg.sender, totalValue, _targets, _calldatas, _values);
}
/// Execute a mint call on a series a target ERC721 or ERC1155 contracts, then transfers the minted tokens to the calling account.
/// Adds a mint fee to the msg.value sent to the contract.
/// Assumes that the mint function for each target follows the ERC721 or ERC1155 standard for minting - which is that
/// the a safe transfer is used to transfer tokens - and the corresponding safeTransfer callbacks on the receiving account are called AFTER minting the tokens.
/// The value sent must include the value to send to the minting contract and the universal minter fee + finder reward amount.
/// This can be determined by calling `fee`, and getting the requiredToSend parameter.
/// @param _target Addresses of contract to call
/// @param _calldata Data to pass to the mint function for the target
/// @param _value Value to send to the target - must match the value required by the target's mint function.
/// @param _tokensMinted Total number of tokens minted across all targets, used to calculate fees
/// @param _finder Optional - address of finder that will receive a portion of the fees
function mint(address _target, bytes calldata _calldata, uint256 _value, uint256 _tokensMinted, address _finder) external payable {
IMinterAgent agent = _getOrCloneAgent(msg.sender);
(uint256 zoraFee, uint256 finderReward, uint256 totalWithFees) = fee(_value, _tokensMinted, _finder);
emit Minted(_target, _value, _tokensMinted, _finder, msg.sender, totalWithFees, zoraFee, finderReward);
// allocate the fees to the mint fee receiver and rewards to the finder, which can be withdrawn against later
_allocateFeesAndRewards(zoraFee, finderReward, totalWithFees, _finder);
// mint the fokens for each target contract. These will be transferred to the msg.caller.
_mint(agent, _target, _calldata, _value);
}
/// Withdraws any fees that have been allocated to the caller's address to a specified address.
/// @param to The address to withdraw to
function withdraw(address to) external {
uint256 feeAllocation = rewardAllocations[msg.sender];
uint256 withdrawnSoFar = withdrawn[msg.sender];
if (feeAllocation <= withdrawnSoFar) {
revert NOTHING_TO_WITHDRAW();
}
uint256 toWithdraw = feeAllocation - withdrawnSoFar;
withdrawn[msg.sender] = withdrawnSoFar + toWithdraw;
_safeSend(toWithdraw, to);
}
/// Calculates the fees that will be collected for a given mint, based on the value and tokens minted.
/// @param _mintValue Total value of the mint
/// @param _tokensMinted Quantity of tokens minted
/// @param _finderAddress Address of the finder, if any. If the finder is the zora fee recipient, then the finder fee is 0.
/// @return zoraFee The fee that will be allocated to the zora fee recipient
/// @return finderReward The reward that will be allcoated to the finder
/// @return requiredToSend The total value that must be sent to the contract, including fees
function fee(
uint256 _mintValue,
uint256 _tokensMinted,
address _finderAddress
) public view returns (uint256 zoraFee, uint256 finderReward, uint256 requiredToSend) {
if (_finderAddress == address(0) || _finderAddress == zoraFeeRecipient) {
unchecked {
zoraFee = ZORA_FEE_PER_TOKEN_WHEN_NO_FINDER * _tokensMinted;
requiredToSend = zoraFee + _mintValue;
}
} else {
unchecked {
zoraFee = ZORA_FEE_PER_TOKEN * _tokensMinted;
finderReward = FINDER_REWARD_PER_TOKEN * _tokensMinted;
requiredToSend = zoraFee + finderReward + _mintValue;
}
}
}
/// Has a minter agent execute a transaction on behalf of the calling acccount. The minter
/// agent's address will be the same for the calling account as the address that was
/// used to mint the tokens. Can be used to recover tokens that may get accidentally locked in
/// the minter agent's contract address.
/// @param _target Address of contract to call
/// @param _calldata Calldata for arguments to call.
function forwardCallFromAgent(address _target, bytes calldata _calldata, uint256 _additionalValue) external payable {
IMinterAgent agent = _getOrCloneAgent(msg.sender);
(bool success, bytes memory result) = agent.forwardCall{value: msg.value}(_target, _calldata, msg.value + _additionalValue);
if (!success) {
_handleForwardCallFail(result);
}
}
/// @dev Unwraps a forward call failure to return the original error. Useful
/// for debugging failed minting calls.
function _handleForwardCallFail(bytes memory result) private pure {
// source: https://yos.io/2022/07/16/bubbling-up-errors-in-solidity/#:~:text=An%20inline%20assembly%20block%20is,object%20is%20returned%20in%20result%20.
// if no error message, revert with generic error
if (result.length == 0) {
revert FORWARD_CALL_FAILED();
}
assembly {
// We use Yul's revert() to bubble up errors from the target contract.
revert(add(32, result), mload(result))
}
}
/// Gets the deterministic address of the MinterAgent clone that gets created for a given recipient.
/// @param recipient The account that the agent is cloned on behalf of.
function agentAddress(address recipient) public view returns (address) {
return Clones.predictDeterministicAddress(agentImpl, _agentSalt(recipient));
}
/// Creates a clone of an agent contract, which mints tokens on behalf of the msg.sender. If a clone has already been created
/// for that account, returns it. Clone address is deterministic based on the recipient's address.
/// Sends all tokens received as a result of minting to the recipient.
/// @param callingAccount the account to receive tokens minted by this cloned agent.
/// @return agent the created agent
function _getOrCloneAgent(address callingAccount) private returns (IMinterAgent agent) {
address targetAddress = agentAddress(callingAccount);
if (targetAddress.code.length > 0) {
return IMinterAgent(targetAddress);
}
address cloneAddress = Clones.cloneDeterministic(agentImpl, _agentSalt(callingAccount));
agent = IMinterAgent(cloneAddress);
agent.initialize(address(this), callingAccount);
}
/// @dev Unique salt generated from an address for a callingAccount that a MinterAgent is create for.
function _agentSalt(address callingAccount) private pure returns (bytes32) {
return bytes32(uint256(uint160(callingAccount)) << 96);
}
function _mint(IMinterAgent _agent, address _target, bytes calldata _calldata, uint256 _value) private {
(bool success, bytes memory result) = _agent.forwardCall{value: _value}(_target, _calldata, _value);
if (!success) {
_handleForwardCallFail(result);
}
}
/// @dev Iterates through minting calls and calls them each via a IMinterAgent.
function _mintAll(
address callingAccount,
uint256 totalValueToSend,
address[] calldata _targets,
bytes[] calldata _calldatas,
uint256[] calldata _values
) private {
IMinterAgent _agent = _getOrCloneAgent(callingAccount);
(bool success, bytes memory result) = _agent.forwardCallBatch{value: totalValueToSend}(_targets, _calldatas, _values);
if (!success) {
_handleForwardCallFail(result);
}
}
/// Allocates fees and rewards which can be withdrawn against later.
/// Validates that the proper value has been sent by the calling account.
function _allocateFeesAndRewards(uint256 zoraFee, uint256 finderReward, uint256 requiredToBeSent, address finder) private {
// make sure that the correct amount was sent
if (requiredToBeSent != msg.value) {
revert INSUFFICIENT_VALUE(requiredToBeSent, msg.value);
}
rewardAllocations[zoraFeeRecipient] += zoraFee;
if (finderReward > 0) {
rewardAllocations[finder] += finderReward;
}
}
function _safeSend(uint256 amount, address to) private {
(bool success, ) = to.call{value: amount}("");
if (!success) revert FAILED_TO_SEND();
}
function _uncheckedSum(uint256[] calldata _values) private pure returns (uint256 totalValue) {
unchecked {
for (uint256 i = 0; i < _values.length; i++) {
totalValue += _values[i];
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
/*
░░░░░░░░░░░░░░
░░▒▒░░░░░░░░░░░░░░░░░░░░
░░▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░
░░▒▒▒▒░░░░░░░░░░░░░░ ░░░░░░░░
░▓▓▒▒▒▒░░░░░░░░░░░░ ░░░░░░░
░▓▓▓▒▒▒▒░░░░░░░░░░░░ ░░░░░░░░
░▓▓▓▒▒▒▒░░░░░░░░░░░░░░ ░░░░░░░░░░
░▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░
░▓▓▓▓▓▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░
░▓▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░
░░▓▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░
░░▓▓▓▓▓▓▒▒▒▒▒▒▒▒░░░░░░░░░▒▒▒▒▒░░
░░▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░
░░▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░░
OURS TRULY,
*/
/// @title Zora Universal Minter
/// @notice Mints ERC721 or ERC1155 tokens on behalf of an account on any standard ER721 or ERC1155 contract. Optionally collects fees for Zora and rewards for a finder.
/// @author @tbtstl / @oveddan
interface IZoraUniversalMinter {
error MINT_EXECUTION_FAILED();
error NOTHING_TO_WITHDRAW();
error FORWARD_CALL_FAILED();
error FAILED_TO_SEND();
error INSUFFICIENT_VALUE(uint256 expectedValue, uint256 actualValue);
// these are errors from Zora 1155Contracts, including them here will have them included in the abi, and allow them to get unwrapped/parsed by wagmi and can be decoded by viem.sh:
error UserExceedsMintLimit(address user, uint256 limit, uint256 requestedAmount);
error WrongValueSent();
error SaleEnded();
error SaleHasNotStarted();
event MintedBatch(
address[] indexed targets,
uint256[] values,
uint256 tokensMinted,
address finder,
address indexed minter,
uint256 indexed totalWithFees,
uint256 zoraFee,
uint256 finderFee
);
event Minted(
address indexed target,
uint256 value,
uint256 tokensMinted,
address finder,
address indexed minter,
uint256 indexed totalWithFees,
uint256 zoraFee,
uint256 finderFee
);
enum MintableTypes {
NONE,
ERC721,
ERC1155,
ERC1155_BATCH
}
/// Executes mint calls on a series of target ERC721 or ERC1155 contracts, then transfers the minted tokens to the calling account.
/// Adds a mint fee to the msg.value sent to the contract.
/// Assumes that the mint function for each target follows the ERC721 or ERC1155 standard for minting - which is that
/// the a safe transfer is used to transfer tokens - and the corresponding safeTransfer callbacks on the receiving account are called AFTER minting the tokens.
/// The value sent must include all the values to send to the minting contracts and the fees + reward amount.
/// This can be determined by calling `fee`, and getting the requiredToSend parameter.
/// @param _targets Addresses of contracts to call
/// @param _calldatas Data to pass to the mint functions for each target
/// @param _values Value to send to each target - must match the value required by the target's mint function.
/// @param _tokensMinted Total number of tokens minted across all targets, used to calculate fees
/// @param _finder Optional - address of finder that will receive a portion of the fees
function mintBatch(
address[] calldata _targets,
bytes[] calldata _calldatas,
uint256[] calldata _values,
uint256 _tokensMinted,
address _finder
) external payable;
/// @notice Executes mint calls on a series of target ERC721 or ERC1155 contracts, then transfers the minted tokens to the calling account.
/// Does not add a mint feee
/// Assumes that the mint function for each target follows the ERC721 or ERC1155 standard for minting - which is that
/// the a safe transfer is used to transfer tokens - and the corresponding safeTransfer callbacks on the receiving account are called AFTER minting the tokens.
/// The value sent must equal the total values to send to the minting contracts.
/// @param _targets Addresses of contracts to call
/// @param _calldatas Data to pass to the mint functions for each target
/// @param _values Value to send to each target - must match the value required by the target's mint function.
function mintBatchWithoutFees(address[] calldata _targets, bytes[] calldata _calldatas, uint256[] calldata _values) external payable;
/// Execute a mint call on a series a target ERC721 or ERC1155 contracts, then transfers the minted tokens to the calling account.
/// Adds a mint fee to the msg.value sent to the contract.
/// Assumes that the mint function for each target follows the ERC721 or ERC1155 standard for minting - which is that
/// the a safe transfer is used to transfer tokens - and the corresponding safeTransfer callbacks on the receiving account are called AFTER minting the tokens.
/// The value sent must include the value to send to the minting contract and the universal minter fee + finder reward amount.
/// This can be determined by calling `fee`, and getting the requiredToSend parameter.
/// @param _target Addresses of contract to call
/// @param _calldata Data to pass to the mint function for the target
/// @param _value Value to send to the target - must match the value required by the target's mint function.
/// @param _tokensMinted Total number of tokens minted across all targets, used to calculate fees
/// @param _finder Optional - address of finder that will receive a portion of the fees
function mint(address _target, bytes calldata _calldata, uint256 _value, uint256 _tokensMinted, address _finder) external payable;
/// Has a minter agent execute a transaction on behalf of the calling acccount. The minter
/// agent's address will be the same for the calling account as the address that was
/// used to mint the tokens. Can be used to recover tokens that may get accidentally locked in
/// the minter agent's contract address.
/// @param _target Address of contract to call
/// @param _calldata Calldata for arguments to call.
function forwardCallFromAgent(address _target, bytes calldata _calldata, uint256 _additionalValue) external payable;
/// Withdraws any fees or rewards that have been allocated to the caller's address. Fees can be withdrawn to any other specified address.
/// @param to The address to withdraw to
function withdraw(address to) external;
/// Calculates the fees that will be collected for a given mint, based on the value and tokens minted.
/// @param _mintValue Total value of the mint that is to be sent to external minting contracts
/// @param _tokensMinted Quantity of tokens minted
/// @param _finderAddress Address of the finder, if any. If the finder is the zora fee recipient, then the finder fee is 0.
/// @return zoraFee The fee that will be sent to the zora fee recipient
/// @return finderReward The fee that will be sent to the finder
/// @return requiredToSend The total value that must be sent to the contract, including fees
function fee(
uint256 _mintValue,
uint256 _tokensMinted,
address _finderAddress
) external view returns (uint256 zoraFee, uint256 finderReward, uint256 requiredToSend);
/// Gets the deterministic address of the MinterAgent clone that gets created for a given recipient.
/// @param recipient The account that the agent is cloned on behalf of.
function agentAddress(address recipient) external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface IMinterAgent {
error ALREADY_INITIALIZED();
error ONLY_OWNER();
error ARRAY_LENGTH_MISMATCH();
function initialize(address _owner, address _receiver) external;
function forwardCall(address _target, bytes calldata _cd, uint256 _value) external payable returns (bool success, bytes memory data);
function forwardCallBatch(
address[] calldata _targets,
bytes[] calldata _calldatas,
uint256[] calldata _values
) external payable returns (bool success, bytes memory data);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (proxy/Clones.sol)
pragma solidity ^0.8.0;
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*
* _Available since v3.4._
*/
library Clones {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(0, 0x09, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(0, 0x09, 0x37, salt)
}
require(instance != address(0), "ERC1167: create2 failed");
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := keccak256(add(ptr, 0x43), 0x55)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address implementation, bytes32 salt)
internal
view
returns (address predicted)
{
return predictDeterministicAddress(implementation, salt, address(this));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"@openzeppelin/=node_modules/@openzeppelin/",
"@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
"ds-test/=node_modules/ds-test/src/",
"forge-std/=node_modules/forge-std/src/"
],
"optimizer": {
"enabled": true,
"runs": 50000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_minterAgentImpl","type":"address"},{"internalType":"address","name":"_zoraFeeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FAILED_TO_SEND","type":"error"},{"inputs":[],"name":"FORWARD_CALL_FAILED","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedValue","type":"uint256"},{"internalType":"uint256","name":"actualValue","type":"uint256"}],"name":"INSUFFICIENT_VALUE","type":"error"},{"inputs":[],"name":"MINT_EXECUTION_FAILED","type":"error"},{"inputs":[],"name":"NOTHING_TO_WITHDRAW","type":"error"},{"inputs":[],"name":"SaleEnded","type":"error"},{"inputs":[],"name":"SaleHasNotStarted","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"name":"UserExceedsMintLimit","type":"error"},{"inputs":[],"name":"WrongValueSent","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"},{"indexed":false,"internalType":"address","name":"finder","type":"address"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"totalWithFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"zoraFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finderFee","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"},{"indexed":false,"internalType":"address","name":"finder","type":"address"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"totalWithFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"zoraFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finderFee","type":"uint256"}],"name":"MintedBatch","type":"event"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"agentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"agentImpl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintValue","type":"uint256"},{"internalType":"uint256","name":"_tokensMinted","type":"uint256"},{"internalType":"address","name":"_finderAddress","type":"address"}],"name":"fee","outputs":[{"internalType":"uint256","name":"zoraFee","type":"uint256"},{"internalType":"uint256","name":"finderReward","type":"uint256"},{"internalType":"uint256","name":"requiredToSend","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"},{"internalType":"uint256","name":"_additionalValue","type":"uint256"}],"name":"forwardCallFromAgent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_tokensMinted","type":"uint256"},{"internalType":"address","name":"_finder","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_targets","type":"address[]"},{"internalType":"bytes[]","name":"_calldatas","type":"bytes[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_tokensMinted","type":"uint256"},{"internalType":"address","name":"_finder","type":"address"}],"name":"mintBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_targets","type":"address[]"},{"internalType":"bytes[]","name":"_calldatas","type":"bytes[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"mintBatchWithoutFees","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zoraFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c03461009c57601f61136c38819003918201601f19168301916001600160401b038311848410176100a157808492604094855283398101031261009c57610052602061004b836100b7565b92016100b7565b60805260a0526040516112a090816100cc823960805181818161074801528181610a9f015261113a015260a0518181816102df015281816108ea01528181610d220152610d800152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361009c5756fe6080604052600436101561001257600080fd5b6000803560e01c9081632013446e146100aa57508063302deb14146100a557806351cff8d9146100a05780637c1e20681461009b578063842210eb146100965780638f7c79a314610091578063d58b57691461008c578063e84d4420146100875763fdca70991461008257600080fd5b61090e565b61089f565b61076c565b6106fd565b610594565b610452565b610352565b61025b565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576100dc6101c1565b60243567ffffffffffffffff81116101ba576100fc90369060040161022d565b73ffffffffffffffffffffffffffffffffffffffff61011d93929333610cd5565b166044353401938434116101b5578593610166604051968795869485947fc0951d6b00000000000000000000000000000000000000000000000000000000865260048601610c57565b039134905af19081156101b0578290839261018b575b5015610186575080f35b610c9c565b90506101a991503d8084833e6101a18183610b11565b810190610b8c565b908361017c565b610c90565b610a13565b8280fd5b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101e457565b600080fd5b6084359073ffffffffffffffffffffffffffffffffffffffff821682036101e457565b359073ffffffffffffffffffffffffffffffffffffffff821682036101e457565b9181601f840112156101e45782359167ffffffffffffffff83116101e457602083818601950101116101e457565b346101e45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45760206103346102976101c1565b60436055917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000604051913060388401526f5af43d82803e903d91602b57fd5bf3ff60248401527f00000000000000000000000000000000000000000000000000000000000000006014840152733d602d80600a3d3981f3363d3d373d3d3d363d73835260601b1660588201526037600c8201206078820152012090565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101e45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e4576103896101c1565b600090338252816020526040822054906001602052604083205491828111156103f7578281039081116101b5578083018093116101b5576103f4926103ee3373ffffffffffffffffffffffffffffffffffffffff166000526001602052604060002090565b556111d7565b80f35b60046040517f6c01d14c000000000000000000000000000000000000000000000000000000008152fd5b9181601f840112156101e45782359167ffffffffffffffff83116101e4576020808501948460051b0101116101e457565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45767ffffffffffffffff6004358181116101e45761049d903690600401610421565b6024929192358281116101e4576104b8903690600401610421565b90926044359081116101e4576104d2903690600401610421565b9390926104df8585611240565b9534870361055c5790817fe36a6f34ea83c6d542aa5154762f4212ebd322e41ecc55b97420d93904a24dcc9761051c836103f49998979695610981565b6040519060a0825261053260a083018a8a6109d6565b9060009b838d6020819601528460408201528460608201528460808201528033940390a433610f1f565b6040517f028ebaf000000000000000000000000000000000000000000000000000000000815260048101889052346024820152604490fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e4576105c66101c1565b60243567ffffffffffffffff81116101e4576105e96106b791369060040161022d565b6044939193359060643590826105fd6101e9565b9261067d61060a33610cd5565b94610616818486610a42565b91604051958787526020870152828b73ffffffffffffffffffffffffffffffffffffffff9788871660408201528360608201528460808201527f878da9a7ef8f595dd108643e1793e86cb8b04e90410fb000bb83a070309ff75a60a08a33941692a4611114565b6040518097819682957fc0951d6b00000000000000000000000000000000000000000000000000000000845260009b8c9a60048601610c57565b0393165af19081156101b057829083926106d5575015610186575080f35b90506106eb91503d8084833e6101a18183610b11565b903861017c565b60009103126101e457565b346101e45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45767ffffffffffffffff6004358181116101e4576107b7903690600401610421565b906024358381116101e4576107d0903690600401610421565b906044359485116101e4576107ec61089d953690600401610421565b94909385610897606435848461084b61085e6108066101e9565b948c7fe36a6f34ea83c6d542aa5154762f4212ebd322e41ecc55b97420d93904a24dcc6108338a83611240565b9961083f89858d610a42565b998a9792989199610981565b936040519260a0845260a08401916109d6565b93602082015273ffffffffffffffffffffffffffffffffffffffff891660408201528560608201528660808201528033940390a4611114565b33610f1f565b005b346101e45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101e45760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45760443573ffffffffffffffffffffffffffffffffffffffff811681036101e45761096e606091602435600435610a42565b9060405192835260208301526040820152f35b604051918291829160005b81811061099c5750505003902090565b9193509160019073ffffffffffffffffffffffffffffffffffffffff6109c18661020c565b1681526020809101940191019184939261098c565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116101e45760209260051b809284830137010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b929060009273ffffffffffffffffffffffffffffffffffffffff8091168015918215610a9d575b505015610a7f576602c2ad68fd90000292830190565b8093925065c9e86723e00002926601f8c501d9b00002918284010190565b7f0000000000000000000000000000000000000000000000000000000000000000161490503880610a69565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610b0c57604052565b610ac9565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b0c57604052565b67ffffffffffffffff8111610b0c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b91906040838203126101e457825180151581036101e45792602090818101519067ffffffffffffffff82116101e4570182601f820112156101e457805190610bd382610b52565b93610be16040519586610b11565b8285528383830101116101e45760005b828110610c05575050906000918301015290565b8181018401518582018501528301610bf1565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9493929160409273ffffffffffffffffffffffffffffffffffffffff610c8b93168752606060208801526060870191610c18565b930152565b6040513d6000823e3d90fd5b805115610cab57805190602001fd5b60046040517fded9a23b000000000000000000000000000000000000000000000000000000008152fd5b90610d778260436055917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000604051913060388401526f5af43d82803e903d91602b57fd5bf3ff60248401527f00000000000000000000000000000000000000000000000000000000000000006014840152733d602d80600a3d3981f3363d3d373d3d3d363d73835260601b1660588201526037600c8201206078820152012090565b803b610f0557507f00000000000000000000000000000000000000000000000000000000000000006e5af43d82803e903d91602b57fd5bf3600091763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c1617835260781b1760205273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b166037600984f5168015610ea7578093813b156101ba576040517f485cc95500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116602482015291908290604490829084905af180156101b057610e925750565b80610e9f610ea592610af8565b806106f2565b565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff169150565b94610f48979293959691949673ffffffffffffffffffffffffffffffffffffffff988991610cd5565b16966040519889977f8363da720000000000000000000000000000000000000000000000000000000089528060648a01606060048c0152526084890196916000905b8282106110e457505050507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9182888703016024890152808652602080870196818360051b82010197846000925b85841061103c575050505050505083600097959387959361100293878096030160448601526109d6565b03925af19081156101b0576000908192611020575b50156101865750565b9061103592503d8091833e6101a18183610b11565b9038611017565b9193959a9b509193959697987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030184528a357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112156101e457830186810191903567ffffffffffffffff81116101e45780360383136101e4576110cc88928392600195610c18565b9c0194019401918d9b9a999897969491959395610fd8565b919398995091949596600190826110fa8861020c565b1681526020809101960192018b9998939197969597610f8a565b90929134810361119e575073ffffffffffffffffffffffffffffffffffffffff600091817f0000000000000000000000000000000000000000000000000000000000000000168352826020526040832080549182018092116101b557558361117d575b50505050565b604092168152806020522080549182018092116101b5575538808080611177565b6040517f028ebaf00000000000000000000000000000000000000000000000000000000081526004810191909152346024820152604490fd5b60008080939281935af13d1561123b573d6111f181610b52565b906111ff6040519283610b11565b8152600060203d92013e5b1561121157565b60046040517f381f9583000000000000000000000000000000000000000000000000000000008152fd5b61120a565b6000929183915b81831061125357505050565b9091936001908560051b830135019401919061124756fea2646970667358221220d4079b3fad5b16e0f6aa242478802dffdd80cc4b3982539ebb182e778868a6ca64736f6c634300081300330000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd224000000000000000000000000044928735180f03b334f82617a552dee4631c9bdb
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c9081632013446e146100aa57508063302deb14146100a557806351cff8d9146100a05780637c1e20681461009b578063842210eb146100965780638f7c79a314610091578063d58b57691461008c578063e84d4420146100875763fdca70991461008257600080fd5b61090e565b61089f565b61076c565b6106fd565b610594565b610452565b610352565b61025b565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576100dc6101c1565b60243567ffffffffffffffff81116101ba576100fc90369060040161022d565b73ffffffffffffffffffffffffffffffffffffffff61011d93929333610cd5565b166044353401938434116101b5578593610166604051968795869485947fc0951d6b00000000000000000000000000000000000000000000000000000000865260048601610c57565b039134905af19081156101b0578290839261018b575b5015610186575080f35b610c9c565b90506101a991503d8084833e6101a18183610b11565b810190610b8c565b908361017c565b610c90565b610a13565b8280fd5b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101e457565b600080fd5b6084359073ffffffffffffffffffffffffffffffffffffffff821682036101e457565b359073ffffffffffffffffffffffffffffffffffffffff821682036101e457565b9181601f840112156101e45782359167ffffffffffffffff83116101e457602083818601950101116101e457565b346101e45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45760206103346102976101c1565b60436055917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000604051913060388401526f5af43d82803e903d91602b57fd5bf3ff60248401527f0000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd22406014840152733d602d80600a3d3981f3363d3d373d3d3d363d73835260601b1660588201526037600c8201206078820152012090565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101e45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e4576103896101c1565b600090338252816020526040822054906001602052604083205491828111156103f7578281039081116101b5578083018093116101b5576103f4926103ee3373ffffffffffffffffffffffffffffffffffffffff166000526001602052604060002090565b556111d7565b80f35b60046040517f6c01d14c000000000000000000000000000000000000000000000000000000008152fd5b9181601f840112156101e45782359167ffffffffffffffff83116101e4576020808501948460051b0101116101e457565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45767ffffffffffffffff6004358181116101e45761049d903690600401610421565b6024929192358281116101e4576104b8903690600401610421565b90926044359081116101e4576104d2903690600401610421565b9390926104df8585611240565b9534870361055c5790817fe36a6f34ea83c6d542aa5154762f4212ebd322e41ecc55b97420d93904a24dcc9761051c836103f49998979695610981565b6040519060a0825261053260a083018a8a6109d6565b9060009b838d6020819601528460408201528460608201528460808201528033940390a433610f1f565b6040517f028ebaf000000000000000000000000000000000000000000000000000000000815260048101889052346024820152604490fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e4576105c66101c1565b60243567ffffffffffffffff81116101e4576105e96106b791369060040161022d565b6044939193359060643590826105fd6101e9565b9261067d61060a33610cd5565b94610616818486610a42565b91604051958787526020870152828b73ffffffffffffffffffffffffffffffffffffffff9788871660408201528360608201528460808201527f878da9a7ef8f595dd108643e1793e86cb8b04e90410fb000bb83a070309ff75a60a08a33941692a4611114565b6040518097819682957fc0951d6b00000000000000000000000000000000000000000000000000000000845260009b8c9a60048601610c57565b0393165af19081156101b057829083926106d5575015610186575080f35b90506106eb91503d8084833e6101a18183610b11565b903861017c565b60009103126101e457565b346101e45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e457602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000044928735180f03b334f82617a552dee4631c9bdb168152f35b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45767ffffffffffffffff6004358181116101e4576107b7903690600401610421565b906024358381116101e4576107d0903690600401610421565b906044359485116101e4576107ec61089d953690600401610421565b94909385610897606435848461084b61085e6108066101e9565b948c7fe36a6f34ea83c6d542aa5154762f4212ebd322e41ecc55b97420d93904a24dcc6108338a83611240565b9961083f89858d610a42565b998a9792989199610981565b936040519260a0845260a08401916109d6565b93602082015273ffffffffffffffffffffffffffffffffffffffff891660408201528560608201528660808201528033940390a4611114565b33610f1f565b005b346101e45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd2240168152f35b346101e45760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e45760443573ffffffffffffffffffffffffffffffffffffffff811681036101e45761096e606091602435600435610a42565b9060405192835260208301526040820152f35b604051918291829160005b81811061099c5750505003902090565b9193509160019073ffffffffffffffffffffffffffffffffffffffff6109c18661020c565b1681526020809101940191019184939261098c565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116101e45760209260051b809284830137010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b929060009273ffffffffffffffffffffffffffffffffffffffff8091168015918215610a9d575b505015610a7f576602c2ad68fd90000292830190565b8093925065c9e86723e00002926601f8c501d9b00002918284010190565b7f00000000000000000000000044928735180f03b334f82617a552dee4631c9bdb161490503880610a69565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610b0c57604052565b610ac9565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b0c57604052565b67ffffffffffffffff8111610b0c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b91906040838203126101e457825180151581036101e45792602090818101519067ffffffffffffffff82116101e4570182601f820112156101e457805190610bd382610b52565b93610be16040519586610b11565b8285528383830101116101e45760005b828110610c05575050906000918301015290565b8181018401518582018501528301610bf1565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9493929160409273ffffffffffffffffffffffffffffffffffffffff610c8b93168752606060208801526060870191610c18565b930152565b6040513d6000823e3d90fd5b805115610cab57805190602001fd5b60046040517fded9a23b000000000000000000000000000000000000000000000000000000008152fd5b90610d778260436055917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000604051913060388401526f5af43d82803e903d91602b57fd5bf3ff60248401527f0000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd22406014840152733d602d80600a3d3981f3363d3d373d3d3d363d73835260601b1660588201526037600c8201206078820152012090565b803b610f0557507f0000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd22406e5af43d82803e903d91602b57fd5bf3600091763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c1617835260781b1760205273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b166037600984f5168015610ea7578093813b156101ba576040517f485cc95500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116602482015291908290604490829084905af180156101b057610e925750565b80610e9f610ea592610af8565b806106f2565b565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff169150565b94610f48979293959691949673ffffffffffffffffffffffffffffffffffffffff988991610cd5565b16966040519889977f8363da720000000000000000000000000000000000000000000000000000000089528060648a01606060048c0152526084890196916000905b8282106110e457505050507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9182888703016024890152808652602080870196818360051b82010197846000925b85841061103c575050505050505083600097959387959361100293878096030160448601526109d6565b03925af19081156101b0576000908192611020575b50156101865750565b9061103592503d8091833e6101a18183610b11565b9038611017565b9193959a9b509193959697987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030184528a357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112156101e457830186810191903567ffffffffffffffff81116101e45780360383136101e4576110cc88928392600195610c18565b9c0194019401918d9b9a999897969491959395610fd8565b919398995091949596600190826110fa8861020c565b1681526020809101960192018b9998939197969597610f8a565b90929134810361119e575073ffffffffffffffffffffffffffffffffffffffff600091817f00000000000000000000000044928735180f03b334f82617a552dee4631c9bdb168352826020526040832080549182018092116101b557558361117d575b50505050565b604092168152806020522080549182018092116101b5575538808080611177565b6040517f028ebaf00000000000000000000000000000000000000000000000000000000081526004810191909152346024820152604490fd5b60008080939281935af13d1561123b573d6111f181610b52565b906111ff6040519283610b11565b8152600060203d92013e5b1561121157565b60046040517f381f9583000000000000000000000000000000000000000000000000000000008152fd5b61120a565b6000929183915b81831061125357505050565b9091936001908560051b830135019401919061124756fea2646970667358221220d4079b3fad5b16e0f6aa242478802dffdd80cc4b3982539ebb182e778868a6ca64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd224000000000000000000000000044928735180f03b334f82617a552dee4631c9bdb
-----Decoded View---------------
Arg [0] : _minterAgentImpl (address): 0x3d961f2758a537D6D12cb9335a9FD7D2ABbd2240
Arg [1] : _zoraFeeRecipient (address): 0x44928735180F03b334F82617A552DEE4631c9Bdb
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003d961f2758a537d6d12cb9335a9fd7d2abbd2240
Arg [1] : 00000000000000000000000044928735180f03b334f82617a552dee4631c9bdb
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.