编译器
0.8.18+commit.87f61d96
文件 1 的 29:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 29:AuctionHouse.sol
pragma solidity ^0.8.17;
import '@openzeppelin/contracts/security/Pausable.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import {Math} from '@openzeppelin/contracts/utils/math/Math.sol';
import {ECDSA} from '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
import './WildNFT.sol';
import './IAuctionHouse.sol';
interface SanctionsList {
function isSanctioned(address addr) external view returns (bool);
}
interface IOasis {
function balanceOf(address _address) external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
}
interface IDelegationRegistry {
function checkDelegateForContract(address delegate, address vault, address contract_) external view returns (bool);
}
contract AuctionHouse is IAuctionHouse, Pausable, ReentrancyGuard, Ownable {
uint256 public oasisPrice;
uint256 public allowListPrice;
uint256 public minimumBid;
uint256 public minBidIncrement;
uint256 public publicPrice;
uint256 public publicSaleMintMax;
uint256 public allowlistMintMax;
uint256 public timeBuffer;
uint256 public duration;
uint256 public raffleSupply;
uint256 public auctionSupply;
uint256 public allowlistSupply;
uint256 public maxSupply;
uint256 public promoSupply;
uint256 public oasisListStartDateTime;
uint256 public allowListStartDateTime;
uint256 public allowListEndDateTime;
uint256 public auctionStartDateTime;
uint256 public auctionEndDateTime;
uint256 public auctionExtentedTime;
uint256 public wildPrimaryRoyalty;
uint256 public primaryFeeNumerator;
address payable public wildPayee;
address payable public payee;
address payable public admin;
address public allowlistSigner;
bool public auctionWinnersSet = false;
bool public raffleWinnersSet = false;
bool public auctionSettled = false;
bool public settled = false;
bool public publicSale = false;
bool public useOasisPriceForPublicSale;
IOasis public oasis;
WildNFT public nft;
SanctionsList public sanctionsList;
struct Bid {
address payable bidder;
uint256 amount;
bool minted;
uint256 timestamp;
bool refunded;
bool winner;
uint256 finalprice;
bool rafflewinner;
}
mapping(address => Bid) public Bids;
mapping(address => uint8) public allowList;
mapping(address => uint256) public allowListMinted;
mapping(uint256 => uint8) public oasisPassMints;
mapping(uint64 => bool) private onlyOnceMapping;
modifier onlyOnce(uint64 key) {
require(onlyOnceMapping[key] == false);
onlyOnceMapping[key] = true;
_;
}
modifier onlyUnpaused() {
require(!paused(), 'AuctionHouse: paused');
_;
}
modifier onlyAdmin() {
require(msg.sender == admin, 'AuctionHouse: only admin permitted.');
_;
}
modifier onlyUnsanctioned(address _to) {
bool isToSanctioned = sanctionsList.isSanctioned(_to);
require(!isToSanctioned, 'Blocked: OFAC sanctioned address');
_;
}
constructor(WildNFT _nft, address _payee, address _oasis, address _sanctions, address _allowlistSigner, address _wildPayee, uint256 _wildPrimaryRoyalty, uint256 _primaryFeeNumerator) {
nft = _nft;
payee = payable(_payee);
oasis = IOasis(_oasis);
sanctionsList = SanctionsList(_sanctions);
allowlistSigner = _allowlistSigner;
admin = payable(0x9DAF56fB5d08b1dad7e6A46e0d5E814F41d1b7F9);
wildPayee = payable(_wildPayee);
wildPrimaryRoyalty = _wildPrimaryRoyalty;
primaryFeeNumerator = _primaryFeeNumerator;
}
function setVariablesBatch1(uint256 _allowlistMintMax, uint256 _timeBuffer, uint256 _minimumBid, uint256 _minBidIncrement, uint256 _allowListPrice, uint256 _duration, uint256 _publicSaleMintMax, uint256 _oasisPrice, uint256 _publicPrice, bool _useOasisPriceForPublicSale) public onlyOwner onlyOnce(1) {
allowlistMintMax = _allowlistMintMax;
timeBuffer = _timeBuffer;
minimumBid = _minimumBid;
minBidIncrement = _minBidIncrement;
allowListPrice = _allowListPrice;
duration = _duration;
publicSaleMintMax = _publicSaleMintMax;
oasisPrice = _oasisPrice;
publicPrice = _publicPrice;
useOasisPriceForPublicSale = _useOasisPriceForPublicSale;
}
function setVariablesBatch2(uint256 _raffleSupply, uint256 _auctionSupply, uint256 _allowlistSupply, uint256 _maxSupply, uint256 _promoSupply, uint256 _oasisListStartDateTime, uint256 _allowListStartDateTime, uint256 _allowListEndDateTime, uint256 _auctionStartDateTime, uint256 _auctionEndDateTime) public onlyOwner onlyOnce(2) {
raffleSupply = _raffleSupply;
auctionSupply = _auctionSupply;
allowlistSupply = _allowlistSupply;
maxSupply = _maxSupply;
promoSupply = _promoSupply;
oasisListStartDateTime = _oasisListStartDateTime;
allowListStartDateTime = _allowListStartDateTime;
allowListEndDateTime = _allowListEndDateTime;
auctionStartDateTime = _auctionStartDateTime;
auctionEndDateTime = _auctionEndDateTime;
}
function skipToPublicSale() public onlyOwner onlyOnce(3) {
auctionWinnersSet = true;
raffleWinnersSet = true;
auctionSettled = true;
settled = true;
publicSale = true;
}
function setAdmin(address _admin) public onlyOwner {
admin = payable(_admin);
}
function setPayee(address payable _payee) public onlyOwner {
payee = _payee;
}
function setWildPayee(address payable _wildPayee) public onlyOwner {
wildPayee = _wildPayee;
}
function setWildPrimaryRoyalty(uint256 _wildPrimaryRoyalty) public onlyOwner {
wildPrimaryRoyalty = _wildPrimaryRoyalty;
}
function setPrimaryFeeNumerator(uint256 _primaryFeeNumerator) public onlyOwner {
primaryFeeNumerator = _primaryFeeNumerator;
}
function pause() external override onlyOwner {
_pause();
}
function unpause() external override onlyOwner {
_unpause();
}
function _withdraw() internal {
require(auctionSettled == true && block.timestamp > auctionEndDateTime, 'Auction not settled||not ended. Cannot withdraw.');
if (wildPrimaryRoyalty > 0) {
(bool successWild, ) = wildPayee.call{value: ((address(this).balance * wildPrimaryRoyalty) / primaryFeeNumerator)}('');
require(successWild, 'AuctionHouse: Failed to withdraw to wild payee.');
}
(bool successPayee, ) = payee.call{value: address(this).balance}('');
require(successPayee, 'AuctionHouse: Failed to withdraw to artist payee.');
}
function withdraw() public onlyOwner {
_withdraw();
}
function setRaffleWinners(address[] memory _raffleWinners) external onlyOwner {
require(block.timestamp > auctionEndDateTime, 'Auction not over yet.');
require(raffleWinnersSet == false, 'Raffle already settled');
require(_raffleWinners.length <= raffleSupply, 'Incorrect number of winners');
for (uint256 i = 0; i < _raffleWinners.length; i++) {
Bid storage bid = Bids[_raffleWinners[i]];
bid.winner = true;
bid.finalprice = minimumBid;
bid.rafflewinner = true;
}
raffleWinnersSet = true;
}
function setAuctionWinners(address[] memory _auctionWinners, uint256[] memory _prices) external onlyOwner {
require(block.timestamp > auctionEndDateTime, 'Auction not over yet.');
require(auctionWinnersSet == false, 'Auction already settled');
for (uint256 i = 0; i < _auctionWinners.length; i++) {
Bid storage bid = Bids[_auctionWinners[i]];
bid.winner = true;
bid.finalprice = _prices[i];
bid.rafflewinner = false;
}
auctionWinnersSet = true;
}
function settleBidder(address[] memory _bidders) external onlyOwner nonReentrant {
require(block.timestamp > auctionEndDateTime, "Auction hasn't ended.");
require(auctionWinnersSet == true && raffleWinnersSet == true, 'Auction winners not set');
for (uint256 i = 0; i < _bidders.length; i++) {
address bidder = _bidders[i];
Bid storage bid = Bids[bidder];
if (bid.winner == true && bid.minted == false && bid.refunded == false) {
uint256 difference = bid.amount - bid.finalprice;
if (difference > 0) {
(bool success, ) = bidder.call{value: difference}('');
require(success, 'Failed to refund difference to winner.');
}
uint256 tokenId = nft.mint(bidder);
uint256[] memory tokenIds = new uint256[](1);
tokenIds[0] = tokenId;
if (bid.rafflewinner == true) {
emit TokenMint(bidder, tokenIds, MintType.Raffle, bid.finalprice, false, address(0), false, new uint256[](0));
} else {
emit TokenMint(bidder, tokenIds, MintType.Auction, bid.finalprice, false, address(0), false, new uint256[](0));
}
bid.minted = true;
bid.refunded = true;
} else if (bid.winner == false && bid.refunded == false) {
(bool success, ) = bidder.call{value: bid.amount}('');
require(success, 'Failed to send refund to loser.');
bid.refunded = true;
}
}
}
function revealMetadata(string memory _newBaseURI) external onlyOwner {
nft.setBaseURIMinter(_newBaseURI);
emit MetadataRevealed();
}
function setAuctionSettled() external onlyOwner {
require(auctionSettled == false, 'Auction already settled');
auctionSettled = !auctionSettled;
_withdraw();
emit AuctionSettled();
}
function setTimes(uint256 allowListStart, uint256 _duration) public onlyOwner {
oasisListStartDateTime = allowListStart + 90;
allowListStartDateTime = allowListStart + 90;
allowListEndDateTime = allowListStartDateTime + _duration;
auctionStartDateTime = allowListEndDateTime;
auctionEndDateTime = auctionStartDateTime + _duration;
}
function setAllowListPrice(uint256 _allowListPrice) public onlyOwner {
allowListPrice = _allowListPrice;
}
function setAllowlistSigner(address _signer) public onlyAdmin {
allowlistSigner = _signer;
}
function set721ContractAddress(WildNFT _nft) public onlyAdmin {
nft = _nft;
}
function setAllowlistSupply(uint256 _allowlistSupply) public onlyAdmin {
allowlistSupply = _allowlistSupply;
}
function setAuctionSupply(uint256 _newAuctionSupply) public onlyAdmin {
auctionSupply = _newAuctionSupply;
}
function setPromoSupply(uint256 _newPromoSupply) public onlyAdmin {
promoSupply = _newPromoSupply;
}
function addToAllowList(address[] memory _addresses, uint8 _state) public onlyAdmin {
for (uint256 i = 0; i < _addresses.length; i++) {
address _address = _addresses[i];
allowList[_address] = _state;
emit AddedToAllowList(_address, _state);
}
}
function removeFromAllowList(address[] memory _addresses) public onlyAdmin {
for (uint256 i = 0; i < _addresses.length; i++) {
address _address = _addresses[i];
allowList[_address] = 0;
emit RemovedFromAllowList(_address);
}
}
function setPublicSaleMintMax(uint256 _newPublicSaleMintMax) public onlyAdmin {
publicSaleMintMax = _newPublicSaleMintMax;
}
function setAllowlistMintMax(uint256 _newAllowlistMintMax) public onlyAdmin {
allowlistMintMax = _newAllowlistMintMax;
}
function setOasislistStartDateTime(uint256 _newOasislistStartDateTime) public onlyAdmin {
oasisListStartDateTime = _newOasislistStartDateTime;
}
function setAuctionStartDateTime(uint256 _newAuctionStartDateTime) public onlyAdmin {
auctionStartDateTime = _newAuctionStartDateTime;
}
function setAuctionEndDateTime(uint256 _newAuctionEndDateTime) public onlyAdmin {
auctionEndDateTime = _newAuctionEndDateTime;
}
function setAllowListStartDateTime(uint256 _newAllowListStartDateTime) public onlyAdmin {
allowListStartDateTime = _newAllowListStartDateTime;
}
function setAllowListEndDateTime(uint256 _newAllowListEndDateTime) public onlyAdmin {
allowListEndDateTime = _newAllowListEndDateTime;
}
function setPublicSale() public onlyAdmin {
publicSale = !publicSale;
}
function setRaffleSupply(uint256 _newRaffleSupply) public onlyAdmin {
raffleSupply = _newRaffleSupply;
}
function setMaxSupply(uint256 _newMaxSupply) public onlyAdmin {
maxSupply = _newMaxSupply;
}
function setTimeBuffer(uint256 _timeBuffer) external override onlyAdmin {
timeBuffer = _timeBuffer;
emit AuctionTimeBufferUpdated(_timeBuffer);
}
function setMinimumBid(uint256 _minimumBid) external onlyAdmin {
minimumBid = _minimumBid;
emit AuctionMinimumBidUpdated(_minimumBid);
}
function setOasisPrice(uint256 _oasisPrice) external onlyAdmin {
oasisPrice = _oasisPrice;
}
function setPublicPrice(uint256 _publicPrice) external onlyAdmin {
publicPrice = _publicPrice;
}
function setUseOasisPriceForPublicSale(bool _useOasisPriceForPublicSale) external onlyAdmin {
useOasisPriceForPublicSale = _useOasisPriceForPublicSale;
}
function setMinBidIncrement(uint256 _minBidIncrement) external onlyAdmin {
minBidIncrement = _minBidIncrement;
emit AuctionMinBidIncrementUpdated(_minBidIncrement);
}
function setDuration(uint256 _duration) external override onlyAdmin {
duration = _duration;
emit AuctionDurationUpdated(_duration);
}
function allowlistMint(uint256 _qty, bytes memory _signature) external payable onlyUnsanctioned(msg.sender) {
_allowlistMint(_qty, msg.sender, _signature);
}
function allowlistMintDelegated(uint256 _qty, address _vault) external payable onlyUnsanctioned(msg.sender) {
require(IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B).checkDelegateForContract(msg.sender, _vault, address(oasis)));
_allowlistMint(_qty, _vault, '');
}
function verifySignature(address _address, bytes memory _signature) public view returns (bool valid) {
if (_signature.length == 65) {
bytes32 addressHash = keccak256(abi.encodePacked(_address, address(this)));
bytes32 message = ECDSA.toEthSignedMessageHash(addressHash);
address signerAddress = ECDSA.recover(message, _signature);
return (signerAddress != address(0) && signerAddress == allowlistSigner);
} else {
return false;
}
}
function checkAllowlist(address _address, bytes memory _signature) public view returns (uint8 group, uint256 tokens) {
uint256 oasisBalance = oasis.balanceOf(_address);
if (oasisBalance > 0) {
return (1, _oasisListQuantity(_address));
}
bool isValid = verifySignature(_address, _signature);
if (isValid) {
return (2, allowlistMintMax - allowListMinted[_address]);
}
return (0, 0);
}
function _oasisListQuantity(address _address) internal view returns (uint256) {
uint256 oasisCount = oasis.balanceOf(_address);
uint256 quantity = 0;
for (uint256 i = 0; i < oasisCount; i++) {
uint256 tokenId = oasis.tokenOfOwnerByIndex(_address, i);
quantity += allowlistMintMax - oasisPassMints[tokenId];
}
return quantity;
}
function _allowlistMint(uint256 _qty, address requester, bytes memory _signature) internal {
require(allowlistSupply - _qty >= 0, 'No more allowlist supply');
uint256 msgValue = msg.value;
address receiver = msg.sender;
(uint group, uint256 allowance) = checkAllowlist(requester, _signature);
require(group > 0, 'Not allowed');
require(_qty <= allowance, 'Qty exceeds max allowed.');
require((maxSupply - nft.totalSupply() - _qty) >= raffleSupply, 'Not enough supply remaining for raffle');
if (group == 1 && block.timestamp <= allowListStartDateTime) {
require(msgValue >= oasisPrice * _qty, 'Oasis allowlist minting: Not enough ETH sent');
require(block.timestamp >= oasisListStartDateTime && block.timestamp <= allowListStartDateTime, 'Outside Oasis allowlist window');
uint256 oasisCount = oasis.balanceOf(requester);
uint256 mintsLeft = _qty;
uint256[] memory tokenIds = new uint256[](_qty);
uint256[] memory oasisIds = new uint256[](_qty);
for (uint256 i = 0; i < oasisCount; i++) {
uint256 oasisId = oasis.tokenOfOwnerByIndex(requester, i);
uint256 tokenAllowance = allowlistMintMax - oasisPassMints[oasisId];
if (tokenAllowance == 0) {
continue;
}
uint8 quantityMintedWithOasis = uint8(Math.min(tokenAllowance, mintsLeft));
oasisPassMints[oasisId] += quantityMintedWithOasis;
mintsLeft -= quantityMintedWithOasis;
for (uint256 j = 0; j < quantityMintedWithOasis; j++) {
uint256 tokenId = nft.mint(receiver);
tokenIds[j] = tokenId;
oasisIds[j] = oasisId;
allowlistSupply--;
}
}
require(mintsLeft == 0, 'Not enough Oasis mint available');
_emitAllowListTokenMint(requester, receiver, tokenIds, msgValue, true, oasisIds);
} else {
require(msgValue >= allowListPrice * _qty, 'Public allowlist minting: Not enough ETH sent');
require(block.timestamp >= allowListStartDateTime && block.timestamp <= allowListEndDateTime, 'Outside allowlist window');
uint256[] memory tokenIds = new uint256[](_qty);
for (uint256 i = 0; i < _qty; i++) {
uint256 tokenId = nft.mint(receiver);
tokenIds[i] = tokenId;
allowlistSupply--;
}
_emitAllowListTokenMint(requester, receiver, tokenIds, msgValue, false, new uint256[](0));
allowListMinted[requester] += _qty;
}
auctionSupply = maxSupply - nft.totalSupply() - raffleSupply;
}
function _emitAllowListTokenMint(address requester, address receiver, uint256[] memory tokenIds, uint256 pricePaid, bool oasisUsed, uint256[] memory oasisIds) internal {
if (requester != receiver) {
emit TokenMint(receiver, tokenIds, MintType.Allowlist, pricePaid, true, requester, oasisUsed, oasisIds);
} else {
emit TokenMint(receiver, tokenIds, MintType.Allowlist, pricePaid, false, address(0), oasisUsed, oasisIds);
}
}
function _safeTransferETH(address to, uint256 value) internal returns (bool) {
(bool success, ) = to.call{value: value, gas: 30_000}(new bytes(0));
return success;
}
function getAuctionInfo() public view returns (uint256 _auctionSupply, uint256 _auctionStartDateTime, uint256 _auctionEndDateTime, uint256 _auctionExtentedTime, bool _auctionWinnersSet, bool _auctionSettled, bool _settled, uint256 _timeBuffer, uint256 _duration, uint256 _minimumBid, uint256 _minBidIncrement) {
return (auctionSupply, auctionStartDateTime, auctionEndDateTime, auctionExtentedTime, auctionWinnersSet, auctionSettled, settled, timeBuffer, duration, minimumBid, minBidIncrement);
}
function getAllowlistAndRaffleInfo()
public
view
returns (uint256 _raffleSupply, uint256 _allowListPrice, uint256 _allowListStartDateTime, uint256 _allowListEndDateTime, bool _raffleWinnersSet, bool _publicSale, uint256 _allowlistSupply, uint256 _totalMinted, uint256 _oasislistStartDateTime, uint256 _allowlistMintMax, uint256 _oasisPrice, uint256 _publicPrice, bool _useOasisPriceForPublicSale, uint256 _publicSaleMintMax)
{
return (raffleSupply, allowListPrice, allowListStartDateTime, allowListEndDateTime, raffleWinnersSet, publicSale, allowlistSupply, nft.totalSupply(), oasisListStartDateTime, allowlistMintMax, oasisPrice, publicPrice, useOasisPriceForPublicSale, publicSaleMintMax);
}
function createBid() external payable nonReentrant onlyUnpaused onlyUnsanctioned(msg.sender) {
address bidder = msg.sender;
uint256 bidAmount = msg.value;
require(block.timestamp < auctionEndDateTime && block.timestamp >= auctionStartDateTime, 'Outside auction window.');
require(bidAmount >= minimumBid, 'Bid amount too low.');
if (Bids[bidder].amount > 0) {
Bid storage existingBid = Bids[bidder];
require(bidAmount > existingBid.amount, 'You can only increase your bid, not decrease.');
_safeTransferETH(payable(bidder), existingBid.amount);
existingBid.amount = bidAmount;
} else {
Bid memory new_bid;
new_bid.bidder = payable(bidder);
new_bid.amount = bidAmount;
new_bid.timestamp = block.timestamp;
new_bid.winner = false;
new_bid.refunded = false;
new_bid.minted = false;
new_bid.finalprice = 0;
Bids[bidder] = new_bid;
}
emit AuctionBid(bidder, bidAmount, false);
}
function publicSaleMint() public payable nonReentrant onlyUnpaused onlyUnsanctioned(msg.sender) {
require(nft.totalSupply() < nft.maxSupply(), 'No more tokens available.');
require(publicSale == true, 'Not authorized.');
address receiver = msg.sender;
uint256 msgValue = msg.value;
if (useOasisPriceForPublicSale) {
uint256 oasisBalance = oasis.balanceOf(receiver);
if (oasisBalance > 0) {
require(msg.value >= oasisPrice, 'Oasis price: Amount too low.');
} else {
require(msg.value >= publicPrice, 'Public price: Amount too low.');
}
} else {
require(msg.value >= publicPrice, 'Amount too low.');
}
uint256 tokenId = nft.mint(receiver);
uint256[] memory tokenIds = new uint256[](1);
tokenIds[0] = tokenId;
emit TokenMint(receiver, tokenIds, MintType.PublicSale, msgValue, false, address(0), false, new uint256[](0));
}
function publicSaleMintMultiple(uint256 _qty) public payable nonReentrant onlyUnpaused onlyUnsanctioned(msg.sender) {
uint256 _maxSupply = nft.maxSupply();
uint256 _totalSupply = nft.totalSupply();
require(_qty <= publicSaleMintMax, 'Too many tokens requested.');
require(_totalSupply < _maxSupply, 'No more tokens available.');
require((_maxSupply - _totalSupply) >= _qty, 'Not enough supply left - 1.');
require(publicSale == true, 'Not authorized.');
address receiver = msg.sender;
uint256 msgValue = msg.value;
bool usedOasisPrice = false;
if (useOasisPriceForPublicSale) {
uint256 oasisBalance = oasis.balanceOf(receiver);
if (oasisBalance > 0) {
require(msg.value >= (oasisPrice * _qty), 'Oasis price: Amount too low.');
usedOasisPrice = true;
} else {
require(msg.value >= (publicPrice * _qty), 'Public price: Amount too low.');
}
} else {
require(msgValue >= (publicPrice * _qty), 'Amount too low.');
}
uint256[] memory tokenIds = new uint256[](_qty);
for (uint256 i = 0; i < _qty; i++) {
uint256 tokenId = nft.mint(receiver);
tokenIds[i] = tokenId;
}
emit TokenMint(receiver, tokenIds, MintType.PublicSale, msgValue, false, address(0), usedOasisPrice, new uint256[](0));
}
function promoMint(address _to, uint256 _qty, MintType mintType) external onlyAdmin {
require(promoSupply >= _qty, 'Not enough promo supply');
require(block.timestamp <= allowListStartDateTime, 'Outside promo mint window');
require((maxSupply - nft.totalSupply() - _qty) >= raffleSupply, 'Not enough supply remaining for raffle');
uint256[] memory tokenIds = new uint256[](_qty);
for (uint256 i = 0; i < _qty; i++) {
uint256 tokenId = nft.mint(_to);
tokenIds[i] = tokenId;
}
emit TokenMint(_to, tokenIds, mintType, 0, false, address(0), false, new uint256[](0));
promoSupply -= _qty;
auctionSupply = maxSupply - nft.totalSupply() - raffleSupply;
}
function promoMintBatch(address[] memory _to, uint256[] memory _amounts, MintType mintType) external onlyAdmin {
uint256 numAddresses = _to.length;
require(_to.length == _amounts.length, '_to and _amounts array lengths must match');
require(promoSupply >= numAddresses, 'Not enough promo supply');
require(block.timestamp <= allowListStartDateTime, 'Outside promo mint window');
require((maxSupply - nft.totalSupply() - numAddresses) >= raffleSupply, 'Not enough supply remaining for raffle');
for (uint256 i = 0; i < _to.length; i++) {
address to = _to[i];
uint256 amount = _amounts[i];
uint256[] memory tokenIds = new uint256[](amount);
for (uint256 j = 0; j < amount; j++) {
uint256 tokenId = nft.mint(to);
tokenIds[j] = tokenId;
}
emit TokenMint(to, tokenIds, mintType, 0, false, address(0), false, new uint256[](0));
promoSupply -= amount;
}
auctionSupply = maxSupply - nft.totalSupply() - raffleSupply;
}
}
文件 3 的 29:Base64.sol
pragma solidity ^0.8.0;
library Base64 {
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function encode(bytes memory data) internal pure returns (string memory) {
if (data.length == 0) return "";
string memory table = _TABLE;
string memory result = new string(4 * ((data.length + 2) / 3));
assembly {
let tablePtr := add(table, 1)
let resultPtr := add(result, 32)
for {
let dataPtr := data
let endPtr := add(data, mload(data))
} lt(dataPtr, endPtr) {
} {
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
resultPtr := add(resultPtr, 1)
mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
resultPtr := add(resultPtr, 1)
mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
resultPtr := add(resultPtr, 1)
mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
resultPtr := add(resultPtr, 1)
}
switch mod(mload(data), 3)
case 1 {
mstore8(sub(resultPtr, 1), 0x3d)
mstore8(sub(resultPtr, 2), 0x3d)
}
case 2 {
mstore8(sub(resultPtr, 1), 0x3d)
}
}
return result;
}
}
文件 4 的 29:Constants.sol
pragma solidity ^0.8.13;
address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0xB69c34f580d74396Daeb327D35B4fb4677353Fa9;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
文件 5 的 29:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 6 的 29:ECDSA.sol
pragma solidity ^0.8.0;
import "../Strings.sol";
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return;
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
文件 7 的 29:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 8 的 29:ERC2981.sol
pragma solidity ^0.8.0;
import "../../interfaces/IERC2981.sol";
import "../../utils/introspection/ERC165.sol";
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];
if (royalty.receiver == address(0)) {
royalty = _defaultRoyaltyInfo;
}
uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: invalid receiver");
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
function _setTokenRoyalty(
uint256 tokenId,
address receiver,
uint96 feeNumerator
) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: Invalid parameters");
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}
文件 9 的 29:ERC721.sol
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
string private _name;
string private _symbol;
mapping(uint256 => address) private _owners;
mapping(address => uint256) private _balances;
mapping(uint256 => address) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
function _baseURI() internal view virtual returns (string memory) {
return "";
}
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
owner = ERC721.ownerOf(tokenId);
delete _tokenApprovals[tokenId];
unchecked {
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
delete _tokenApprovals[tokenId];
unchecked {
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
function __unsafe_increaseBalance(address account, uint256 amount) internal {
_balances[account] += amount;
}
}
文件 10 的 29:IAuctionHouse.sol
pragma solidity ^0.8.6;
interface IAuctionHouse {
enum MintType {
Promo,
Allowlist,
Auction,
Raffle,
PublicSale,
CreditCard,
WildPass
}
event TokenMint(address indexed to, uint256[] tokenIds, MintType indexed mintType, uint256 amountPaid, bool isDelegated, address delegatedVault, bool oasisUsed, uint256[] oasisIds);
event MetadataRevealed();
event AddedToAllowList(address indexed addedAddress, uint8 indexed state);
event RemovedFromAllowList(address indexed removedAddress);
event AuctionBid(address sender, uint256 value, bool extended);
event AuctionSettled();
event AuctionTimeBufferUpdated(uint256 timeBuffer);
event AuctionMinimumBidUpdated(uint256 minimumBid);
event AuctionMinBidIncrementUpdated(uint256 minBidIncrementPercentage);
event AuctionDurationUpdated(uint256 duration);
function setAuctionWinners(address[] memory _auctionWinners, uint256[] memory _price) external;
function setTimes(uint256 _startTime, uint256 _duration) external;
function createBid() external payable;
function pause() external;
function unpause() external;
function setTimeBuffer(uint256 timeBuffer) external;
function setDuration(uint256 _duration) external;
}
文件 11 的 29:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 12 的 29: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);
}
文件 13 的 29:IERC2981.sol
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
interface IERC2981 is IERC165 {
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
文件 14 的 29:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool _approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 15 的 29:IERC721Metadata.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Metadata is IERC721 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
}
文件 16 的 29:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 17 的 29:IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}
文件 18 的 29:Math.sol
pragma solidity ^0.8.0;
library Math {
enum Rounding {
Down,
Up,
Zero
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
uint256 prod0;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
require(denominator > prod1);
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (~denominator + 1);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
文件 19 的 29:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 20 的 29:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 21 的 29:PaymentSplitter.sol
pragma solidity ^0.8.0;
import "../token/ERC20/utils/SafeERC20.sol";
import "../utils/Address.sol";
import "../utils/Context.sol";
contract PaymentSplitter is Context {
event PayeeAdded(address account, uint256 shares);
event PaymentReleased(address to, uint256 amount);
event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
event PaymentReceived(address from, uint256 amount);
uint256 private _totalShares;
uint256 private _totalReleased;
mapping(address => uint256) private _shares;
mapping(address => uint256) private _released;
address[] private _payees;
mapping(IERC20 => uint256) private _erc20TotalReleased;
mapping(IERC20 => mapping(address => uint256)) private _erc20Released;
constructor(address[] memory payees, uint256[] memory shares_) payable {
require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
require(payees.length > 0, "PaymentSplitter: no payees");
for (uint256 i = 0; i < payees.length; i++) {
_addPayee(payees[i], shares_[i]);
}
}
receive() external payable virtual {
emit PaymentReceived(_msgSender(), msg.value);
}
function totalShares() public view returns (uint256) {
return _totalShares;
}
function totalReleased() public view returns (uint256) {
return _totalReleased;
}
function totalReleased(IERC20 token) public view returns (uint256) {
return _erc20TotalReleased[token];
}
function shares(address account) public view returns (uint256) {
return _shares[account];
}
function released(address account) public view returns (uint256) {
return _released[account];
}
function released(IERC20 token, address account) public view returns (uint256) {
return _erc20Released[token][account];
}
function payee(uint256 index) public view returns (address) {
return _payees[index];
}
function releasable(address account) public view returns (uint256) {
uint256 totalReceived = address(this).balance + totalReleased();
return _pendingPayment(account, totalReceived, released(account));
}
function releasable(IERC20 token, address account) public view returns (uint256) {
uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
return _pendingPayment(account, totalReceived, released(token, account));
}
function release(address payable account) public virtual {
require(_shares[account] > 0, "PaymentSplitter: account has no shares");
uint256 payment = releasable(account);
require(payment != 0, "PaymentSplitter: account is not due payment");
_totalReleased += payment;
unchecked {
_released[account] += payment;
}
Address.sendValue(account, payment);
emit PaymentReleased(account, payment);
}
function release(IERC20 token, address account) public virtual {
require(_shares[account] > 0, "PaymentSplitter: account has no shares");
uint256 payment = releasable(token, account);
require(payment != 0, "PaymentSplitter: account is not due payment");
_erc20TotalReleased[token] += payment;
unchecked {
_erc20Released[token][account] += payment;
}
SafeERC20.safeTransfer(token, account, payment);
emit ERC20PaymentReleased(token, account, payment);
}
function _pendingPayment(
address account,
uint256 totalReceived,
uint256 alreadyReleased
) private view returns (uint256) {
return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
}
function _addPayee(address account, uint256 shares_) private {
require(account != address(0), "PaymentSplitter: account is the zero address");
require(shares_ > 0, "PaymentSplitter: shares are 0");
require(_shares[account] == 0, "PaymentSplitter: account already has shares");
_payees.push(account);
_shares[account] = shares_;
_totalShares = _totalShares + shares_;
emit PayeeAdded(account, shares_);
}
}
文件 22 的 29: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() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 23 的 29:RevokableDefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
import {RevokableOperatorFilterer} from './RevokableOperatorFilterer.sol';
import {CANONICAL_CORI_SUBSCRIPTION, CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from './Constants.sol';
abstract contract RevokableDefaultOperatorFilterer is RevokableOperatorFilterer {
constructor() RevokableOperatorFilterer(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS, CANONICAL_CORI_SUBSCRIPTION, true) {}
}
文件 24 的 29:RevokableOperatorFilterer.sol
pragma solidity ^0.8.13;
import {UpdatableOperatorFilterer} from './UpdatableOperatorFilterer.sol';
import {IOperatorFilterRegistry} from './IOperatorFilterRegistry.sol';
abstract contract RevokableOperatorFilterer is UpdatableOperatorFilterer {
error RegistryHasBeenRevoked();
error InitialRegistryAddressCannotBeZeroAddress();
event OperatorFilterRegistryRevoked();
bool public isOperatorFilterRegistryRevoked;
constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) UpdatableOperatorFilterer(_registry, subscriptionOrRegistrantToCopy, subscribe) {
if (_registry == address(0)) {
revert InitialRegistryAddressCannotBeZeroAddress();
}
}
function updateOperatorFilterRegistryAddress(address newRegistry) public override {
if (msg.sender != owner()) {
revert OnlyOwner();
}
if (isOperatorFilterRegistryRevoked) {
revert RegistryHasBeenRevoked();
}
operatorFilterRegistry = IOperatorFilterRegistry(newRegistry);
emit OperatorFilterRegistryAddressUpdated(newRegistry);
}
function revokeOperatorFilterRegistry() public {
if (msg.sender != owner()) {
revert OnlyOwner();
}
if (isOperatorFilterRegistryRevoked) {
revert RegistryHasBeenRevoked();
}
operatorFilterRegistry = IOperatorFilterRegistry(address(0));
isOperatorFilterRegistryRevoked = true;
emit OperatorFilterRegistryRevoked();
}
}
文件 25 的 29:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 26 的 29:Strings.sol
pragma solidity ^0.8.0;
import "./math/Math.sol";
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
文件 27 的 29:UpdatableOperatorFilterer.sol
pragma solidity ^0.8.13;
import {IOperatorFilterRegistry} from './IOperatorFilterRegistry.sol';
abstract contract UpdatableOperatorFilterer {
error OperatorNotAllowed(address operator);
error OnlyOwner();
event OperatorFilterRegistryAddressUpdated(address newRegistry);
IOperatorFilterRegistry public operatorFilterRegistry;
constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) {
IOperatorFilterRegistry registry = IOperatorFilterRegistry(_registry);
operatorFilterRegistry = registry;
if (address(registry).code.length > 0) {
if (subscribe) {
registry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
registry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
registry.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
function updateOperatorFilterRegistryAddress(address newRegistry) public virtual {
if (msg.sender != owner()) {
revert OnlyOwner();
}
operatorFilterRegistry = IOperatorFilterRegistry(newRegistry);
emit OperatorFilterRegistryAddressUpdated(newRegistry);
}
function owner() public view virtual returns (address);
function _checkFilterOperator(address operator) internal view virtual {
IOperatorFilterRegistry registry = operatorFilterRegistry;
if (address(registry) != address(0) && address(registry).code.length > 0) {
if (!registry.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}
文件 28 的 29:WildNFT.sol
pragma solidity ^0.8.6;
import {UpdatableOperatorFilterer} from '../../utils/operator-filter-registry/UpdatableOperatorFilterer.sol';
import {RevokableDefaultOperatorFilterer} from '../../utils/operator-filter-registry/RevokableDefaultOperatorFilterer.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Strings} from '@openzeppelin/contracts/utils/Strings.sol';
import {Base64} from '@openzeppelin/contracts/utils/Base64.sol';
import {Math} from '@openzeppelin/contracts/utils/math/Math.sol';
import {IERC721} from '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import {ERC721} from '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import {ERC2981} from '@openzeppelin/contracts/token/common/ERC2981.sol';
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {PaymentSplitter} from '@openzeppelin/contracts/finance/PaymentSplitter.sol';
import {WildNFT} from './WildNFT.sol';
interface IWildNFT is IERC721 {
event TokenCreated(uint256 indexed tokenId, address mintedTo);
event TokenBurned(uint256 indexed tokenId);
event MetadataUpdate(uint256 _tokenId);
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
function mint(address _to) external returns (uint256);
function burn(uint256 tokenId) external;
function setMinter(address minter) external;
function setBaseURI(string memory _newBaseURI) external;
function totalSupply() external view returns (uint256);
function maxSupply() external view returns (uint256);
}
abstract contract WildNFT is IWildNFT, Ownable, RevokableDefaultOperatorFilterer, ERC721, ERC2981, PaymentSplitter {
address public minter;
mapping(address => bool) public authorized;
mapping(address => bool) public blockList;
uint256 public _currentTokenId;
uint256 public maxSupply;
string public baseURI;
constructor(string memory name_, string memory symbol_, address _minter, uint256 _maxSupply, string memory _baseURI, address[] memory _payees, uint256[] memory _shares, uint96 _feeNumerator) PaymentSplitter(_payees, _shares) ERC721(name_, symbol_) {
minter = _minter;
maxSupply = _maxSupply;
baseURI = _baseURI;
_setDefaultRoyalty(address(this), _feeNumerator);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
modifier onlyMinter() {
require(msg.sender == minter, 'Sender is not the minter');
_;
}
function updateDenyList(address flaggedOperator, bool status) public onlyOwner {
_updateDenyList(flaggedOperator, status);
}
function isApprovedForAll(address _owner, address operator) public view override(IERC721, ERC721) returns (bool) {
require(blockList[operator] == false, 'Operator has been denied by contract owner.');
if (authorized[operator] == true) {
return true;
}
return super.isApprovedForAll(_owner, operator);
}
function setApprovalForAll(address operator, bool approved) public override(IERC721, ERC721) onlyAllowedOperatorApproval(operator) {
super.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperatorApproval(operator) {
super.approve(operator, tokenId);
}
function transferFrom(address from, address to, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(IERC721, ERC721) onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId, data);
}
function owner() public view virtual override(Ownable, UpdatableOperatorFilterer) returns (address) {
return Ownable.owner();
}
function setAuthorized(address operator, bool approved) public onlyOwner {
authorized[operator] = approved;
}
function setMinter(address _minter) external onlyOwner {
minter = _minter;
}
function _updateDenyList(address flaggedOperator, bool status) internal virtual {
blockList[flaggedOperator] = status;
}
function mint(address _to) public override onlyMinter returns (uint256) {
require(_currentTokenId < maxSupply, 'Max supply reached');
return _mintTo(_to, _currentTokenId++);
}
function burn(uint256 tokenId) public override onlyMinter {
_burn(tokenId);
emit TokenBurned(tokenId);
}
function setBaseURI(string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
emit BatchMetadataUpdate(0, maxSupply - 1);
}
function setBaseURIMinter(string memory _newBaseURI) public onlyMinter {
baseURI = _newBaseURI;
emit BatchMetadataUpdate(0, maxSupply - 1);
}
function _mintTo(address to, uint256 tokenId) internal returns (uint256) {
_mint(to, tokenId);
emit TokenCreated(tokenId, to);
return tokenId;
}
function totalSupply() public view returns (uint256) {
return _currentTokenId;
}
}
文件 29 的 29:draft-IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
{
"compilationTarget": {
"contracts/artist/common/AuctionHouse.sol": "AuctionHouse"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract WildNFT","name":"_nft","type":"address"},{"internalType":"address","name":"_payee","type":"address"},{"internalType":"address","name":"_oasis","type":"address"},{"internalType":"address","name":"_sanctions","type":"address"},{"internalType":"address","name":"_allowlistSigner","type":"address"},{"internalType":"address","name":"_wildPayee","type":"address"},{"internalType":"uint256","name":"_wildPrimaryRoyalty","type":"uint256"},{"internalType":"uint256","name":"_primaryFeeNumerator","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addedAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"state","type":"uint8"}],"name":"AddedToAllowList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"extended","type":"bool"}],"name":"AuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"AuctionDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBidIncrementPercentage","type":"uint256"}],"name":"AuctionMinBidIncrementUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minimumBid","type":"uint256"}],"name":"AuctionMinimumBidUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"AuctionSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timeBuffer","type":"uint256"}],"name":"AuctionTimeBufferUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"MetadataRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"removedAddress","type":"address"}],"name":"RemovedFromAllowList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":true,"internalType":"enum IAuctionHouse.MintType","name":"mintType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDelegated","type":"bool"},{"indexed":false,"internalType":"address","name":"delegatedVault","type":"address"},{"indexed":false,"internalType":"bool","name":"oasisUsed","type":"bool"},{"indexed":false,"internalType":"uint256[]","name":"oasisIds","type":"uint256[]"}],"name":"TokenMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Bids","outputs":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"minted","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"refunded","type":"bool"},{"internalType":"bool","name":"winner","type":"bool"},{"internalType":"uint256","name":"finalprice","type":"uint256"},{"internalType":"bool","name":"rafflewinner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint8","name":"_state","type":"uint8"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowList","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListEndDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListStartDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"address","name":"_vault","type":"address"}],"name":"allowlistMintDelegated","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowlistMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionEndDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionExtentedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionSettled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionStartDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionWinnersSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"checkAllowlist","outputs":[{"internalType":"uint8","name":"group","type":"uint8"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowlistAndRaffleInfo","outputs":[{"internalType":"uint256","name":"_raffleSupply","type":"uint256"},{"internalType":"uint256","name":"_allowListPrice","type":"uint256"},{"internalType":"uint256","name":"_allowListStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_allowListEndDateTime","type":"uint256"},{"internalType":"bool","name":"_raffleWinnersSet","type":"bool"},{"internalType":"bool","name":"_publicSale","type":"bool"},{"internalType":"uint256","name":"_allowlistSupply","type":"uint256"},{"internalType":"uint256","name":"_totalMinted","type":"uint256"},{"internalType":"uint256","name":"_oasislistStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_allowlistMintMax","type":"uint256"},{"internalType":"uint256","name":"_oasisPrice","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"bool","name":"_useOasisPriceForPublicSale","type":"bool"},{"internalType":"uint256","name":"_publicSaleMintMax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuctionInfo","outputs":[{"internalType":"uint256","name":"_auctionSupply","type":"uint256"},{"internalType":"uint256","name":"_auctionStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_auctionEndDateTime","type":"uint256"},{"internalType":"uint256","name":"_auctionExtentedTime","type":"uint256"},{"internalType":"bool","name":"_auctionWinnersSet","type":"bool"},{"internalType":"bool","name":"_auctionSettled","type":"bool"},{"internalType":"bool","name":"_settled","type":"bool"},{"internalType":"uint256","name":"_timeBuffer","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_minimumBid","type":"uint256"},{"internalType":"uint256","name":"_minBidIncrement","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBidIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract WildNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oasis","outputs":[{"internalType":"contract IOasis","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oasisListStartDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oasisPassMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oasisPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payee","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"enum IAuctionHouse.MintType","name":"mintType","type":"uint8"}],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"enum IAuctionHouse.MintType","name":"mintType","type":"uint8"}],"name":"promoMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"promoSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"publicSaleMintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"raffleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleWinnersSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"revealMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sanctionsList","outputs":[{"internalType":"contract SanctionsList","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract WildNFT","name":"_nft","type":"address"}],"name":"set721ContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowListEndDateTime","type":"uint256"}],"name":"setAllowListEndDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowListPrice","type":"uint256"}],"name":"setAllowListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowListStartDateTime","type":"uint256"}],"name":"setAllowListStartDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowlistMintMax","type":"uint256"}],"name":"setAllowlistMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setAllowlistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowlistSupply","type":"uint256"}],"name":"setAllowlistSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAuctionEndDateTime","type":"uint256"}],"name":"setAuctionEndDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAuctionSettled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAuctionStartDateTime","type":"uint256"}],"name":"setAuctionStartDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAuctionSupply","type":"uint256"}],"name":"setAuctionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_auctionWinners","type":"address[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"}],"name":"setAuctionWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBidIncrement","type":"uint256"}],"name":"setMinBidIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumBid","type":"uint256"}],"name":"setMinimumBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oasisPrice","type":"uint256"}],"name":"setOasisPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newOasislistStartDateTime","type":"uint256"}],"name":"setOasislistStartDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payee","type":"address"}],"name":"setPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_primaryFeeNumerator","type":"uint256"}],"name":"setPrimaryFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPromoSupply","type":"uint256"}],"name":"setPromoSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPublicSaleMintMax","type":"uint256"}],"name":"setPublicSaleMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRaffleSupply","type":"uint256"}],"name":"setRaffleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_raffleWinners","type":"address[]"}],"name":"setRaffleWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeBuffer","type":"uint256"}],"name":"setTimeBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"allowListStart","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useOasisPriceForPublicSale","type":"bool"}],"name":"setUseOasisPriceForPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowlistMintMax","type":"uint256"},{"internalType":"uint256","name":"_timeBuffer","type":"uint256"},{"internalType":"uint256","name":"_minimumBid","type":"uint256"},{"internalType":"uint256","name":"_minBidIncrement","type":"uint256"},{"internalType":"uint256","name":"_allowListPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_publicSaleMintMax","type":"uint256"},{"internalType":"uint256","name":"_oasisPrice","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"bool","name":"_useOasisPriceForPublicSale","type":"bool"}],"name":"setVariablesBatch1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleSupply","type":"uint256"},{"internalType":"uint256","name":"_auctionSupply","type":"uint256"},{"internalType":"uint256","name":"_allowlistSupply","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_promoSupply","type":"uint256"},{"internalType":"uint256","name":"_oasisListStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_allowListStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_allowListEndDateTime","type":"uint256"},{"internalType":"uint256","name":"_auctionStartDateTime","type":"uint256"},{"internalType":"uint256","name":"_auctionEndDateTime","type":"uint256"}],"name":"setVariablesBatch2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_wildPayee","type":"address"}],"name":"setWildPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wildPrimaryRoyalty","type":"uint256"}],"name":"setWildPrimaryRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bidders","type":"address[]"}],"name":"settleBidder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skipToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useOasisPriceForPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wildPayee","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wildPrimaryRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]