编译器
0.8.21+commit.d9974bed
文件 1 的 7:IMetadataRenderer.sol
pragma solidity ^0.8.21;
interface IMetadataRenderer {
function tokenURI(uint256 tokenId) external view returns (string memory uri);
}
文件 2 的 7:IMintContract.sol
pragma solidity ^0.8.21;
import {IMetadataRenderer} from "create/interfaces/v1/IMetadataRenderer.sol";
interface IMintContractEvents {
event RoyaltyUpdated(uint256 bps);
event ModuleAdded(address module);
event ModuleRemoved(address module);
event MetadataRendererUpdated(address renderer);
}
interface IMintContract is IMintContractEvents {
function mint(address to, uint256 quantity) external;
function adminMint(address to, uint256 quantity) external;
function payoutRecipient() external view returns (address recipient);
function totalMinted() external view returns (uint256 total);
function addMintModule(address mintModule) external;
function removeMintModule(address mintModule) external;
function isMintModuleApproved(address mintModule) external view returns (bool isApproved);
function updateExternalConfiguration(address[] calldata configurables, bytes[] calldata configData) external;
function setMetadataRenderer(IMetadataRenderer renderer) external;
function metadataRenderer() external returns (IMetadataRenderer metadataRenderer);
function refreshMetadata() external;
function setRoyalty(uint256 bps) external;
function royaltyBps() external returns (uint256 bps);
}
文件 3 的 7:IMintPayout.sol
pragma solidity ^0.8.21;
interface IMintPayoutEvents {
event Deposit(address from, address to, bytes4 reason, uint256 amount);
event Withdraw(address from, address to, uint256 amount);
event MintDeposit(
address depositedBy,
address mintContract,
address minter,
address referrer,
address creator,
uint256 creatorPayout,
uint256 referralPayout,
uint256 protocolPayout,
uint256 totalAmount,
uint256 quantity,
uint256 protocolFee
);
event ProtocolFeeUpdated(uint256 fee);
}
interface IMintPayout is IMintPayoutEvents {
function balanceOf(address owner) external view returns (uint256);
function totalSupply() external view returns (uint256);
function protocolFee() external view returns (uint256 fee);
function setProtocolFee(uint256 fee) external;
function protocolFeeRecipientAccount() external view returns (address);
function withdrawProtocolFee(address to, uint256 amount) external;
function mintDeposit(address mintContract, address minter, address referrer, uint256 quantity) external payable;
function deposit(address to, bytes4 reason) external payable;
function depositBatch(address[] calldata recipients, uint256[] calldata amounts, bytes4[] calldata reasons)
external
payable;
function withdraw(address to, uint256 amount) external;
function withdrawAll(address to) external;
}
文件 4 的 7:MintPayout.sol
pragma solidity ^0.8.21;
import {Ownable} from "solady/auth/Ownable.sol";
import {IMintPayout} from "create/interfaces/v1/IMintPayout.sol";
import {IMintContract} from "create/interfaces/v1/IMintContract.sol";
import {Version} from "create/contracts/v1/Version.sol";
import {
MINT_REFERRAL_REASON,
PROTOCOL_FEE_REASON,
PURCHASE_AMOUNT_REASON
} from "create/interfaces/v1/MintPayoutReasons.sol";
contract MintPayout is IMintPayout, Version, Ownable {
uint256 public protocolFee;
address public constant protocolFeeRecipientAccount = address(0x4444444444444444444444444444444444444444);
mapping(address => uint256) public balanceOf;
error InvalidAddress();
error InvalidArrayLength();
error IncorrectDepositAmount();
error InvalidWithdrawAmount();
error TransferFailed();
constructor() Version(1) {
_initializeOwner(tx.origin);
}
function totalSupply() external view returns (uint256) {
return address(this).balance;
}
function setProtocolFee(uint256 _protocolFee) external onlyOwner {
protocolFee = _protocolFee;
emit ProtocolFeeUpdated(_protocolFee);
}
function withdrawProtocolFee(address to, uint256 amount) external onlyOwner {
_withdraw(protocolFeeRecipientAccount, to, amount);
}
function mintDeposit(address mintContract, address minter, address referrer, uint256 quantity) external payable {
if (mintContract == address(0)) revert InvalidAddress();
if (quantity == 0) revert IncorrectDepositAmount();
if (msg.value == 0) revert IncorrectDepositAmount();
uint256 protocolPayout = protocolFee * quantity;
uint256 referralPayout;
if (referrer != address(0)) {
referralPayout = protocolPayout / 2;
protocolPayout = referralPayout;
}
if (msg.value < protocolPayout + referralPayout) revert IncorrectDepositAmount();
uint256 creatorPayout = msg.value - protocolPayout - referralPayout;
address creator;
if (creatorPayout > 0) {
creator = IMintContract(mintContract).payoutRecipient();
if (creator == address(0)) {
creator = protocolFeeRecipientAccount;
}
_deposit(msg.sender, creator, PURCHASE_AMOUNT_REASON, creatorPayout);
}
if (referralPayout > 0) {
_deposit(msg.sender, referrer, MINT_REFERRAL_REASON, referralPayout);
}
if (protocolPayout > 0) {
_deposit(msg.sender, protocolFeeRecipientAccount, PROTOCOL_FEE_REASON, protocolPayout);
}
emit MintDeposit(
msg.sender,
mintContract,
minter,
referrer,
creator,
creatorPayout,
referralPayout,
protocolPayout,
msg.value,
quantity,
protocolFee
);
}
function deposit(address to, bytes4 reason) external payable {
if (to == address(0)) revert InvalidAddress();
_deposit(msg.sender, to, reason, msg.value);
}
function depositBatch(address[] calldata recipients, uint256[] calldata amounts, bytes4[] calldata reasons)
external
payable
{
uint256 numRecipients = recipients.length;
if (numRecipients != amounts.length || numRecipients != reasons.length) {
revert InvalidArrayLength();
}
uint256 expectedTotalValue;
for (uint256 i; i < numRecipients;) {
expectedTotalValue += amounts[i];
unchecked {
++i;
}
}
if (msg.value != expectedTotalValue) revert IncorrectDepositAmount();
address currentRecipient;
uint256 currentAmount;
for (uint256 i; i < numRecipients;) {
currentRecipient = recipients[i];
currentAmount = amounts[i];
if (currentRecipient == address(0)) revert InvalidAddress();
_deposit(msg.sender, currentRecipient, reasons[i], currentAmount);
unchecked {
++i;
}
}
}
function _deposit(address from, address to, bytes4 reason, uint256 amount) internal {
balanceOf[to] += amount;
emit Deposit(from, to, reason, amount);
}
function withdraw(address to, uint256 amount) external {
_withdraw(msg.sender, to, amount);
}
function withdrawAll(address to) external {
_withdraw(msg.sender, to, balanceOf[msg.sender]);
}
function _withdraw(address from, address to, uint256 amount) internal {
if (to == address(0)) revert InvalidAddress();
if (amount == 0 || amount > balanceOf[from]) revert InvalidWithdrawAmount();
balanceOf[from] -= amount;
emit Withdraw(from, to, amount);
(bool success,) = to.call{value: amount}("");
if (!success) revert TransferFailed();
}
}
文件 5 的 7:MintPayoutReasons.sol
pragma solidity ^0.8.21;
bytes4 constant MINT_REFERRAL_REASON = bytes4(keccak256("MINT_REFERRAL"));
bytes4 constant PROTOCOL_FEE_REASON = bytes4(keccak256("PROTOCOL_FEE"));
bytes4 constant PURCHASE_AMOUNT_REASON = bytes4(keccak256("PURCHASE_AMOUNT"));
文件 6 的 7:Ownable.sol
pragma solidity ^0.8.4;
abstract contract Ownable {
error Unauthorized();
error NewOwnerIsZeroAddress();
error NoHandoverRequest();
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
event OwnershipHandoverRequested(address indexed pendingOwner);
event OwnershipHandoverCanceled(address indexed pendingOwner);
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8;
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
function _initializeOwner(address newOwner) internal virtual {
assembly {
newOwner := shr(96, shl(96, newOwner))
sstore(not(_OWNER_SLOT_NOT), newOwner)
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
function _setOwner(address newOwner) internal virtual {
assembly {
let ownerSlot := not(_OWNER_SLOT_NOT)
newOwner := shr(96, shl(96, newOwner))
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
sstore(ownerSlot, newOwner)
}
}
function _checkOwner() internal view virtual {
assembly {
if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
mstore(0x00, 0x82b42900)
revert(0x1c, 0x04)
}
}
}
function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
return 48 * 3600;
}
function transferOwnership(address newOwner) public payable virtual onlyOwner {
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae)
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
function renounceOwnership() public payable virtual onlyOwner {
_setOwner(address(0));
}
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + _ownershipHandoverValidFor();
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
function cancelOwnershipHandover() public payable virtual {
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818)
revert(0x1c, 0x04)
}
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
function owner() public view virtual returns (address result) {
assembly {
result := sload(not(_OWNER_SLOT_NOT))
}
}
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
result := sload(keccak256(0x0c, 0x20))
}
}
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}
文件 7 的 7:Version.sol
pragma solidity ^0.8.21;
abstract contract Version {
uint32 public immutable contractVersion;
constructor(uint32 _contractVersion) {
contractVersion = _contractVersion;
}
}
{
"compilationTarget": {
"src/Create/contracts/v1/MintPayout.sol": "MintPayout"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 250000
},
"remappings": [
":ERC721A/=lib/ERC721A/contracts/",
":base64/=lib/base64/",
":create/=src/Create/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
":erc721a-upgradeable/=lib/erc721a-upgradeable/contracts/",
":forge-std/=lib/forge-std/src/",
":fundrop/=src/Fundrop/",
":openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/",
":operator-filter-registry/=lib/operator-filter-registry/src/",
":solady/=lib/solady/src/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IncorrectDepositAmount","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidArrayLength","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"reason","type":"bytes4"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositedBy","type":"address"},{"indexed":false,"internalType":"address","name":"mintContract","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"creatorPayout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralPayout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolPayout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolFee","type":"uint256"}],"name":"MintDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ProtocolFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes4","name":"reason","type":"bytes4"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes4[]","name":"reasons","type":"bytes4[]"}],"name":"depositBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"mintContract","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeRecipientAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]