编译器
0.8.21+commit.d9974bed
文件 1 的 12:AggregatorV3Interface.sol
pragma solidity ^0.8.0;
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(uint80 _roundId)
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}
文件 2 的 12: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;
}
}
文件 3 的 12:ERC721A.sol
pragma solidity ^0.8.4;
import './IERC721A.sol';
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
contract ERC721A is IERC721A {
struct TokenApprovalRef {
address value;
}
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
uint256 private constant _BITPOS_AUX = 192;
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
uint256 private constant _BITMASK_BURNED = 1 << 224;
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
uint256 private constant _BITPOS_EXTRA_DATA = 232;
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
uint256 private _currentIndex;
uint256 private _burnCounter;
string private _name;
string private _symbol;
mapping(uint256 => uint256) private _packedOwnerships;
mapping(address => uint256) private _packedAddressData;
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
function totalSupply() public view virtual override returns (uint256) {
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
function _totalMinted() internal view virtual returns (uint256) {
unchecked {
return _currentIndex - _startTokenId();
}
}
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
function _setAux(address owner, uint64 aux) internal virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0x80ac58cd ||
interfaceId == 0x5b5e139f;
}
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) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
function _baseURI() internal view virtual returns (string memory) {
return '';
}
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
if (packed & _BITMASK_BURNED == 0) {
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
owner := and(owner, _BITMASK_ADDRESS)
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
assembly {
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
function approve(address to, uint256 tokenId) public payable virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
function setApprovalForAll(address operator, bool approved) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex &&
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0;
}
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
owner := and(owner, _BITMASK_ADDRESS)
msgSender := and(msgSender, _BITMASK_ADDRESS)
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
function transferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
assembly {
if approvedAddress {
sstore(approvedAddressSlot, 0)
}
}
unchecked {
--_packedAddressData[from];
++_packedAddressData[to];
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
if (_packedOwnerships[nextTokenId] == 0) {
if (nextTokenId != _currentIndex) {
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
unchecked {
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
assembly {
toMasked := and(to, _BITMASK_ADDRESS)
log4(
0,
0,
_TRANSFER_EVENT_SIGNATURE,
0,
toMasked,
startTokenId
)
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
unchecked {
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
if (_currentIndex != end) revert();
}
}
}
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
assembly {
if approvedAddress {
sstore(approvedAddressSlot, 0)
}
}
unchecked {
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
if (_packedOwnerships[nextTokenId] == 0) {
if (nextTokenId != _currentIndex) {
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
unchecked {
_burnCounter++;
}
}
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
function _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
let m := add(mload(0x40), 0xa0)
mstore(0x40, m)
str := sub(m, 0x20)
mstore(str, 0)
let end := str
for { let temp := value } 1 {} {
str := sub(str, 1)
mstore8(str, add(48, mod(temp, 10)))
temp := div(temp, 10)
if iszero(temp) { break }
}
let length := sub(end, str)
str := sub(str, 0x20)
mstore(str, length)
}
}
}
文件 4 的 12:ERC721AQueryable.sol
pragma solidity ^0.8.4;
import './IERC721AQueryable.sol';
import '../ERC721A.sol';
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
TokenOwnership memory ownership;
if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
return ownership;
}
ownership = _ownershipAt(tokenId);
if (ownership.burned) {
return ownership;
}
return _ownershipOf(tokenId);
}
function explicitOwnershipsOf(uint256[] calldata tokenIds)
external
view
virtual
override
returns (TokenOwnership[] memory)
{
unchecked {
uint256 tokenIdsLength = tokenIds.length;
TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
for (uint256 i; i != tokenIdsLength; ++i) {
ownerships[i] = explicitOwnershipOf(tokenIds[i]);
}
return ownerships;
}
}
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view virtual override returns (uint256[] memory) {
unchecked {
if (start >= stop) revert InvalidQueryRange();
uint256 tokenIdsIdx;
uint256 stopLimit = _nextTokenId();
if (start < _startTokenId()) {
start = _startTokenId();
}
if (stop > stopLimit) {
stop = stopLimit;
}
uint256 tokenIdsMaxLength = balanceOf(owner);
if (start < stop) {
uint256 rangeLength = stop - start;
if (rangeLength < tokenIdsMaxLength) {
tokenIdsMaxLength = rangeLength;
}
} else {
tokenIdsMaxLength = 0;
}
uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
if (tokenIdsMaxLength == 0) {
return tokenIds;
}
TokenOwnership memory ownership = explicitOwnershipOf(start);
address currOwnershipAddr;
if (!ownership.burned) {
currOwnershipAddr = ownership.addr;
}
for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
assembly {
mstore(tokenIds, tokenIdsIdx)
}
return tokenIds;
}
}
function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
unchecked {
uint256 tokenIdsIdx;
address currOwnershipAddr;
uint256 tokenIdsLength = balanceOf(owner);
uint256[] memory tokenIds = new uint256[](tokenIdsLength);
TokenOwnership memory ownership;
for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
return tokenIds;
}
}
}
文件 5 的 12:HOSNftToken.sol
pragma solidity >=0.8.19 <0.9.0;
import "erc721a/contracts/extensions/ERC721AQueryable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import "./HOSWinnersSUB.sol";
contract HOSNftToken is HOSWinnersSUB, ERC721AQueryable {
using Strings for uint256;
AggregatorV3Interface internal priceFeed;
bool public lockedSeason = false;
bool public seasonEnded = false;
uint256 public entryFeeInUsd = 50;
string public uriPrefix = "";
string public uriSuffix = ".json";
uint256 public maxSupply;
uint256 public maxMintAmountPerTx;
bool public paused = true;
bool public lockedSupply = false;
string[] public keyRecords;
uint256 public keyRecordsLength = 0;
mapping(uint => uint) public seasonBalances;
mapping(address => uint256) public seasonOfHolder;
mapping(uint256 => address[]) public _seasonSnapshot;
mapping(uint256 => mapping(address => uint256[])) public _activeHolders;
mapping(uint256 => mapping(address => uint256[])) public _finalHolders;
mapping(uint256 => address[]) public _activeHoldersSeason;
mapping(uint256 => address[]) public _finalHoldersSeason;
mapping(uint256 => string) public seasonRecordsURI;
mapping(string => string) public officialURIs;
constructor(
string memory _tokenName,
string memory _tokenSymbol,
uint256 _maxSupply,
uint256 _maxMintAmountPerTx,
address _priceFeed
) ERC721A(_tokenName, _tokenSymbol) {
maxSupply = _maxSupply;
setMaxMintAmountPerTx(_maxMintAmountPerTx);
priceFeed = AggregatorV3Interface(_priceFeed);
}
event Received(address, uint);
event Minted(address indexed to, uint256 amount, uint256 totalSupply);
event MintedForAddress(
address indexed to,
uint256 amount,
uint256 totalSupply
);
event MaxSupplyChanged(uint256 oldMaxSupply, uint256 newMaxSupply);
event URIPrefixChanged(string oldPrefix, string newPrefix);
event URISuffixChanged(string oldSuffix, string newSuffix);
event PausedStateSet(bool isPaused);
event LockStateSet(bool isLocked);
event SeasonEndStateUpdate(bool state);
event SeasonChanged(uint256 oldSeason, uint256 newSeason);
event SeasonLockedStateSet(uint256 season, bool isLocked);
event PriceFeedChanged(address oldPriceFeed, address newPriceFeed);
event SeasonEntryFeeChanged(uint256 oldFee, uint256 newFee);
event SeasonFeePaid(address payer, uint256 season, uint256 fee);
event AddPlayerToSeason(address player, uint256 season);
event SetActiveSeasonSnapshot(uint256 season);
event SeasonEndActiveHoldersSnapshot(uint256 season);
event Withdraw();
event SetOwnerCommission(uint percentage);
event SetRecordSeasonURI(uint season, string uri);
event PlayerRemovedFromSeason(address player, uint season);
event PlayerAddedToSeason(address player, uint season);
receive() external payable {
emit Received(msg.sender, msg.value);
seasonBalances[currentSeason] += msg.value;
}
modifier mintCompliance(uint256 _mintAmount) {
require(
_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx,
"Invalid amount"
);
require(totalSupply() + _mintAmount <= maxSupply, "Max supply");
_;
}
modifier mintPriceCompliance(uint256 _mintAmount) {
uint256 mintPriceInEth = calculateEntryFeeInEth();
require(msg.value >= _mintAmount * mintPriceInEth, "Deficient funds");
_;
}
function mint(
uint256 _mintAmount
)
public
payable
mintCompliance(_mintAmount)
mintPriceCompliance(_mintAmount)
{
require(!paused, "Mint is paused");
require(!(isPlayerInSeason(_msgSender()) && lockedSeason), "locked");
uint256 adjust = lockedSeason ? 1 : 0;
uint256 actualSeason = currentSeason + adjust;
_safeMint(_msgSender(), _mintAmount);
seasonOfHolder[_msgSender()] = actualSeason;
bool found = false;
for (uint i = 0; i < _seasonSnapshot[actualSeason].length; i++) {
if (_seasonSnapshot[actualSeason][i] == _msgSender()) {
found = true;
break;
}
}
if (!found) {
_seasonSnapshot[actualSeason].push(_msgSender());
}
seasonBalances[actualSeason] += msg.value;
emit Minted(_msgSender(), _mintAmount, totalSupply());
}
function mintForAddress(
uint256 _mintAmount,
address _receiver
) public mintCompliance(_mintAmount) onlyOwner {
_safeMint(_receiver, _mintAmount);
emit MintedForAddress(_receiver, _mintAmount, totalSupply());
}
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
function tokenURI(
uint256 _tokenId
) public view virtual override(ERC721A, IERC721A) returns (string memory) {
require(_exists(_tokenId), "No token");
string memory currentBaseURI = _baseURI();
return
bytes(currentBaseURI).length > 0
? string(
abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)
)
: "";
}
function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
maxMintAmountPerTx = _maxMintAmountPerTx;
}
function setMaxSupply(uint256 _maxSupply) public onlyOwner {
require(!lockedSupply, "Supply locked");
maxSupply = _maxSupply;
emit MaxSupplyChanged(totalSupply(), _maxSupply);
}
function setUriPrefix(string memory _uriPrefix) public onlyOwner {
uriPrefix = _uriPrefix;
emit URIPrefixChanged(uriPrefix, _uriPrefix);
}
function setUriSuffix(string memory _uriSuffix) public onlyOwner {
uriSuffix = _uriSuffix;
emit URISuffixChanged(uriSuffix, _uriSuffix);
}
function setPaused(bool _state) public onlyOwner {
paused = _state;
emit PausedStateSet(paused);
}
function setLocked(bool _lock) public onlyOwner {
require(!lockedSupply, "Supply locked");
lockedSupply = _lock;
emit LockStateSet(lockedSupply);
}
function setCurrentSeason(uint256 _season) public onlyOwner {
require(_season > currentSeason, "!gt season");
currentSeason = _season;
lockSeason(false);
setSeasonEnd(false);
emit SeasonChanged(currentSeason, _season);
}
function lockSeason(bool _stateLocked) public onlyOwner {
lockedSeason = _stateLocked;
emit SeasonLockedStateSet(currentSeason, lockedSeason);
}
function setSeasonEnd(bool _state) public onlyOwner {
seasonEnded = _state;
emit SeasonEndStateUpdate(seasonEnded);
}
function isPlayerInSeason(address _player) public view returns (bool) {
if (seasonEnded) {
return
seasonOfHolder[_player] == currentSeason &&
_finalHolders[currentSeason][_player].length > 0 &&
balanceOf(_player) > 0;
}
if (lockedSeason) {
return
seasonOfHolder[_player] == currentSeason &&
_activeHolders[currentSeason][_player].length > 0 &&
balanceOf(_player) > 0;
}
return seasonOfHolder[_player] == currentSeason && balanceOf(_player) > 0;
}
function getPlayerSeason(address _player) public view returns (uint256) {
return seasonOfHolder[_player];
}
function getHoldersForSeason(
uint256 _season
) public view returns (address[] memory) {
return _seasonSnapshot[_season];
}
function getActiveSeasonPlayers(
uint256 _season
) public view returns (address[] memory) {
return _activeHoldersSeason[_season];
}
function getFinalSeasonPlayers(
uint256 _season
) public view returns (address[] memory) {
return _finalHoldersSeason[_season];
}
function isActiveHolder(
uint256 _season,
address _holder
) public view returns (uint256[] memory) {
return _activeHolders[_season][_holder];
}
function isFinalHolder(
uint256 _season,
address _holder
) public view returns (uint256[] memory) {
return _finalHolders[_season][_holder];
}
function removePlayerFromSeason(
address _player,
uint256 _season
) public onlyOwner {
if (seasonEnded) {
require(_finalHolders[_season][_player].length > 0, "Not in season");
delete _finalHolders[_season][_player];
seasonOfHolder[_player] = 0;
} else if (lockedSeason) {
require(_activeHolders[_season][_player].length > 0, "Not in season");
delete _activeHolders[_season][_player];
seasonOfHolder[_player] = 0;
} else {
require(_seasonSnapshot[_season].length > 0, "No players");
seasonOfHolder[_player] = 0;
}
emit PlayerRemovedFromSeason(_player, _season);
}
function addPlayerToSeason(
address _player,
uint256 _season
) public onlyOwner {
if (seasonEnded) {
require(_finalHolders[_season][_player].length == 0, "Player in season");
require(balanceOf(_player) > 0, "Balance 0");
_finalHolders[_season][_player] = this.tokensOfOwner(_player);
seasonOfHolder[_player] = _season;
} else if (lockedSeason) {
require(_activeHolders[_season][_player].length == 0, "Player in season");
require(balanceOf(_player) > 0, "Balance 0");
_activeHolders[_season][_player] = this.tokensOfOwner(_player);
seasonOfHolder[_player] = _season;
} else {
require(seasonOfHolder[_player] != _season, "Player in season");
require(balanceOf(_player) > 0, "Balance 0");
seasonOfHolder[_player] = _season;
bool found = false;
for (uint i = 0; i < _seasonSnapshot[_season].length; i++) {
if (_seasonSnapshot[_season][i] == _msgSender()) {
found = true;
break;
}
}
if (!found) {
_seasonSnapshot[_season].push(_msgSender());
}
}
emit PlayerAddedToSeason(_player, _season);
}
function setActiveSeasonSnapshot(uint256 _season) public onlyOwner {
require(_season == currentSeason, "Wrong season");
for (uint i = 0; i < _seasonSnapshot[_season].length; i++) {
address holder = _seasonSnapshot[_season][i];
uint256 balance = balanceOf(holder);
if (balance > 0 && seasonOfHolder[holder] == _season) {
_activeHolders[_season][holder] = this.tokensOfOwner(holder);
_activeHoldersSeason[_season].push(holder);
}
}
lockSeason(true);
emit SetActiveSeasonSnapshot(_season);
}
function seasonEndActiveHoldersSnapshot(uint256 _season) public onlyOwner {
require(_season == currentSeason, "Wrong season");
for (uint i = 0; i < _activeHoldersSeason[_season].length; i++) {
address holder = _activeHoldersSeason[_season][i];
uint256 balance = balanceOf(holder);
if (balance > 0 && seasonOfHolder[holder] == _season) {
_finalHolders[_season][holder] = this.tokensOfOwner(holder);
_finalHoldersSeason[_season].push(holder);
}
}
setSeasonEnd(true);
emit SeasonEndActiveHoldersSnapshot(_season);
}
function getBalanceForSeason(uint _season) public view returns (uint) {
return seasonBalances[_season];
}
function paySeasonFee() public payable {
uint256 seasonFeeInEth = calculateEntryFeeInEth();
require(lockedSeason == false, "Season locked");
require(balanceOf(_msgSender()) >= 1, "0 NFT");
require(
seasonOfHolder[_msgSender()] != currentSeason,
"Already paid season fee"
);
require(msg.value >= seasonFeeInEth, "Not enough Ether");
seasonOfHolder[_msgSender()] = currentSeason;
_seasonSnapshot[currentSeason].push(_msgSender());
seasonBalances[currentSeason] += seasonFeeInEth;
emit SeasonFeePaid(_msgSender(), currentSeason, seasonFeeInEth);
}
function getLatestEthUsdPrice() public view returns (int) {
(, int price, , uint timeStamp, ) = priceFeed.latestRoundData();
require(timeStamp > 0, "ERR");
return price;
}
function setPriceFeed(address _newPriceFeed) public onlyOwner {
require(_newPriceFeed != address(0), "Address !0");
emit PriceFeedChanged(address(priceFeed), _newPriceFeed);
priceFeed = AggregatorV3Interface(_newPriceFeed);
}
function setSeasonEntryFeeInUsd(uint256 _newEntryFeeInUsd) public onlyOwner {
require(_newEntryFeeInUsd > 0, "Fee <= 0");
emit SeasonEntryFeeChanged(entryFeeInUsd, _newEntryFeeInUsd);
entryFeeInUsd = _newEntryFeeInUsd;
}
function calculateEntryFeeInEth() public view returns (uint256) {
int ethUsdPrice = getLatestEthUsdPrice();
require(ethUsdPrice > 0, "Feed error");
uint latestPriceWei = uint(uint(ethUsdPrice) / 1e8);
return (entryFeeInUsd * 10 ** 18) / latestPriceWei;
}
function setOwnerCommission(uint _percentage) public onlyOwner {
require(_percentage <= 30, "> 30");
ownerCommission = _percentage;
emit SetOwnerCommission(_percentage);
}
function _baseURI() internal view virtual override returns (string memory) {
return uriPrefix;
}
function recordSeasonURI(
uint256 _season,
string memory _uri
) public onlyOwner {
seasonRecordsURI[_season] = _uri;
emit SetRecordSeasonURI(_season, _uri);
}
function setContractOfficialURIs(
string memory _key,
string memory _uri
) public onlyOwner {
if (
keccak256(abi.encodePacked(officialURIs[_key])) ==
keccak256(abi.encodePacked(""))
) {
keyRecords.push(_key);
keyRecordsLength += 1;
}
officialURIs[_key] = _uri;
}
}
文件 6 的 12:HOSWinnersSUB.sol
pragma solidity >=0.8.19 <0.9.0;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
contract HOSWinnersSUB is Ownable, ReentrancyGuard {
using Strings for uint256;
uint public ownerCommission = 3;
uint256 public currentSeason = 1;
event WithdrawFundsToNormalWinner(
uint256 season,
string class,
address to,
uint amount
);
event WithdrawFundsToHardcoreWinner(
uint256 season,
string class,
address to,
uint amount
);
event WithdrawFundsToTeamWinner(uint256 season, address to, uint amount);
event OwnerCommissionWithdraw(address indexed to, uint amount);
event SetClassWinnersNormalEvent(
uint256 _season,
string _class,
address _firstPlace,
address _secondPlace,
address _thirdPlace
);
event SetClassWinnersHardcoreEvent(
uint256 _season,
string _class,
address _firstPlace,
address _secondPlace,
address _thirdPlace
);
event SetTeamWinnersEvent(
uint256 _season,
Team _firstPlace,
Team _secondPlace,
Team _thirdPlace
);
event SetClaimStatusNormalEvent(
uint256 _season,
string _class,
address _winner
);
event SetClaimStatusHardcoreEvent(
uint256 _season,
string _class,
address _winner
);
event SetClaimStatusTeamEvent(uint256 _season, address _winner);
mapping(uint => bool) public ownerPaySeason;
struct ClassWinners {
address firstPlace;
address secondPlace;
address thirdPlace;
}
struct SeasonWinners {
ClassWinners barbarian;
ClassWinners rogue;
ClassWinners sorcerer;
ClassWinners druid;
ClassWinners necromancer;
ClassWinners paladin;
ClassWinners monk;
ClassWinners amazon;
ClassWinners vampire;
ClassWinners demon;
}
struct Team {
address player1;
address player2;
address player3;
address player4;
}
struct TeamWinners {
Team firstPlace;
Team secondPlace;
Team thirdPlace;
}
mapping(uint256 => mapping(string => ClassWinners))
private _activeWinnersNormalSeason;
mapping(uint256 => mapping(string => ClassWinners))
private _activeWinnersHardcoreSeason;
mapping(uint256 => TeamWinners) private _activeWinnersTeams;
mapping(uint256 => mapping(string => mapping(address => bool)))
private _claimedNormalSeason;
mapping(uint256 => mapping(string => mapping(address => bool)))
private _claimedHardcoreSeason;
mapping(uint256 => mapping(address => bool)) private _claimedTeamsSeason;
function setClassWinnersNormal(
uint256 _season,
string memory _class,
address _firstPlace,
address _secondPlace,
address _thirdPlace
) public onlyOwner {
ClassWinners memory winners;
winners.firstPlace = _firstPlace;
winners.secondPlace = _secondPlace;
winners.thirdPlace = _thirdPlace;
_activeWinnersNormalSeason[_season][_class] = winners;
emit SetClassWinnersNormalEvent(
_season,
_class,
_firstPlace,
_secondPlace,
_thirdPlace
);
}
function getClassWinnersNormal(
uint256 _season,
string memory _class
) public view returns (address, address, address) {
ClassWinners memory winners;
winners = _activeWinnersNormalSeason[_season][_class];
return (winners.firstPlace, winners.secondPlace, winners.thirdPlace);
}
function getEveryNormalWinners(
uint256 _season,
string[] memory _classes
) public view returns (ClassWinners[] memory) {
require(
_activeWinnersNormalSeason[_season][_classes[0]].firstPlace != address(0),
"Winners not set"
);
ClassWinners[] memory winnersList = new ClassWinners[](_classes.length);
for (uint i = 0; i < _classes.length; i++) {
winnersList[i] = _activeWinnersNormalSeason[_season][_classes[i]];
}
return winnersList;
}
function setClassWinnersHardcore(
uint256 _season,
string memory _class,
address _firstPlace,
address _secondPlace,
address _thirdPlace
) public onlyOwner {
ClassWinners memory winners;
winners.firstPlace = _firstPlace;
winners.secondPlace = _secondPlace;
winners.thirdPlace = _thirdPlace;
_activeWinnersHardcoreSeason[_season][_class] = winners;
emit SetClassWinnersHardcoreEvent(
_season,
_class,
_firstPlace,
_secondPlace,
_thirdPlace
);
}
function getClassWinnersHardcore(
uint256 _season,
string memory _class
) public view returns (address, address, address) {
ClassWinners memory winners;
winners = _activeWinnersHardcoreSeason[_season][_class];
return (winners.firstPlace, winners.secondPlace, winners.thirdPlace);
}
function getEveryHardcoreWinners(
uint256 _season,
string[] memory _classes
) public view returns (ClassWinners[] memory) {
require(
_activeWinnersHardcoreSeason[_season][_classes[0]].firstPlace !=
address(0),
"Winners not set"
);
ClassWinners[] memory winnersList = new ClassWinners[](_classes.length);
for (uint i = 0; i < _classes.length; i++) {
winnersList[i] = _activeWinnersHardcoreSeason[_season][_classes[i]];
}
return winnersList;
}
function setTeamWinners(
uint256 _season,
Team memory _firstPlace,
Team memory _secondPlace,
Team memory _thirdPlace
) public onlyOwner {
TeamWinners memory winners;
winners.firstPlace = _firstPlace;
winners.secondPlace = _secondPlace;
winners.thirdPlace = _thirdPlace;
_activeWinnersTeams[_season] = winners;
emit SetTeamWinnersEvent(_season, _firstPlace, _secondPlace, _thirdPlace);
}
function getTeamWinners(
uint256 _season
) public view returns (Team memory, Team memory, Team memory) {
TeamWinners memory winners = _activeWinnersTeams[_season];
return (winners.firstPlace, winners.secondPlace, winners.thirdPlace);
}
function setClaimStatusNormal(
uint256 _season,
string memory _class,
address _winner
) public onlyOwner {
_claimedNormalSeason[_season][_class][_winner] = true;
emit SetClaimStatusNormalEvent(_season, _class, _winner);
}
function getClaimStatusNormal(
uint256 _season,
string memory _class,
address _winner
) public view returns (bool) {
return _claimedNormalSeason[_season][_class][_winner];
}
function setClaimStatusHardcore(
uint256 _season,
string memory _class,
address _winner
) public onlyOwner {
_claimedHardcoreSeason[_season][_class][_winner] = true;
emit SetClaimStatusHardcoreEvent(_season, _class, _winner);
}
function getClaimStatusHardcore(
uint256 _season,
string memory _class,
address _winner
) public view returns (bool) {
return _claimedHardcoreSeason[_season][_class][_winner];
}
function setClaimStatusTeam(
uint256 _season,
address _winner
) public onlyOwner {
_claimedTeamsSeason[_season][_winner] = true;
emit SetClaimStatusTeamEvent(_season, _winner);
}
function getClaimStatusTeam(
uint256 _season,
address _winner
) public view returns (bool) {
return _claimedTeamsSeason[_season][_winner];
}
function withdrawFundsToWinner(
address payable _to,
uint _amount,
string memory _class,
uint _season,
uint _mode
) public onlyOwner nonReentrant {
require(address(this).balance >= _amount, "Not enough funds");
require(_to != address(0), "Zero address invalid");
if (_mode == 0) {
(
address firstPlace,
address secondPlace,
address thirdPlace
) = getClassWinnersNormal(_season, _class);
require(
_to == thirdPlace || _to == secondPlace || _to == firstPlace,
"Not winner"
);
require(!getClaimStatusNormal(_season, _class, _to), "Already claimed");
} else if (_mode == 1) {
(
address firstPlace,
address secondPlace,
address thirdPlace
) = getClassWinnersHardcore(_season, _class);
require(
_to == thirdPlace || _to == secondPlace || _to == firstPlace,
"Not winner"
);
require(!getClaimStatusHardcore(_season, _class, _to), "Already claimed");
} else if (_mode == 2) {
(
Team memory firstPlace,
Team memory secondPlace,
Team memory thirdPlace
) = getTeamWinners(_season);
require(
_to == firstPlace.player1 ||
_to == firstPlace.player2 ||
_to == firstPlace.player3 ||
_to == firstPlace.player4 ||
_to == secondPlace.player1 ||
_to == secondPlace.player2 ||
_to == secondPlace.player3 ||
_to == secondPlace.player4 ||
_to == thirdPlace.player1 ||
_to == thirdPlace.player2 ||
_to == thirdPlace.player3 ||
_to == thirdPlace.player4 ||
false,
"Not winner"
);
require(!getClaimStatusTeam(_season, _to), "Already claimed");
} else {
revert("wrong mode");
}
(bool success, ) = _to.call{value: _amount}("");
require(success, "Failed to send Ether");
if (_mode == 0) {
setClaimStatusNormal(_season, _class, _to);
emit WithdrawFundsToNormalWinner(_season, _class, _to, _amount);
} else if (_mode == 1) {
setClaimStatusHardcore(_season, _class, _to);
emit WithdrawFundsToHardcoreWinner(_season, _class, _to, _amount);
} else if (_mode == 2) {
setClaimStatusTeam(_season, _to);
emit WithdrawFundsToTeamWinner(_season, _to, _amount);
}
}
function withdrawFundsForOwner(
address payable _to
) public onlyOwner nonReentrant {
uint contractBalance = address(this).balance;
require(contractBalance > 0, "No funds");
require(_to != address(0), "invalid");
require(!ownerPaySeason[currentSeason], "Already paid");
uint ammount = (contractBalance * ownerCommission) / 100;
(bool success, ) = _to.call{value: ammount}("");
require(success, "Failed");
ownerPaySeason[currentSeason] = true;
emit OwnerCommissionWithdraw(_to, ammount);
}
}
文件 7 的 12:IERC721A.sol
pragma solidity ^0.8.4;
interface IERC721A {
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
error MintERC2309QuantityExceedsLimit();
error OwnershipNotInitializedForExtraData();
struct TokenOwnership {
address addr;
uint64 startTimestamp;
bool burned;
uint24 extraData;
}
function totalSupply() external view returns (uint256);
function supportsInterface(bytes4 interfaceId) external view returns (bool);
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 payable;
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
function transferFrom(
address from,
address to,
uint256 tokenId
) external payable;
function approve(address to, uint256 tokenId) external payable;
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);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
文件 8 的 12:IERC721AQueryable.sol
pragma solidity ^0.8.4;
import '../IERC721A.sol';
interface IERC721AQueryable is IERC721A {
error InvalidQueryRange();
function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view returns (uint256[] memory);
function tokensOfOwner(address owner) external view returns (uint256[] memory);
}
文件 9 的 12: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);
}
}
}
文件 10 的 12: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);
}
}
文件 11 的 12: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;
}
}
文件 12 的 12: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);
}
}
{
"compilationTarget": {
"contracts/HOSNftToken.sol": "HOSNftToken"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"address","name":"_priceFeed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"}],"name":"AddPlayerToSeason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isLocked","type":"bool"}],"name":"LockStateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"MaxSupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"MintedForAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerCommissionWithdraw","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":"bool","name":"isPaused","type":"bool"}],"name":"PausedStateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"}],"name":"PlayerAddedToSeason","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"}],"name":"PlayerRemovedFromSeason","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPriceFeed","type":"address"},{"indexed":false,"internalType":"address","name":"newPriceFeed","type":"address"}],"name":"PriceFeedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldSeason","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSeason","type":"uint256"}],"name":"SeasonChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"}],"name":"SeasonEndActiveHoldersSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"SeasonEndStateUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SeasonEntryFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SeasonFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLocked","type":"bool"}],"name":"SeasonLockedStateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"}],"name":"SetActiveSeasonSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_season","type":"uint256"},{"indexed":false,"internalType":"string","name":"_class","type":"string"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"}],"name":"SetClaimStatusHardcoreEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_season","type":"uint256"},{"indexed":false,"internalType":"string","name":"_class","type":"string"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"}],"name":"SetClaimStatusNormalEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_season","type":"uint256"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"}],"name":"SetClaimStatusTeamEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_season","type":"uint256"},{"indexed":false,"internalType":"string","name":"_class","type":"string"},{"indexed":false,"internalType":"address","name":"_firstPlace","type":"address"},{"indexed":false,"internalType":"address","name":"_secondPlace","type":"address"},{"indexed":false,"internalType":"address","name":"_thirdPlace","type":"address"}],"name":"SetClassWinnersHardcoreEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_season","type":"uint256"},{"indexed":false,"internalType":"string","name":"_class","type":"string"},{"indexed":false,"internalType":"address","name":"_firstPlace","type":"address"},{"indexed":false,"internalType":"address","name":"_secondPlace","type":"address"},{"indexed":false,"internalType":"address","name":"_thirdPlace","type":"address"}],"name":"SetClassWinnersNormalEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"SetOwnerCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SetRecordSeasonURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_season","type":"uint256"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"indexed":false,"internalType":"struct HOSWinnersSUB.Team","name":"_firstPlace","type":"tuple"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"indexed":false,"internalType":"struct HOSWinnersSUB.Team","name":"_secondPlace","type":"tuple"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"indexed":false,"internalType":"struct HOSWinnersSUB.Team","name":"_thirdPlace","type":"tuple"}],"name":"SetTeamWinnersEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldPrefix","type":"string"},{"indexed":false,"internalType":"string","name":"newPrefix","type":"string"}],"name":"URIPrefixChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldSuffix","type":"string"},{"indexed":false,"internalType":"string","name":"newSuffix","type":"string"}],"name":"URISuffixChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"string","name":"class","type":"string"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFundsToHardcoreWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"string","name":"class","type":"string"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFundsToNormalWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFundsToTeamWinner","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_activeHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_activeHoldersSeason","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_finalHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_finalHoldersSeason","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_seasonSnapshot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"addPlayerToSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateEntryFeeInEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSeason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryFeeInUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"getActiveSeasonPlayers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"getBalanceForSeason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_winner","type":"address"}],"name":"getClaimStatusHardcore","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_winner","type":"address"}],"name":"getClaimStatusNormal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"address","name":"_winner","type":"address"}],"name":"getClaimStatusTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"}],"name":"getClassWinnersHardcore","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"}],"name":"getClassWinnersNormal","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string[]","name":"_classes","type":"string[]"}],"name":"getEveryHardcoreWinners","outputs":[{"components":[{"internalType":"address","name":"firstPlace","type":"address"},{"internalType":"address","name":"secondPlace","type":"address"},{"internalType":"address","name":"thirdPlace","type":"address"}],"internalType":"struct HOSWinnersSUB.ClassWinners[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string[]","name":"_classes","type":"string[]"}],"name":"getEveryNormalWinners","outputs":[{"components":[{"internalType":"address","name":"firstPlace","type":"address"},{"internalType":"address","name":"secondPlace","type":"address"},{"internalType":"address","name":"thirdPlace","type":"address"}],"internalType":"struct HOSWinnersSUB.ClassWinners[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"getFinalSeasonPlayers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"getHoldersForSeason","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestEthUsdPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"getPlayerSeason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"getTeamWinners","outputs":[{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"internalType":"struct HOSWinnersSUB.Team","name":"","type":"tuple"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"internalType":"struct HOSWinnersSUB.Team","name":"","type":"tuple"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"internalType":"struct HOSWinnersSUB.Team","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"isActiveHolder","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"isFinalHolder","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"isPlayerInSeason","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"keyRecords","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyRecordsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_stateLocked","type":"bool"}],"name":"lockSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedSeason","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"officialURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerPaySeason","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paySeasonFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"recordSeasonURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"removePlayerFromSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"seasonEndActiveHoldersSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seasonEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"seasonOfHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonRecordsURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"setActiveSeasonSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_winner","type":"address"}],"name":"setClaimStatusHardcore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_winner","type":"address"}],"name":"setClaimStatusNormal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"address","name":"_winner","type":"address"}],"name":"setClaimStatusTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_firstPlace","type":"address"},{"internalType":"address","name":"_secondPlace","type":"address"},{"internalType":"address","name":"_thirdPlace","type":"address"}],"name":"setClassWinnersHardcore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_firstPlace","type":"address"},{"internalType":"address","name":"_secondPlace","type":"address"},{"internalType":"address","name":"_thirdPlace","type":"address"}],"name":"setClassWinnersNormal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractOfficialURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"setCurrentSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_lock","type":"bool"}],"name":"setLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setOwnerCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPriceFeed","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSeasonEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEntryFeeInUsd","type":"uint256"}],"name":"setSeasonEntryFeeInUsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"internalType":"struct HOSWinnersSUB.Team","name":"_firstPlace","type":"tuple"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"internalType":"struct HOSWinnersSUB.Team","name":"_secondPlace","type":"tuple"},{"components":[{"internalType":"address","name":"player1","type":"address"},{"internalType":"address","name":"player2","type":"address"},{"internalType":"address","name":"player3","type":"address"},{"internalType":"address","name":"player4","type":"address"}],"internalType":"struct HOSWinnersSUB.Team","name":"_thirdPlace","type":"tuple"}],"name":"setTeamWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawFundsForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"uint256","name":"_season","type":"uint256"},{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"withdrawFundsToWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]