文件 1 的 7:ERC721Structs.sol
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
struct CreateParams {
string name;
string symbol;
string uri;
string tokensURI;
uint24 maxSupply;
bool isZeroIndexed;
uint24 royaltyAmount;
uint256 endTime;
}
struct MintParams {
address collection;
uint24 quantity;
bytes32[] merkleProof;
uint8 phaseId;
}
struct OmnichainMintParams {
address collection;
uint24 quantity;
uint256 paid;
uint8 phaseId;
address minter;
}
struct Phase {
uint256 from;
uint256 to;
uint24 maxPerAddress;
uint256 price;
bytes32 merkleRoot;
}
struct BasicCollectionParams {
string name;
string symbol;
string uri;
string tokensURI;
uint24 maxSupply;
address owner;
}
文件 2 的 7:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 3 的 7:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
文件 4 的 7:IOmniseaDropsFactory.sol
pragma solidity ^0.8.7;
import {CreateParams} from "../structs/erc721/ERC721Structs.sol";
interface IOmniseaDropsFactory {
function create(CreateParams calldata params) external;
function drops(address) external returns (bool);
}
文件 5 的 7:IOmniseaERC721Psi.sol
pragma solidity >=0.5.0;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import { CreateParams } from "../structs/erc721/ERC721Structs.sol";
interface IOmniseaERC721Psi is IERC165 {
function initialize(CreateParams memory params, address _owner, address _dropsManagerAddress, address _scheduler, address _universalONFT) external;
function mint(address _minter, uint24 _quantity, bytes32[] memory _merkleProof, uint8 _phaseId) external;
function mintPrice(uint8 _phaseId) external view returns (uint256);
function exists(uint256 tokenId) external view returns (bool);
function owner() external view returns (address);
function dropsManager() external view returns (address);
}
文件 6 的 7:OmniseaDropsManager.sol
pragma solidity ^0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {MintParams} from "../structs/erc721/ERC721Structs.sol";
import "../interfaces/IOmniseaERC721Psi.sol";
import "../interfaces/IOmniseaDropsFactory.sol";
contract OmniseaDropsManager is ReentrancyGuard {
event Minted(address collection, address minter, uint256 quantity, uint256 value);
uint256 public fixedFee;
uint256 private _fee;
address private _revenueManager;
address private _owner;
bool private _isPaused;
IOmniseaDropsFactory private _factory;
modifier onlyOwner() {
require(msg.sender == _owner);
_;
}
constructor(address factory_) {
_owner = msg.sender;
_revenueManager = address(0x61104fBe07ecc735D8d84422c7f045f8d29DBf15);
_factory = IOmniseaDropsFactory(factory_);
_fee = 4;
fixedFee = 250000000000000;
}
function setFee(uint256 fee) external onlyOwner {
require(fee <= 20);
_fee = fee;
}
function setFixedFee(uint256 fee) external onlyOwner {
fixedFee = fee;
}
function setRevenueManager(address _manager) external onlyOwner {
_revenueManager = _manager;
}
function mint(MintParams calldata _params) external payable nonReentrant {
require(!_isPaused);
require(_factory.drops(_params.collection));
IOmniseaERC721Psi collection = IOmniseaERC721Psi(_params.collection);
uint256 price = collection.mintPrice(_params.phaseId);
uint256 quantityPrice = price * _params.quantity;
require(msg.value == quantityPrice + fixedFee, "!=price");
if (quantityPrice > 0) {
uint256 paidToOwner = quantityPrice * (100 - _fee) / 100;
(bool p1,) = payable(collection.owner()).call{value: paidToOwner}("");
require(p1, "!p1");
(bool p2,) = payable(_revenueManager).call{value: msg.value - paidToOwner}("");
require(p2, "!p2");
} else {
(bool p3,) = payable(_revenueManager).call{value: msg.value}("");
require(p3, "!p3");
}
collection.mint(msg.sender, _params.quantity, _params.merkleProof, _params.phaseId);
emit Minted(_params.collection, msg.sender, _params.quantity, msg.value);
}
function setPause(bool isPaused_) external onlyOwner {
_isPaused = isPaused_;
}
function withdraw() external onlyOwner {
(bool p,) = payable(_owner).call{value: address(this).balance}("");
require(p, "!p");
}
receive() external payable {}
}
文件 7 的 7:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
{
"compilationTarget": {
"src/contracts/v3/OmniseaDropsManager.sol": "OmniseaDropsManager"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"factory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Minted","type":"event"},{"inputs":[],"name":"fixedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint24","name":"quantity","type":"uint24"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"phaseId","type":"uint8"}],"internalType":"struct MintParams","name":"_params","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setFixedFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPaused_","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setRevenueManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]