Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 100 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 15514360 | 875 days ago | IN | 0 ETH | 0.00018682 | ||||
Transfer From | 15514354 | 875 days ago | IN | 0 ETH | 0.00030952 | ||||
Set Approval For... | 15514277 | 875 days ago | IN | 0 ETH | 0.00042216 | ||||
Set Approval For... | 15120663 | 937 days ago | IN | 0 ETH | 0.00057943 | ||||
Transfer From | 15026346 | 953 days ago | IN | 0 ETH | 0.0017209 | ||||
Transfer From | 15025856 | 953 days ago | IN | 0 ETH | 0.00810054 | ||||
Set Prices | 15002190 | 957 days ago | IN | 0 ETH | 0.00074342 | ||||
Set Prices | 15002175 | 957 days ago | IN | 0 ETH | 0.00083238 | ||||
Set Prices | 15002169 | 957 days ago | IN | 0 ETH | 0.00086849 | ||||
Set Prices | 14955948 | 965 days ago | IN | 0 ETH | 0.00656049 | ||||
Set Prices | 14890641 | 976 days ago | IN | 0 ETH | 0.00208114 | ||||
Set Prices | 14890635 | 976 days ago | IN | 0 ETH | 0.00243154 | ||||
Set Base URI | 14890539 | 976 days ago | IN | 0 ETH | 0.00469236 | ||||
Mint Friends | 14885645 | 977 days ago | IN | 0.21 ETH | 0.00868413 | ||||
Set Prices | 14885467 | 977 days ago | IN | 0 ETH | 0.00289401 | ||||
Mint Friends | 14885460 | 977 days ago | IN | 0.01 ETH | 0.00940828 | ||||
Set Prices | 14885453 | 977 days ago | IN | 0 ETH | 0.00240243 | ||||
Set Prices | 14885449 | 977 days ago | IN | 0 ETH | 0.00265535 | ||||
Set Prices | 14885007 | 977 days ago | IN | 0 ETH | 0.00156712 | ||||
Set Prices | 14884991 | 977 days ago | IN | 0 ETH | 0.00131138 | ||||
Set Prices | 14884793 | 977 days ago | IN | 0 ETH | 0.00157225 | ||||
Set Prices | 14884791 | 977 days ago | IN | 0 ETH | 0.00222681 | ||||
Set Prices | 14884768 | 977 days ago | IN | 0 ETH | 0.00147245 | ||||
Mint Friends | 14884767 | 977 days ago | IN | 0.01 ETH | 0.00640589 | ||||
Mint Friends | 14884754 | 977 days ago | IN | 0.01 ETH | 0.00633132 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
JustWin
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; // pause mints at deployment // set contract/base uris // set params // setVersion import {IJustWin} from "./interfaces/IJustWin.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol"; contract JustWin is IJustWin, ERC721A, ERC2981, Ownable { // State uint public version; uint public constant maxSupply = 30000; string private baseURI; mapping(uint => Params) public versionParams; mapping(uint => mapping(List => mapping(address => uint))) public claimed; // version to list to addy to number minted mapping(List => mapping(uint => bool)) public isPaused; // Royalties uint96 royaltyFeesInBips; address royaltyReceiver; string public contractURI; // Lottery address public lottery; constructor( uint96 _royaltyFeesInbips ) ERC721A("JustWin", "JW") { royaltyFeesInBips = _royaltyFeesInbips; royaltyReceiver = address(this); _initPause(); _setMembersAlloInfo(); _setRoyaltiesDistInfo(); } // ***** VIEW ***** function _baseURI() internal view override returns (string memory) { return baseURI; } function _startTokenId() internal pure override returns (uint256) { return 1; } function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId) || interfaceId == 0x80ac58cd; } // ***** MERKLE TREE ***** function isWhitelist(bytes32[] memory proof, bytes32 _leaf) internal view returns (bool) { return MerkleProof.verify(proof, versionParams[version].roots.whitelist, _leaf); } function isViplist(bytes32[] memory proof, bytes32 _leaf) internal view returns (bool) { return MerkleProof.verify(proof, versionParams[version].roots.viplist, _leaf); } // ***** MINT ***** function mintPublic(uint _number) external payable { Params memory params_ = versionParams[version]; require(!isPaused[List.sale][params_.version], "paused"); require(msg.value >= params_.prices.sale * _number, "price"); require(params_.supplies.sale + _number <= params_.maxSupplies.sale, "supplies"); require(params_.supply + _number <= params_.maxSupply, "supply"); params_.supplies.sale += _number; params_.supply += _number; versionParams[version] = params_; _allocate(msg.value); _safeMint(msg.sender, _number); } function mintFriends(uint _number) external payable { require(version == 1, "v"); Params memory params_ = versionParams[version]; require(!isPaused[List.friends][params_.version], "paused"); require(msg.value >= params_.prices.friends * _number, "price"); require(claimed[params_.version][List.friends][msg.sender] + _number <= params_.mintable.friends, "claimed"); require(params_.supplies.friends + _number <= params_.maxSupplies.friends, "supplies"); require(params_.supply + _number <= params_.maxSupply, "supply"); params_.supplies.friends += _number; params_.supply += _number; claimed[version][List.friends][msg.sender] += _number; versionParams[version] = params_; _allocateFriends(msg.value); _safeMint(msg.sender, _number); } function mintWhitelist(uint _number, bytes32[] memory _proof) external payable { Params memory params_ = versionParams[version]; require(!isPaused[List.whitelist][params_.version], "paused"); bytes32 leaf_ = keccak256(abi.encodePacked(msg.sender)); require(isWhitelist(_proof, leaf_), "list"); require(msg.value >= params_.prices.whitelist * _number, "price"); require(claimed[params_.version][List.whitelist][msg.sender] + _number <= params_.mintable.whitelist, "claimed"); require(params_.supplies.whitelist + _number <= params_.maxSupplies.whitelist, "supplies"); require(params_.supply + _number <= params_.maxSupply, "supply"); claimed[version][List.whitelist][msg.sender] += _number; params_.supplies.whitelist += _number; params_.supply += _number; versionParams[version] = params_; _allocate(msg.value); _safeMint(msg.sender, _number); } function mintViplist(uint _number, bytes32[] memory _proof) external payable { Params memory params_ = versionParams[version]; require(!isPaused[List.viplist][params_.version], "paused"); bytes32 leaf_ = keccak256(abi.encodePacked(msg.sender)); require(isViplist(_proof, leaf_), "list"); require(msg.value >= params_.prices.viplist * _number, "price"); require(claimed[params_.version][List.viplist][msg.sender] + _number <= params_.mintable.viplist, "claimed"); require(params_.supplies.viplist + _number <= params_.maxSupplies.viplist, "supplies"); require(params_.supply + _number <= params_.maxSupply, "supply"); claimed[version][List.viplist][msg.sender] += _number; params_.supplies.viplist += _number; params_.supply += _number; versionParams[version] = params_; _allocate(msg.value); _safeMint(msg.sender, _number); } // ***** ADMIN ***** function setParamsVersion(uint _version) external onlyOwner { version = _version; versionParams[_version].version = _version; } function setMaxSupply(uint _version, uint _maxSupply) external onlyOwner { versionParams[_version].maxSupply = _maxSupply; } function setMaxSupplies(uint _version, MaxSupplies memory _maxSupplies) external onlyOwner { versionParams[_version].maxSupplies = _maxSupplies; } function setMintable(uint _version, Mintable memory _mintable) external onlyOwner { versionParams[_version].mintable = _mintable; } function setPrices(uint _version, Prices memory _prices) external onlyOwner { versionParams[_version].prices = _prices; } function setRoots(uint _version, Roots memory _roots) external onlyOwner { versionParams[_version].roots = _roots; } function setLotteryAddress(address _lottery) external onlyOwner { lottery = _lottery; } function setPause(List _list, uint _version, bool _state) public onlyOwner { isPaused[_list][_version] = _state; } function _initPause() internal { setPause(List.friends, 1, true); setPause(List.whitelist, 1, true); setPause(List.viplist, 1, true); setPause(List.sale, 1, true); } function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; } function setContractURI(string memory _contractURI) external onlyOwner { contractURI = _contractURI; } // Team/Growth uint256 public totalAllo; uint public totalRoyalties; address[] public members; address[] public royaltiesMembers; mapping(address => uint) public memberAllo; mapping(address => uint) public memberRoyalty; address public marketing = 0x9667427550044ffB24859e15C8c06DBfF1286Aa9; address public asso = 0x6d6ea83390005C73860131AD8c4C4f909fA16044; uint public reserved; function reserveTicket(address _to, uint _number) external onlyOwner { require(reserved <= 500, "v"); versionParams[1].supply += _number; reserved += _number; _safeMint(_to, _number); } function _allocate(uint _value) internal { uint totalWeight = 10000; uint lotteryWeight = 1888; uint lotteryCut_ = _value * lotteryWeight / totalWeight; uint marketingAmount_ = lotteryCut_ * 500 / totalWeight; uint lotteryAmount_ = lotteryCut_ - marketingAmount_; (bool success1,) = marketing.call{value: marketingAmount_}(""); require(success1, "ETH"); (bool success2,) = lottery.call{value: lotteryAmount_}(""); require(success2, "ETH"); totalAllo += _value - lotteryCut_; } function _allocateFriends(uint _value) internal { (bool success,) = marketing.call{value: _value}(""); require(success, "ETH"); } function distributeRoyalties() external onlyOwner { require(totalRoyalties > 0); uint totalWeight = 10000; uint lotteryWeight = 5000; uint assoWeight = 2500; uint _assoAmount = totalRoyalties * assoWeight / totalWeight; (bool success0,) = asso.call{value: _assoAmount}(""); require(success0, "failed to send ETH"); uint lotteryAmount_ = totalRoyalties * lotteryWeight / totalWeight; (bool success1,) = lottery.call{value: lotteryAmount_}(""); require(success1, "ETH"); uint royaltyAmount_ = totalRoyalties - lotteryAmount_ - _assoAmount; for (uint i = 0; i < royaltiesMembers.length; ++i) { address to = royaltiesMembers[i]; uint royalty_ = royaltyAmount_ * memberRoyalty[to] / totalWeight; (bool success2,) = to.call{value: royalty_}(""); require(success2, "ETH"); } totalRoyalties = 0; } function distributeAllo() external onlyOwner { require(members.length != 0); require(address(this).balance > 0); uint totalWeight = 10000; for (uint i = 0; i < members.length; ++i) { address to = members[i]; uint amount_ = totalAllo * memberAllo[to] / totalWeight; (bool success,) = to.call{value: amount_}(""); require(success, "ETH"); } totalAllo = 0; } function distributeERC20(address _token) external { IERC20 token = IERC20(_token); uint balance = token.balanceOf(address(this)); require(balance > 0, "balance"); uint totalWeight = 10000; for (uint i = 0; i < members.length; ++i) { address to = members[i]; uint amount_ = balance * memberAllo[to] / totalWeight; token.transfer(to, amount_); } } function _setRoyaltiesDistInfo() internal { royaltiesMembers = [ 0xC621F67aDFD47E4914169Edf7037fA3eF76fdfd3, 0x95235f5f4a41Dd74B4F10F9581e59bA66084dbe8, 0xDCE73e3E9CB2e19054447e6f331900AE4890dA38, 0xF1A3e5FbF0b4bB783f01b0dB5608DB998d18FB53, 0x503591aA518f51a751DE92Abe363848C81DE8375, 0x54d5c487193C142d4DF901Dac75309B93bf6cE14 ]; memberRoyalty[royaltiesMembers[0]] = 2200; memberRoyalty[royaltiesMembers[1]] = 2200; memberRoyalty[royaltiesMembers[2]] = 2200; memberRoyalty[royaltiesMembers[3]] = 1500; memberRoyalty[royaltiesMembers[4]] = 1500; memberRoyalty[royaltiesMembers[5]] = 400; } function _setMembersAlloInfo() internal { members = [ 0xC621F67aDFD47E4914169Edf7037fA3eF76fdfd3, 0x95235f5f4a41Dd74B4F10F9581e59bA66084dbe8, 0xDCE73e3E9CB2e19054447e6f331900AE4890dA38, 0xF1A3e5FbF0b4bB783f01b0dB5608DB998d18FB53, 0x503591aA518f51a751DE92Abe363848C81DE8375, 0x54d5c487193C142d4DF901Dac75309B93bf6cE14, 0x3c48872F2c8DA8eABC693c64Fbed3a2B3d4eF2A9, 0x1701a8e654c84e5979736675D13F93A4DD4d2eea ]; memberAllo[members[0]] = 2420; memberAllo[members[1]] = 2420; memberAllo[members[2]] = 2420; memberAllo[members[3]] = 1230; memberAllo[members[4]] = 1230; memberAllo[members[5]] = 188; memberAllo[members[6]] = 55; memberAllo[members[7]] = 37; } receive() external payable { totalRoyalties += msg.value; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ 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; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ 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))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ 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)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "../../interfaces/IERC2981.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ 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); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ 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); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ 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); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; interface IJustWin { struct Mintable { uint friends; uint family; uint whitelist; uint viplist; } struct MaxSupplies { uint friends; uint whitelist; uint viplist; uint sale; } struct Prices { uint friends; uint whitelist; uint viplist; uint sale; } struct Roots { bytes32 whitelist; bytes32 viplist; } struct Claimed { uint friends; uint whitelist; uint viplist; } struct Supplies { uint friends; uint whitelist; uint viplist; uint sale; } struct Params { uint version; uint supply; uint maxSupply; Supplies supplies; MaxSupplies maxSupplies; Mintable mintable; Prices prices; Roots roots; } enum List { friends, whitelist, viplist, sale } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint96","name":"_royaltyFeesInbips","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asso","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"enum IJustWin.List","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeAllo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"distributeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"enum IJustWin.List","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottery","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"memberAllo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"memberRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"members","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"mintFriends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintViplist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"reserveTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"royaltiesMembers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"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":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lottery","type":"address"}],"name":"setLotteryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"},{"internalType":"uint256","name":"sale","type":"uint256"}],"internalType":"struct IJustWin.MaxSupplies","name":"_maxSupplies","type":"tuple"}],"name":"setMaxSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"}],"internalType":"struct IJustWin.Mintable","name":"_mintable","type":"tuple"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"setParamsVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IJustWin.List","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_version","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"},{"internalType":"uint256","name":"sale","type":"uint256"}],"internalType":"struct IJustWin.Prices","name":"_prices","type":"tuple"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"},{"components":[{"internalType":"bytes32","name":"whitelist","type":"bytes32"},{"internalType":"bytes32","name":"viplist","type":"bytes32"}],"internalType":"struct IJustWin.Roots","name":"_roots","type":"tuple"}],"name":"setRoots","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":[],"name":"totalAllo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRoyalties","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"versionParams","outputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"},{"internalType":"uint256","name":"sale","type":"uint256"}],"internalType":"struct IJustWin.Supplies","name":"supplies","type":"tuple"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"},{"internalType":"uint256","name":"sale","type":"uint256"}],"internalType":"struct IJustWin.MaxSupplies","name":"maxSupplies","type":"tuple"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"}],"internalType":"struct IJustWin.Mintable","name":"mintable","type":"tuple"},{"components":[{"internalType":"uint256","name":"friends","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"viplist","type":"uint256"},{"internalType":"uint256","name":"sale","type":"uint256"}],"internalType":"struct IJustWin.Prices","name":"prices","type":"tuple"},{"components":[{"internalType":"bytes32","name":"whitelist","type":"bytes32"},{"internalType":"bytes32","name":"viplist","type":"bytes32"}],"internalType":"struct IJustWin.Roots","name":"roots","type":"tuple"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052601980546001600160a01b0319908116739667427550044ffb24859e15c8c06dbff1286aa917909155601a8054909116736d6ea83390005c73860131ad8c4c4f909fa160441790553480156200005957600080fd5b5060405162004513380380620045138339810160408190526200007c91620008fd565b60405180604001604052806007815260200166253ab9ba2bb4b760c91b815250604051806040016040528060028152602001614a5760f01b8152508160029080519060200190620000cf929190620007ff565b508051620000e5906003906020840190620007ff565b5050600160005550620000f8336200013b565b6c0100000000000000000000000030026001600160601b03821617601055620001206200018d565b6200012a620001ca565b62000134620004f6565b5062000998565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200019c600060018062000737565b620001aa6001808062000737565b620001b9600260018062000737565b620001c8600360018062000737565b565b604080516101008101825273c621f67adfd47e4914169edf7037fa3ef76fdfd381527395235f5f4a41dd74b4f10f9581e59ba66084dbe8602082015273dce73e3e9cb2e19054447e6f331900ae4890da389181019190915273f1a3e5fbf0b4bb783f01b0db5608db998d18fb53606082015273503591aa518f51a751de92abe363848c81de837560808201527354d5c487193c142d4df901dac75309b93bf6ce1460a0820152733c48872f2c8da8eabc693c64fbed3a2b3d4ef2a960c0820152731701a8e654c84e5979736675d13f93a4dd4d2eea60e0820152620002b49060159060086200088e565b50610974601760006015600081548110620002d357620002d362000982565b60009182526020808320909101546001600160a01b031683528201929092526040018120919091556015805461097492601792909160019081106200031c576200031c62000982565b60009182526020808320909101546001600160a01b0316835282019290925260400181209190915560158054610974926017929091600290811062000365576200036562000982565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601580546104ce9260179290916003908110620003ae57620003ae62000982565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601580546104ce9260179290916004908110620003f757620003f762000982565b60009182526020808320909101546001600160a01b031683528201929092526040018120919091556015805460bc92601792909160059081106200043f576200043f62000982565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601580546037926017929091600690811062000487576200048762000982565b60009182526020808320909101546001600160a01b031683528201929092526040018120919091556015805460259260179290916007908110620004cf57620004cf62000982565b60009182526020808320909101546001600160a01b03168352820192909252604001902055565b6040805160c08101825273c621f67adfd47e4914169edf7037fa3ef76fdfd381527395235f5f4a41dd74b4f10f9581e59ba66084dbe8602082015273dce73e3e9cb2e19054447e6f331900ae4890da389181019190915273f1a3e5fbf0b4bb783f01b0db5608db998d18fb53606082015273503591aa518f51a751de92abe363848c81de837560808201527354d5c487193c142d4df901dac75309b93bf6ce1460a0820152620005ab9060169060066200088e565b50610898601860006016600081548110620005ca57620005ca62000982565b60009182526020808320909101546001600160a01b0316835282019290925260400181209190915560168054610898926018929091600190811062000613576200061362000982565b60009182526020808320909101546001600160a01b031683528201929092526040018120919091556016805461089892601892909160029081106200065c576200065c62000982565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601680546105dc9260189290916003908110620006a557620006a562000982565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601680546105dc9260189290916004908110620006ee57620006ee62000982565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601680546101909260189290916005908110620004cf57620004cf62000982565b600a546001600160a01b03163314620007965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80600f6000856003811115620007b057620007b06200096c565b6003811115620007c457620007c46200096c565b8152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b8280546200080d906200092f565b90600052602060002090601f0160209004810192826200083157600085556200087c565b82601f106200084c57805160ff19168380011785556200087c565b828001600101855582156200087c579182015b828111156200087c5782518255916020019190600101906200085f565b506200088a929150620008e6565b5090565b8280548282559060005260206000209081019282156200087c579160200282015b828111156200087c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620008af565b5b808211156200088a5760008155600101620008e7565b6000602082840312156200091057600080fd5b81516001600160601b03811681146200092857600080fd5b9392505050565b600181811c908216806200094457607f821691505b602082108114156200096657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b613b6b80620009a86000396000f3fe6080604052600436106103035760003560e01c806357a9cabc11610190578063b88d4fde116100dc578063d63f097611610095578063e985e9c51161006f578063e985e9c514610a4c578063efd0cbf914610a95578063f2fde38b14610aa8578063fe60d12c14610ac857600080fd5b8063d63f0976146109e7578063e3f5d12014610a22578063e8a3d48514610a3757600080fd5b8063b88d4fde14610913578063ba13a57214610933578063bce5826914610953578063c115327114610973578063c87b56dd146109b1578063d5abeb01146109d157600080fd5b80637dbf2b1e116101495780638da5cb5b116101235780638da5cb5b146108a0578063938e3d7b146108be57806395d89b41146108de578063a22cb465146108f357600080fd5b80637dbf2b1e1461085757806386d02608146108775780638a1b0bf91461088d57600080fd5b806357a9cabc146107a25780635ac9f9fc146107c25780635daf08ca146107e25780636352211e1461080257806370a0823114610822578063715018a61461084257600080fd5b80632d3e474a1161024f57806342842e0e116102085780634f8983f9116101e25780634f8983f91461062857806351044b541461064857806354fd4d501461076c57806355f804b31461078257600080fd5b806342842e0e146105bb57806345d72631146105db5780634ef7ad48146105fb57600080fd5b80632d3e474a146105035780632fb8a96e14610523578063310720b51461053857806337da577c1461054e5780633b7456ed1461056e578063400974d21461059b57600080fd5b8063081812fc116102bc57806318160ddd1161029657806318160ddd1461045d57806323b872dd146104845780632a332b2a146104a45780632a55205a146104c457600080fd5b8063081812fc146103fd578063095ea7b31461041d5780630a7b73821461043d57600080fd5b8063019866b31461032657806301ffc9a714610348578063061431a81461037d57806306a94cf61461039057806306cc1bdf146103a357806306fdde03146103db57600080fd5b3661032157346014600082825461031a91906139c7565b9091555050005b600080fd5b34801561033257600080fd5b5061034661034136600461368b565b610ade565b005b34801561035457600080fd5b50610368610363366004613461565b610b34565b60405190151581526020015b60405180910390f35b61034661038b366004613572565b610b60565b61034661039e366004613540565b610fa2565b3480156103af57600080fd5b506103c36103be366004613540565b61138b565b6040516001600160a01b039091168152602001610374565b3480156103e757600080fd5b506103f06113b5565b60405161037491906137b1565b34801561040957600080fd5b506103c3610418366004613540565b611447565b34801561042957600080fd5b5061034661043836600461341a565b61148b565b34801561044957600080fd5b50610346610458366004613540565b61155e565b34801561046957600080fd5b5060015460005403600019015b604051908152602001610374565b34801561049057600080fd5b5061034661049f36600461332b565b61159e565b3480156104b057600080fd5b506103466104bf3660046132dd565b6115ae565b3480156104d057600080fd5b506104e46104df3660046136f7565b6115fa565b604080516001600160a01b039093168352602083019190915201610374565b34801561050f57600080fd5b506019546103c3906001600160a01b031681565b34801561052f57600080fd5b506103466116a6565b34801561054457600080fd5b5061047660135481565b34801561055a57600080fd5b506103466105693660046136f7565b61194d565b34801561057a57600080fd5b506104766105893660046132dd565b60186020526000908152604090205481565b3480156105a757600080fd5b50601a546103c3906001600160a01b031681565b3480156105c757600080fd5b506103466105d636600461332b565b61198c565b3480156105e757600080fd5b506103466105f6366004613667565b6119a7565b34801561060757600080fd5b506104766106163660046132dd565b60176020526000908152604090205481565b34801561063457600080fd5b506103466106433660046134b7565b611a07565b34801561065457600080fd5b50610758610663366004613540565b600d60208181526000928352604092839020805460018201546002830154865160808082018952600386015482526004860154828801526005860154828a0152600686015460608084019190915289518083018b52600788015481526008880154818a01526009880154818c0152600a880154818301528a518084018c52600b8901548152600c890154818b0152998801548a8c0152600e8801548a8301528a519283018b52600f88015483526010880154838a01526011880154838c01526012880154918301919091528951808b01909a5260138701548a5260149096015496890196909652929691959094929392909188565b6040516103749897969594939291906138b8565b34801561077857600080fd5b50610476600b5481565b34801561078e57600080fd5b5061034661079d3660046134f7565b611a94565b3480156107ae57600080fd5b506103466107bd366004613667565b611ad1565b3480156107ce57600080fd5b506103466107dd36600461341a565b611b32565b3480156107ee57600080fd5b506103c36107fd366004613540565b611bfa565b34801561080e57600080fd5b506103c361081d366004613540565b611c0a565b34801561082e57600080fd5b5061047661083d3660046132dd565b611c15565b34801561084e57600080fd5b50610346611c64565b34801561086357600080fd5b50610346610872366004613667565b611c9a565b34801561088357600080fd5b5061047660145481565b61034661089b366004613572565b611cfb565b3480156108ac57600080fd5b50600a546001600160a01b03166103c3565b3480156108ca57600080fd5b506103466108d93660046134f7565b61202b565b3480156108ea57600080fd5b506103f0612068565b3480156108ff57600080fd5b5061034661090e3660046133e3565b612077565b34801561091f57600080fd5b5061034661092e366004613367565b61210d565b34801561093f57600080fd5b506012546103c3906001600160a01b031681565b34801561095f57600080fd5b5061034661096e3660046132dd565b612151565b34801561097f57600080fd5b5061047661098e36600461362b565b600e60209081526000938452604080852082529284528284209052825290205481565b3480156109bd57600080fd5b506103f06109cc366004613540565b61230c565b3480156109dd57600080fd5b5061047661753081565b3480156109f357600080fd5b50610368610a0236600461349b565b600f60209081526000928352604080842090915290825290205460ff1681565b348015610a2e57600080fd5b50610346612391565b348015610a4357600080fd5b506103f06124cb565b348015610a5857600080fd5b50610368610a673660046132f8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610346610aa3366004613540565b612559565b348015610ab457600080fd5b50610346610ac33660046132dd565b61287f565b348015610ad457600080fd5b50610476601b5481565b600a546001600160a01b03163314610b115760405162461bcd60e51b8152600401610b0890613826565b60405180910390fd5b6000918252600d6020908152604090922081516013820155910151601490910155565b6000610b3f8261291a565b80610b5a57506380ac58cd60e01b6001600160e01b03198316145b92915050565b600b80546000908152600d602081815260408084208151610100810183528154815260018083015482860152600283015482850152835160808082018652600385015482526004850154828801526005850154828701526006850154606080840191909152808501929092528551808201875260078601548152600886015481890152600986015481880152600a860154818401528185015285518082018752998501548a52600c8501548a8801529684015489860152600e8401548982015260a083019890985283519586018452600f80840154875260108401548787015260118401548786015260128401549887019890985260c082019590955282518084018452601383015481526014909201548285015260e0810191909152928452938152815183527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f90529190205460ff1615610cce5760405162461bcd60e51b8152600401610b0890613898565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610d11838261294f565b610d465760405162461bcd60e51b8152600401610b08906020808252600490820152631b1a5cdd60e21b604082015260600190565b838260c0015160200151610d5a9190613a01565b341015610d795760405162461bcd60e51b8152600401610b08906137e6565b60a082015160409081015183516000908152600e602090815283822060018352815283822033835290529190912054610db39086906139c7565b1115610dd15760405162461bcd60e51b8152600401610b0890613805565b81608001516020015184836060015160200151610dee91906139c7565b1115610e0c5760405162461bcd60e51b8152600401610b08906137c4565b8160400151848360200151610e2191906139c7565b1115610e3f5760405162461bcd60e51b8152600401610b0890613878565b600b546000908152600e6020908152604080832060018452825280832033845290915281208054869290610e749084906139c7565b92505081905550838260600151602001818151610e9191906139c7565b905250602082018051859190610ea89083906139c7565b905250600b80546000908152600d602081815260409283902086518155818701516001820155838701516002820155606080880151805160038401558084015160048401558086015160058401558101516006830155608088015180516007840155808401516008840155808601516009840155810151600a83015560a088015180519683019690965585830151600c830155858501519382019390935593820151600e85015560c08601518051600f860155808201516010860155928301516011850155910151601283015560e0840151805160138401550151601490910155610f9234612970565b610f9c3385612acb565b50505050565b600b54600114610fd85760405162461bcd60e51b81526020600482015260016024820152603b60f91b6044820152606401610b08565b600b80546000908152600d6020818152604080842081516101008101835281548152600182015481850152600282015481840152825160808082018552600384015482526004840154828701526005840154828601526006840154606080840191909152808401929092528451808201865260078501548152600885015481880152600985015481870152600a850154818401528184015284518082018652988401548952600c840154898701529583015488850152600e8301548882015260a082019790975282519485018352600f80830154865260108301548686015260118301548685015260128301549786019790975260c081019490945281518083018352601382015481526014909101548184015260e0840152838052938152815183527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37590529190205460ff16156111425760405162461bcd60e51b8152600401610b0890613898565b60c081015151611153908390613a01565b3410156111725760405162461bcd60e51b8152600401610b08906137e6565b60a08101515181516000908152600e6020908152604080832083805282528083203384529091529020546111a79084906139c7565b11156111c55760405162461bcd60e51b8152600401610b0890613805565b6080810151516060820151516111dc9084906139c7565b11156111fa5760405162461bcd60e51b8152600401610b08906137c4565b806040015182826020015161120f91906139c7565b111561122d5760405162461bcd60e51b8152600401610b0890613878565b81816060015160000181815161124391906139c7565b90525060208101805183919061125a9083906139c7565b905250600b546000908152600e602090815260408083208380528252808320338452909152812080548492906112919084906139c7565b9091555050600b80546000908152600d602081815260409283902085518155818601516001820155838601516002820155606080870151805160038401558084015160048401558086015160058401558101516006830155608087015180516007840155808401516008840155808601516009840155810151600a83015560a087015180519683019690965585830151600c830155858501519382019390935593820151600e85015560c08501518051600f860155808201516010860155928301516011850155910151601283015560e083015180516013840155015160149091015561137d34612ae5565b6113873383612acb565b5050565b6016818154811061139b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600280546113c490613a63565b80601f01602080910402602001604051908101604052809291908181526020018280546113f090613a63565b801561143d5780601f106114125761010080835404028352916020019161143d565b820191906000526020600020905b81548152906001019060200180831161142057829003601f168201915b5050505050905090565b600061145282612b58565b61146f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061149682612b8d565b9050806001600160a01b0316836001600160a01b031614156114cb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614611502576114e58133610a67565b611502576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600a546001600160a01b031633146115885760405162461bcd60e51b8152600401610b0890613826565b600b8190556000818152600d6020526040902055565b6115a9838383612bf6565b505050565b600a546001600160a01b031633146115d85760405162461bcd60e51b8152600401610b0890613826565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161166f5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061168e906001600160601b031687613a01565b61169891906139df565b915196919550909350505050565b600a546001600160a01b031633146116d05760405162461bcd60e51b8152600401610b0890613826565b6000601454116116df57600080fd5b60145461271090611388906109c49060009084906116fe908490613a01565b61170891906139df565b601a546040519192506000916001600160a01b039091169083908381818185875af1925050503d806000811461175a576040519150601f19603f3d011682016040523d82523d6000602084013e61175f565b606091505b50509050806117a55760405162461bcd60e51b81526020600482015260126024820152710ccc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610b08565b600085856014546117b69190613a01565b6117c091906139df565b6012546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611812576040519150601f19603f3d011682016040523d82523d6000602084013e611817565b606091505b50509050806118385760405162461bcd60e51b8152600401610b089061385b565b600084836014546118499190613a20565b6118539190613a20565b905060005b60165481101561193d5760006016828154811061187757611877613ae5565b60009182526020808320909101546001600160a01b0316808352601890915260408220549092508b906118aa9086613a01565b6118b491906139df565b90506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611903576040519150601f19603f3d011682016040523d82523d6000602084013e611908565b606091505b50509050806119295760405162461bcd60e51b8152600401610b089061385b565b5050508061193690613a9e565b9050611858565b5050600060145550505050505050565b600a546001600160a01b031633146119775760405162461bcd60e51b8152600401610b0890613826565b6000918252600d602052604090912060020155565b6115a98383836040518060200160405280600081525061210d565b600a546001600160a01b031633146119d15760405162461bcd60e51b8152600401610b0890613826565b6000918252600d60208181526040938490208351600b82015590830151600c820155928201519083015560600151600e90910155565b600a546001600160a01b03163314611a315760405162461bcd60e51b8152600401610b0890613826565b80600f6000856003811115611a4857611a48613acf565b6003811115611a5957611a59613acf565b8152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600a546001600160a01b03163314611abe5760405162461bcd60e51b8152600401610b0890613826565b805161138790600c90602084019061315b565b600a546001600160a01b03163314611afb5760405162461bcd60e51b8152600401610b0890613826565b6000918252600d60209081526040928390208251600f82015590820151601082015591810151601183015560600151601290910155565b600a546001600160a01b03163314611b5c5760405162461bcd60e51b8152600401610b0890613826565b6101f4601b541115611b945760405162461bcd60e51b81526020600482015260016024820152603b60f91b6044820152606401610b08565b60016000908152600d6020527ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c68054839290611bd19084906139c7565b9250508190555080601b6000828254611bea91906139c7565b9091555061138790508282612acb565b6015818154811061139b57600080fd5b6000610b5a82612b8d565b60006001600160a01b038216611c3e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b600a546001600160a01b03163314611c8e5760405162461bcd60e51b8152600401610b0890613826565b611c986000612d97565b565b600a546001600160a01b03163314611cc45760405162461bcd60e51b8152600401610b0890613826565b6000918252600d60209081526040928390208251600782015590820151600882015591810151600983015560600151600a90910155565b600b80546000908152600d602081815260408084208151610100810183528154815260018201548185015260028083015482850152835160808082018652600385015482526004850154828801526005850154828701526006850154606080840191909152808501929092528551808201875260078601548152600886015481890152600986015481880152600a860154818401528185015285518082018752998501548a52600c8501548a8801529684015489860152600e8401548982015260a083019890985283519586018452600f80840154875260108401548787015260118401548786015260128401549887019890985260c082019590955282518084018452601383015481526014909201548285015260e0810191909152928452938152815183527fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead90529190205460ff1615611e695760405162461bcd60e51b8152600401610b0890613898565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611eac8382612de9565b611ee15760405162461bcd60e51b8152600401610b08906020808252600490820152631b1a5cdd60e21b604082015260600190565b838260c0015160400151611ef59190613a01565b341015611f145760405162461bcd60e51b8152600401610b08906137e6565b60a08201516060015182516000908152600e60209081526040808320600284528252808320338452909152902054611f4d9086906139c7565b1115611f6b5760405162461bcd60e51b8152600401610b0890613805565b81608001516040015184836060015160400151611f8891906139c7565b1115611fa65760405162461bcd60e51b8152600401610b08906137c4565b8160400151848360200151611fbb91906139c7565b1115611fd95760405162461bcd60e51b8152600401610b0890613878565b600b546000908152600e602090815260408083206002845282528083203384529091528120805486929061200e9084906139c7565b92505081905550838260600151604001818151610e9191906139c7565b600a546001600160a01b031633146120555760405162461bcd60e51b8152600401610b0890613826565b805161138790601190602084019061315b565b6060600380546113c490613a63565b6001600160a01b0382163314156120a15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612118848484612bf6565b6001600160a01b0383163b15610f9c5761213484848484612e0a565b610f9c576040516368d2bf6b60e11b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561219557600080fd5b505afa1580156121a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cd9190613559565b9050600081116122095760405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606401610b08565b61271060005b6015548110156123055760006015828154811061222e5761222e613ae5565b60009182526020808320909101546001600160a01b03168083526017909152604082205490925084906122619087613a01565b61226b91906139df565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509087169063a9059cbb90604401602060405180830381600087803b1580156122b957600080fd5b505af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f19190613444565b505050806122fe90613a9e565b905061220f565b5050505050565b606061231782612b58565b61233457604051630a14c4b560e41b815260040160405180910390fd5b600061233e612f02565b905080516000141561235f576040518060200160405280600081525061238a565b8061236984612f11565b60405160200161237a929190613745565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146123bb5760405162461bcd60e51b8152600401610b0890613826565b6015546123c757600080fd5b600047116123d457600080fd5b61271060005b6015548110156124c2576000601582815481106123f9576123f9613ae5565b60009182526020808320909101546001600160a01b031680835260179091526040822054601354919350859161242f9190613a01565b61243991906139df565b90506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612488576040519150601f19603f3d011682016040523d82523d6000602084013e61248d565b606091505b50509050806124ae5760405162461bcd60e51b8152600401610b089061385b565b505050806124bb90613a9e565b90506123da565b50506000601355565b601180546124d890613a63565b80601f016020809104026020016040519081016040528092919081815260200182805461250490613a63565b80156125515780601f1061252657610100808354040283529160200191612551565b820191906000526020600020905b81548152906001019060200180831161253457829003601f168201915b505050505081565b600b80546000908152600d602081815260408084208151610100810183528154815260018201548185015260028201548184015282516080808201855260038085015483526004850154838801526005850154838701526006850154606080850191909152808501939093528551808301875260078601548152600886015481890152600986015481880152600a860154818501528285015285518083018752998501548a52600c8501548a8801529684015489860152600e8401548983015260a083019890985283519788018452600f80840154895260108401548987015260118401548986015260128401549189019190915260c082019790975282518084018452601383015481526014909201548285015260e0810191909152928452938152815183527f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682890529190205460ff16156126c75760405162461bcd60e51b8152600401610b0890613898565b818160c00151606001516126db9190613a01565b3410156126fa5760405162461bcd60e51b8152600401610b08906137e6565b8060800151606001518282606001516060015161271791906139c7565b11156127355760405162461bcd60e51b8152600401610b08906137c4565b806040015182826020015161274a91906139c7565b11156127685760405162461bcd60e51b8152600401610b0890613878565b81816060015160600181815161277e91906139c7565b9052506020810180518391906127959083906139c7565b905250600b80546000908152600d602081815260409283902085518155818601516001820155838601516002820155606080870151805160038401558084015160048401558086015160058401558101516006830155608087015180516007840155808401516008840155808601516009840155810151600a83015560a087015180519683019690965585830151600c830155858501519382019390935593820151600e85015560c08501518051600f860155808201516010860155928301516011850155910151601283015560e083015180516013840155015160149091015561137d34612970565b600a546001600160a01b031633146128a95760405162461bcd60e51b8152600401610b0890613826565b6001600160a01b03811661290e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b08565b61291781612d97565b50565b60006001600160e01b0319821663152a902d60e11b1480610b5a57506301ffc9a760e01b6001600160e01b0319831614610b5a565b600b546000908152600d602052604081206013015461238a90849084612f60565b6127106107606000826129838386613a01565b61298d91906139df565b905060008361299e836101f4613a01565b6129a891906139df565b905060006129b68284613a20565b6019546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114612a08576040519150601f19603f3d011682016040523d82523d6000602084013e612a0d565b606091505b5050905080612a2e5760405162461bcd60e51b8152600401610b089061385b565b6012546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612a7b576040519150601f19603f3d011682016040523d82523d6000602084013e612a80565b606091505b5050905080612aa15760405162461bcd60e51b8152600401610b089061385b565b612aab8589613a20565b60136000828254612abc91906139c7565b90915550505050505050505050565b611387828260405180602001604052806000815250612f76565b6019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612b32576040519150601f19603f3d011682016040523d82523d6000602084013e612b37565b606091505b50509050806113875760405162461bcd60e51b8152600401610b089061385b565b600081600111158015612b6c575060005482105b8015610b5a575050600090815260046020526040902054600160e01b161590565b60008180600111612bdd57600054811015612bdd57600081815260046020526040902054600160e01b8116612bdb575b8061238a575060001901600081815260046020526040902054612bbd565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612c0182612b8d565b9050836001600160a01b0316816001600160a01b031614612c345760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612c525750612c528533610a67565b80612c6d575033612c6284611447565b6001600160a01b0316145b905080612c8d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612cb457604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091529020600160e11b4260a01b861781179091558216612d515760018301600081815260046020526040902054612d4f576000548114612d4f5760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612305565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546000908152600d602052604081206014015461238a90849084612f60565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612e3f903390899088908890600401613774565b602060405180830381600087803b158015612e5957600080fd5b505af1925050508015612e89575060408051601f3d908101601f19168201909252612e869181019061347e565b60015b612ee4573d808015612eb7576040519150601f19603f3d011682016040523d82523d6000602084013e612ebc565b606091505b508051612edc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c80546113c490613a63565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612f4e57600183039250600a81066030018353600a9004612f30565b50819003601f19909101908152919050565b600082612f6d85846130e7565b14949350505050565b6000546001600160a01b038416612f9f57604051622e076360e81b815260040160405180910390fd5b82612fbd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15613092575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461305b6000878480600101955087612e0a565b613078576040516368d2bf6b60e11b815260040160405180910390fd5b80821061301057826000541461308d57600080fd5b6130d7565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613093575b506000908155610f9c9085838684565b600081815b845181101561315357600085828151811061310957613109613ae5565b6020026020010151905080831161312f5760008381526020829052604090209250613140565b600081815260208490526040902092505b508061314b81613a9e565b9150506130ec565b509392505050565b82805461316790613a63565b90600052602060002090601f01602090048101928261318957600085556131cf565b82601f106131a257805160ff19168380011785556131cf565b828001600101855582156131cf579182015b828111156131cf5782518255916020019190600101906131b4565b506131db9291506131df565b5090565b5b808211156131db57600081556001016131e0565b600067ffffffffffffffff83111561320e5761320e613afb565b613221601f8401601f1916602001613996565b905082815283838301111561323557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461326357600080fd5b919050565b80356004811061326357600080fd5b60006080828403121561328957600080fd5b6040516080810181811067ffffffffffffffff821117156132ac576132ac613afb565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b6000602082840312156132ef57600080fd5b61238a8261324c565b6000806040838503121561330b57600080fd5b6133148361324c565b91506133226020840161324c565b90509250929050565b60008060006060848603121561334057600080fd5b6133498461324c565b92506133576020850161324c565b9150604084013590509250925092565b6000806000806080858703121561337d57600080fd5b6133868561324c565b93506133946020860161324c565b925060408501359150606085013567ffffffffffffffff8111156133b757600080fd5b8501601f810187136133c857600080fd5b6133d7878235602084016131f4565b91505092959194509250565b600080604083850312156133f657600080fd5b6133ff8361324c565b9150602083013561340f81613b11565b809150509250929050565b6000806040838503121561342d57600080fd5b6134368361324c565b946020939093013593505050565b60006020828403121561345657600080fd5b815161238a81613b11565b60006020828403121561347357600080fd5b813561238a81613b1f565b60006020828403121561349057600080fd5b815161238a81613b1f565b600080604083850312156134ae57600080fd5b61343683613268565b6000806000606084860312156134cc57600080fd5b6134d584613268565b92506020840135915060408401356134ec81613b11565b809150509250925092565b60006020828403121561350957600080fd5b813567ffffffffffffffff81111561352057600080fd5b8201601f8101841361353157600080fd5b612efa848235602084016131f4565b60006020828403121561355257600080fd5b5035919050565b60006020828403121561356b57600080fd5b5051919050565b6000806040838503121561358557600080fd5b8235915060208084013567ffffffffffffffff808211156135a557600080fd5b818601915086601f8301126135b957600080fd5b8135818111156135cb576135cb613afb565b8060051b91506135dc848301613996565b8181528481019084860184860187018b10156135f757600080fd5b600095505b8386101561361a5780358352600195909501949186019186016135fc565b508096505050505050509250929050565b60008060006060848603121561364057600080fd5b8335925061365060208501613268565b915061365e6040850161324c565b90509250925092565b60008060a0838503121561367a57600080fd5b823591506133228460208501613277565b600080828403606081121561369f57600080fd5b833592506040601f19820112156136b557600080fd5b506040516040810181811067ffffffffffffffff821117156136d9576136d9613afb565b60409081526020858101358352940135938101939093525092909150565b6000806040838503121561370a57600080fd5b50508035926020909101359150565b60008151808452613731816020860160208601613a37565b601f01601f19169290920160200192915050565b60008351613757818460208801613a37565b83519083019061376b818360208801613a37565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137a790830184613719565b9695505050505050565b60208152600061238a6020830184613719565b602080825260089082015267737570706c69657360c01b604082015260600190565b602080825260059082015264707269636560d81b604082015260600190565b60208082526007908201526618db185a5b595960ca1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526003908201526208aa8960eb1b604082015260600190565b602080825260069082015265737570706c7960d01b604082015260600190565b6020808252600690820152651c185d5cd95960d21b604082015260600190565b88815260208101889052604081018790526102a081016138fc6060830188805182526020810151602083015260408101516040830152606081015160608301525050565b855160e08301526020860151610100830152604086015161012083015260608601516101408301528451610160830152602085015161018083015260408501516101a083015260608501516101c083015283516101e0830152602084015161020083015260408401516102208301526060840151610240830152825161026083015260208301516102808301529998505050505050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156139bf576139bf613afb565b604052919050565b600082198211156139da576139da613ab9565b500190565b6000826139fc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613a1b57613a1b613ab9565b500290565b600082821015613a3257613a32613ab9565b500390565b60005b83811015613a52578181015183820152602001613a3a565b83811115610f9c5750506000910152565b600181811c90821680613a7757607f821691505b60208210811415613a9857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ab257613ab2613ab9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461291757600080fd5b6001600160e01b03198116811461291757600080fdfea2646970667358221220af9c605a65416e31b3c4ee01cf4233fc0db5e642bbd5cfcba9747a8899ad9ee364736f6c634300080700330000000000000000000000000000000000000000000000000000000000000320
Deployed Bytecode
0x6080604052600436106103035760003560e01c806357a9cabc11610190578063b88d4fde116100dc578063d63f097611610095578063e985e9c51161006f578063e985e9c514610a4c578063efd0cbf914610a95578063f2fde38b14610aa8578063fe60d12c14610ac857600080fd5b8063d63f0976146109e7578063e3f5d12014610a22578063e8a3d48514610a3757600080fd5b8063b88d4fde14610913578063ba13a57214610933578063bce5826914610953578063c115327114610973578063c87b56dd146109b1578063d5abeb01146109d157600080fd5b80637dbf2b1e116101495780638da5cb5b116101235780638da5cb5b146108a0578063938e3d7b146108be57806395d89b41146108de578063a22cb465146108f357600080fd5b80637dbf2b1e1461085757806386d02608146108775780638a1b0bf91461088d57600080fd5b806357a9cabc146107a25780635ac9f9fc146107c25780635daf08ca146107e25780636352211e1461080257806370a0823114610822578063715018a61461084257600080fd5b80632d3e474a1161024f57806342842e0e116102085780634f8983f9116101e25780634f8983f91461062857806351044b541461064857806354fd4d501461076c57806355f804b31461078257600080fd5b806342842e0e146105bb57806345d72631146105db5780634ef7ad48146105fb57600080fd5b80632d3e474a146105035780632fb8a96e14610523578063310720b51461053857806337da577c1461054e5780633b7456ed1461056e578063400974d21461059b57600080fd5b8063081812fc116102bc57806318160ddd1161029657806318160ddd1461045d57806323b872dd146104845780632a332b2a146104a45780632a55205a146104c457600080fd5b8063081812fc146103fd578063095ea7b31461041d5780630a7b73821461043d57600080fd5b8063019866b31461032657806301ffc9a714610348578063061431a81461037d57806306a94cf61461039057806306cc1bdf146103a357806306fdde03146103db57600080fd5b3661032157346014600082825461031a91906139c7565b9091555050005b600080fd5b34801561033257600080fd5b5061034661034136600461368b565b610ade565b005b34801561035457600080fd5b50610368610363366004613461565b610b34565b60405190151581526020015b60405180910390f35b61034661038b366004613572565b610b60565b61034661039e366004613540565b610fa2565b3480156103af57600080fd5b506103c36103be366004613540565b61138b565b6040516001600160a01b039091168152602001610374565b3480156103e757600080fd5b506103f06113b5565b60405161037491906137b1565b34801561040957600080fd5b506103c3610418366004613540565b611447565b34801561042957600080fd5b5061034661043836600461341a565b61148b565b34801561044957600080fd5b50610346610458366004613540565b61155e565b34801561046957600080fd5b5060015460005403600019015b604051908152602001610374565b34801561049057600080fd5b5061034661049f36600461332b565b61159e565b3480156104b057600080fd5b506103466104bf3660046132dd565b6115ae565b3480156104d057600080fd5b506104e46104df3660046136f7565b6115fa565b604080516001600160a01b039093168352602083019190915201610374565b34801561050f57600080fd5b506019546103c3906001600160a01b031681565b34801561052f57600080fd5b506103466116a6565b34801561054457600080fd5b5061047660135481565b34801561055a57600080fd5b506103466105693660046136f7565b61194d565b34801561057a57600080fd5b506104766105893660046132dd565b60186020526000908152604090205481565b3480156105a757600080fd5b50601a546103c3906001600160a01b031681565b3480156105c757600080fd5b506103466105d636600461332b565b61198c565b3480156105e757600080fd5b506103466105f6366004613667565b6119a7565b34801561060757600080fd5b506104766106163660046132dd565b60176020526000908152604090205481565b34801561063457600080fd5b506103466106433660046134b7565b611a07565b34801561065457600080fd5b50610758610663366004613540565b600d60208181526000928352604092839020805460018201546002830154865160808082018952600386015482526004860154828801526005860154828a0152600686015460608084019190915289518083018b52600788015481526008880154818a01526009880154818c0152600a880154818301528a518084018c52600b8901548152600c890154818b0152998801548a8c0152600e8801548a8301528a519283018b52600f88015483526010880154838a01526011880154838c01526012880154918301919091528951808b01909a5260138701548a5260149096015496890196909652929691959094929392909188565b6040516103749897969594939291906138b8565b34801561077857600080fd5b50610476600b5481565b34801561078e57600080fd5b5061034661079d3660046134f7565b611a94565b3480156107ae57600080fd5b506103466107bd366004613667565b611ad1565b3480156107ce57600080fd5b506103466107dd36600461341a565b611b32565b3480156107ee57600080fd5b506103c36107fd366004613540565b611bfa565b34801561080e57600080fd5b506103c361081d366004613540565b611c0a565b34801561082e57600080fd5b5061047661083d3660046132dd565b611c15565b34801561084e57600080fd5b50610346611c64565b34801561086357600080fd5b50610346610872366004613667565b611c9a565b34801561088357600080fd5b5061047660145481565b61034661089b366004613572565b611cfb565b3480156108ac57600080fd5b50600a546001600160a01b03166103c3565b3480156108ca57600080fd5b506103466108d93660046134f7565b61202b565b3480156108ea57600080fd5b506103f0612068565b3480156108ff57600080fd5b5061034661090e3660046133e3565b612077565b34801561091f57600080fd5b5061034661092e366004613367565b61210d565b34801561093f57600080fd5b506012546103c3906001600160a01b031681565b34801561095f57600080fd5b5061034661096e3660046132dd565b612151565b34801561097f57600080fd5b5061047661098e36600461362b565b600e60209081526000938452604080852082529284528284209052825290205481565b3480156109bd57600080fd5b506103f06109cc366004613540565b61230c565b3480156109dd57600080fd5b5061047661753081565b3480156109f357600080fd5b50610368610a0236600461349b565b600f60209081526000928352604080842090915290825290205460ff1681565b348015610a2e57600080fd5b50610346612391565b348015610a4357600080fd5b506103f06124cb565b348015610a5857600080fd5b50610368610a673660046132f8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610346610aa3366004613540565b612559565b348015610ab457600080fd5b50610346610ac33660046132dd565b61287f565b348015610ad457600080fd5b50610476601b5481565b600a546001600160a01b03163314610b115760405162461bcd60e51b8152600401610b0890613826565b60405180910390fd5b6000918252600d6020908152604090922081516013820155910151601490910155565b6000610b3f8261291a565b80610b5a57506380ac58cd60e01b6001600160e01b03198316145b92915050565b600b80546000908152600d602081815260408084208151610100810183528154815260018083015482860152600283015482850152835160808082018652600385015482526004850154828801526005850154828701526006850154606080840191909152808501929092528551808201875260078601548152600886015481890152600986015481880152600a860154818401528185015285518082018752998501548a52600c8501548a8801529684015489860152600e8401548982015260a083019890985283519586018452600f80840154875260108401548787015260118401548786015260128401549887019890985260c082019590955282518084018452601383015481526014909201548285015260e0810191909152928452938152815183527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f90529190205460ff1615610cce5760405162461bcd60e51b8152600401610b0890613898565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610d11838261294f565b610d465760405162461bcd60e51b8152600401610b08906020808252600490820152631b1a5cdd60e21b604082015260600190565b838260c0015160200151610d5a9190613a01565b341015610d795760405162461bcd60e51b8152600401610b08906137e6565b60a082015160409081015183516000908152600e602090815283822060018352815283822033835290529190912054610db39086906139c7565b1115610dd15760405162461bcd60e51b8152600401610b0890613805565b81608001516020015184836060015160200151610dee91906139c7565b1115610e0c5760405162461bcd60e51b8152600401610b08906137c4565b8160400151848360200151610e2191906139c7565b1115610e3f5760405162461bcd60e51b8152600401610b0890613878565b600b546000908152600e6020908152604080832060018452825280832033845290915281208054869290610e749084906139c7565b92505081905550838260600151602001818151610e9191906139c7565b905250602082018051859190610ea89083906139c7565b905250600b80546000908152600d602081815260409283902086518155818701516001820155838701516002820155606080880151805160038401558084015160048401558086015160058401558101516006830155608088015180516007840155808401516008840155808601516009840155810151600a83015560a088015180519683019690965585830151600c830155858501519382019390935593820151600e85015560c08601518051600f860155808201516010860155928301516011850155910151601283015560e0840151805160138401550151601490910155610f9234612970565b610f9c3385612acb565b50505050565b600b54600114610fd85760405162461bcd60e51b81526020600482015260016024820152603b60f91b6044820152606401610b08565b600b80546000908152600d6020818152604080842081516101008101835281548152600182015481850152600282015481840152825160808082018552600384015482526004840154828701526005840154828601526006840154606080840191909152808401929092528451808201865260078501548152600885015481880152600985015481870152600a850154818401528184015284518082018652988401548952600c840154898701529583015488850152600e8301548882015260a082019790975282519485018352600f80830154865260108301548686015260118301548685015260128301549786019790975260c081019490945281518083018352601382015481526014909101548184015260e0840152838052938152815183527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37590529190205460ff16156111425760405162461bcd60e51b8152600401610b0890613898565b60c081015151611153908390613a01565b3410156111725760405162461bcd60e51b8152600401610b08906137e6565b60a08101515181516000908152600e6020908152604080832083805282528083203384529091529020546111a79084906139c7565b11156111c55760405162461bcd60e51b8152600401610b0890613805565b6080810151516060820151516111dc9084906139c7565b11156111fa5760405162461bcd60e51b8152600401610b08906137c4565b806040015182826020015161120f91906139c7565b111561122d5760405162461bcd60e51b8152600401610b0890613878565b81816060015160000181815161124391906139c7565b90525060208101805183919061125a9083906139c7565b905250600b546000908152600e602090815260408083208380528252808320338452909152812080548492906112919084906139c7565b9091555050600b80546000908152600d602081815260409283902085518155818601516001820155838601516002820155606080870151805160038401558084015160048401558086015160058401558101516006830155608087015180516007840155808401516008840155808601516009840155810151600a83015560a087015180519683019690965585830151600c830155858501519382019390935593820151600e85015560c08501518051600f860155808201516010860155928301516011850155910151601283015560e083015180516013840155015160149091015561137d34612ae5565b6113873383612acb565b5050565b6016818154811061139b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600280546113c490613a63565b80601f01602080910402602001604051908101604052809291908181526020018280546113f090613a63565b801561143d5780601f106114125761010080835404028352916020019161143d565b820191906000526020600020905b81548152906001019060200180831161142057829003601f168201915b5050505050905090565b600061145282612b58565b61146f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061149682612b8d565b9050806001600160a01b0316836001600160a01b031614156114cb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614611502576114e58133610a67565b611502576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600a546001600160a01b031633146115885760405162461bcd60e51b8152600401610b0890613826565b600b8190556000818152600d6020526040902055565b6115a9838383612bf6565b505050565b600a546001600160a01b031633146115d85760405162461bcd60e51b8152600401610b0890613826565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161166f5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061168e906001600160601b031687613a01565b61169891906139df565b915196919550909350505050565b600a546001600160a01b031633146116d05760405162461bcd60e51b8152600401610b0890613826565b6000601454116116df57600080fd5b60145461271090611388906109c49060009084906116fe908490613a01565b61170891906139df565b601a546040519192506000916001600160a01b039091169083908381818185875af1925050503d806000811461175a576040519150601f19603f3d011682016040523d82523d6000602084013e61175f565b606091505b50509050806117a55760405162461bcd60e51b81526020600482015260126024820152710ccc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610b08565b600085856014546117b69190613a01565b6117c091906139df565b6012546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611812576040519150601f19603f3d011682016040523d82523d6000602084013e611817565b606091505b50509050806118385760405162461bcd60e51b8152600401610b089061385b565b600084836014546118499190613a20565b6118539190613a20565b905060005b60165481101561193d5760006016828154811061187757611877613ae5565b60009182526020808320909101546001600160a01b0316808352601890915260408220549092508b906118aa9086613a01565b6118b491906139df565b90506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611903576040519150601f19603f3d011682016040523d82523d6000602084013e611908565b606091505b50509050806119295760405162461bcd60e51b8152600401610b089061385b565b5050508061193690613a9e565b9050611858565b5050600060145550505050505050565b600a546001600160a01b031633146119775760405162461bcd60e51b8152600401610b0890613826565b6000918252600d602052604090912060020155565b6115a98383836040518060200160405280600081525061210d565b600a546001600160a01b031633146119d15760405162461bcd60e51b8152600401610b0890613826565b6000918252600d60208181526040938490208351600b82015590830151600c820155928201519083015560600151600e90910155565b600a546001600160a01b03163314611a315760405162461bcd60e51b8152600401610b0890613826565b80600f6000856003811115611a4857611a48613acf565b6003811115611a5957611a59613acf565b8152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600a546001600160a01b03163314611abe5760405162461bcd60e51b8152600401610b0890613826565b805161138790600c90602084019061315b565b600a546001600160a01b03163314611afb5760405162461bcd60e51b8152600401610b0890613826565b6000918252600d60209081526040928390208251600f82015590820151601082015591810151601183015560600151601290910155565b600a546001600160a01b03163314611b5c5760405162461bcd60e51b8152600401610b0890613826565b6101f4601b541115611b945760405162461bcd60e51b81526020600482015260016024820152603b60f91b6044820152606401610b08565b60016000908152600d6020527ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c68054839290611bd19084906139c7565b9250508190555080601b6000828254611bea91906139c7565b9091555061138790508282612acb565b6015818154811061139b57600080fd5b6000610b5a82612b8d565b60006001600160a01b038216611c3e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b600a546001600160a01b03163314611c8e5760405162461bcd60e51b8152600401610b0890613826565b611c986000612d97565b565b600a546001600160a01b03163314611cc45760405162461bcd60e51b8152600401610b0890613826565b6000918252600d60209081526040928390208251600782015590820151600882015591810151600983015560600151600a90910155565b600b80546000908152600d602081815260408084208151610100810183528154815260018201548185015260028083015482850152835160808082018652600385015482526004850154828801526005850154828701526006850154606080840191909152808501929092528551808201875260078601548152600886015481890152600986015481880152600a860154818401528185015285518082018752998501548a52600c8501548a8801529684015489860152600e8401548982015260a083019890985283519586018452600f80840154875260108401548787015260118401548786015260128401549887019890985260c082019590955282518084018452601383015481526014909201548285015260e0810191909152928452938152815183527fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead90529190205460ff1615611e695760405162461bcd60e51b8152600401610b0890613898565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611eac8382612de9565b611ee15760405162461bcd60e51b8152600401610b08906020808252600490820152631b1a5cdd60e21b604082015260600190565b838260c0015160400151611ef59190613a01565b341015611f145760405162461bcd60e51b8152600401610b08906137e6565b60a08201516060015182516000908152600e60209081526040808320600284528252808320338452909152902054611f4d9086906139c7565b1115611f6b5760405162461bcd60e51b8152600401610b0890613805565b81608001516040015184836060015160400151611f8891906139c7565b1115611fa65760405162461bcd60e51b8152600401610b08906137c4565b8160400151848360200151611fbb91906139c7565b1115611fd95760405162461bcd60e51b8152600401610b0890613878565b600b546000908152600e602090815260408083206002845282528083203384529091528120805486929061200e9084906139c7565b92505081905550838260600151604001818151610e9191906139c7565b600a546001600160a01b031633146120555760405162461bcd60e51b8152600401610b0890613826565b805161138790601190602084019061315b565b6060600380546113c490613a63565b6001600160a01b0382163314156120a15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612118848484612bf6565b6001600160a01b0383163b15610f9c5761213484848484612e0a565b610f9c576040516368d2bf6b60e11b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561219557600080fd5b505afa1580156121a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cd9190613559565b9050600081116122095760405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606401610b08565b61271060005b6015548110156123055760006015828154811061222e5761222e613ae5565b60009182526020808320909101546001600160a01b03168083526017909152604082205490925084906122619087613a01565b61226b91906139df565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509087169063a9059cbb90604401602060405180830381600087803b1580156122b957600080fd5b505af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f19190613444565b505050806122fe90613a9e565b905061220f565b5050505050565b606061231782612b58565b61233457604051630a14c4b560e41b815260040160405180910390fd5b600061233e612f02565b905080516000141561235f576040518060200160405280600081525061238a565b8061236984612f11565b60405160200161237a929190613745565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146123bb5760405162461bcd60e51b8152600401610b0890613826565b6015546123c757600080fd5b600047116123d457600080fd5b61271060005b6015548110156124c2576000601582815481106123f9576123f9613ae5565b60009182526020808320909101546001600160a01b031680835260179091526040822054601354919350859161242f9190613a01565b61243991906139df565b90506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612488576040519150601f19603f3d011682016040523d82523d6000602084013e61248d565b606091505b50509050806124ae5760405162461bcd60e51b8152600401610b089061385b565b505050806124bb90613a9e565b90506123da565b50506000601355565b601180546124d890613a63565b80601f016020809104026020016040519081016040528092919081815260200182805461250490613a63565b80156125515780601f1061252657610100808354040283529160200191612551565b820191906000526020600020905b81548152906001019060200180831161253457829003601f168201915b505050505081565b600b80546000908152600d602081815260408084208151610100810183528154815260018201548185015260028201548184015282516080808201855260038085015483526004850154838801526005850154838701526006850154606080850191909152808501939093528551808301875260078601548152600886015481890152600986015481880152600a860154818501528285015285518083018752998501548a52600c8501548a8801529684015489860152600e8401548983015260a083019890985283519788018452600f80840154895260108401548987015260118401548986015260128401549189019190915260c082019790975282518084018452601383015481526014909201548285015260e0810191909152928452938152815183527f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682890529190205460ff16156126c75760405162461bcd60e51b8152600401610b0890613898565b818160c00151606001516126db9190613a01565b3410156126fa5760405162461bcd60e51b8152600401610b08906137e6565b8060800151606001518282606001516060015161271791906139c7565b11156127355760405162461bcd60e51b8152600401610b08906137c4565b806040015182826020015161274a91906139c7565b11156127685760405162461bcd60e51b8152600401610b0890613878565b81816060015160600181815161277e91906139c7565b9052506020810180518391906127959083906139c7565b905250600b80546000908152600d602081815260409283902085518155818601516001820155838601516002820155606080870151805160038401558084015160048401558086015160058401558101516006830155608087015180516007840155808401516008840155808601516009840155810151600a83015560a087015180519683019690965585830151600c830155858501519382019390935593820151600e85015560c08501518051600f860155808201516010860155928301516011850155910151601283015560e083015180516013840155015160149091015561137d34612970565b600a546001600160a01b031633146128a95760405162461bcd60e51b8152600401610b0890613826565b6001600160a01b03811661290e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b08565b61291781612d97565b50565b60006001600160e01b0319821663152a902d60e11b1480610b5a57506301ffc9a760e01b6001600160e01b0319831614610b5a565b600b546000908152600d602052604081206013015461238a90849084612f60565b6127106107606000826129838386613a01565b61298d91906139df565b905060008361299e836101f4613a01565b6129a891906139df565b905060006129b68284613a20565b6019546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114612a08576040519150601f19603f3d011682016040523d82523d6000602084013e612a0d565b606091505b5050905080612a2e5760405162461bcd60e51b8152600401610b089061385b565b6012546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612a7b576040519150601f19603f3d011682016040523d82523d6000602084013e612a80565b606091505b5050905080612aa15760405162461bcd60e51b8152600401610b089061385b565b612aab8589613a20565b60136000828254612abc91906139c7565b90915550505050505050505050565b611387828260405180602001604052806000815250612f76565b6019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612b32576040519150601f19603f3d011682016040523d82523d6000602084013e612b37565b606091505b50509050806113875760405162461bcd60e51b8152600401610b089061385b565b600081600111158015612b6c575060005482105b8015610b5a575050600090815260046020526040902054600160e01b161590565b60008180600111612bdd57600054811015612bdd57600081815260046020526040902054600160e01b8116612bdb575b8061238a575060001901600081815260046020526040902054612bbd565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612c0182612b8d565b9050836001600160a01b0316816001600160a01b031614612c345760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612c525750612c528533610a67565b80612c6d575033612c6284611447565b6001600160a01b0316145b905080612c8d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612cb457604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091529020600160e11b4260a01b861781179091558216612d515760018301600081815260046020526040902054612d4f576000548114612d4f5760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612305565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546000908152600d602052604081206014015461238a90849084612f60565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612e3f903390899088908890600401613774565b602060405180830381600087803b158015612e5957600080fd5b505af1925050508015612e89575060408051601f3d908101601f19168201909252612e869181019061347e565b60015b612ee4573d808015612eb7576040519150601f19603f3d011682016040523d82523d6000602084013e612ebc565b606091505b508051612edc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c80546113c490613a63565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612f4e57600183039250600a81066030018353600a9004612f30565b50819003601f19909101908152919050565b600082612f6d85846130e7565b14949350505050565b6000546001600160a01b038416612f9f57604051622e076360e81b815260040160405180910390fd5b82612fbd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15613092575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461305b6000878480600101955087612e0a565b613078576040516368d2bf6b60e11b815260040160405180910390fd5b80821061301057826000541461308d57600080fd5b6130d7565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613093575b506000908155610f9c9085838684565b600081815b845181101561315357600085828151811061310957613109613ae5565b6020026020010151905080831161312f5760008381526020829052604090209250613140565b600081815260208490526040902092505b508061314b81613a9e565b9150506130ec565b509392505050565b82805461316790613a63565b90600052602060002090601f01602090048101928261318957600085556131cf565b82601f106131a257805160ff19168380011785556131cf565b828001600101855582156131cf579182015b828111156131cf5782518255916020019190600101906131b4565b506131db9291506131df565b5090565b5b808211156131db57600081556001016131e0565b600067ffffffffffffffff83111561320e5761320e613afb565b613221601f8401601f1916602001613996565b905082815283838301111561323557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461326357600080fd5b919050565b80356004811061326357600080fd5b60006080828403121561328957600080fd5b6040516080810181811067ffffffffffffffff821117156132ac576132ac613afb565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b6000602082840312156132ef57600080fd5b61238a8261324c565b6000806040838503121561330b57600080fd5b6133148361324c565b91506133226020840161324c565b90509250929050565b60008060006060848603121561334057600080fd5b6133498461324c565b92506133576020850161324c565b9150604084013590509250925092565b6000806000806080858703121561337d57600080fd5b6133868561324c565b93506133946020860161324c565b925060408501359150606085013567ffffffffffffffff8111156133b757600080fd5b8501601f810187136133c857600080fd5b6133d7878235602084016131f4565b91505092959194509250565b600080604083850312156133f657600080fd5b6133ff8361324c565b9150602083013561340f81613b11565b809150509250929050565b6000806040838503121561342d57600080fd5b6134368361324c565b946020939093013593505050565b60006020828403121561345657600080fd5b815161238a81613b11565b60006020828403121561347357600080fd5b813561238a81613b1f565b60006020828403121561349057600080fd5b815161238a81613b1f565b600080604083850312156134ae57600080fd5b61343683613268565b6000806000606084860312156134cc57600080fd5b6134d584613268565b92506020840135915060408401356134ec81613b11565b809150509250925092565b60006020828403121561350957600080fd5b813567ffffffffffffffff81111561352057600080fd5b8201601f8101841361353157600080fd5b612efa848235602084016131f4565b60006020828403121561355257600080fd5b5035919050565b60006020828403121561356b57600080fd5b5051919050565b6000806040838503121561358557600080fd5b8235915060208084013567ffffffffffffffff808211156135a557600080fd5b818601915086601f8301126135b957600080fd5b8135818111156135cb576135cb613afb565b8060051b91506135dc848301613996565b8181528481019084860184860187018b10156135f757600080fd5b600095505b8386101561361a5780358352600195909501949186019186016135fc565b508096505050505050509250929050565b60008060006060848603121561364057600080fd5b8335925061365060208501613268565b915061365e6040850161324c565b90509250925092565b60008060a0838503121561367a57600080fd5b823591506133228460208501613277565b600080828403606081121561369f57600080fd5b833592506040601f19820112156136b557600080fd5b506040516040810181811067ffffffffffffffff821117156136d9576136d9613afb565b60409081526020858101358352940135938101939093525092909150565b6000806040838503121561370a57600080fd5b50508035926020909101359150565b60008151808452613731816020860160208601613a37565b601f01601f19169290920160200192915050565b60008351613757818460208801613a37565b83519083019061376b818360208801613a37565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137a790830184613719565b9695505050505050565b60208152600061238a6020830184613719565b602080825260089082015267737570706c69657360c01b604082015260600190565b602080825260059082015264707269636560d81b604082015260600190565b60208082526007908201526618db185a5b595960ca1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526003908201526208aa8960eb1b604082015260600190565b602080825260069082015265737570706c7960d01b604082015260600190565b6020808252600690820152651c185d5cd95960d21b604082015260600190565b88815260208101889052604081018790526102a081016138fc6060830188805182526020810151602083015260408101516040830152606081015160608301525050565b855160e08301526020860151610100830152604086015161012083015260608601516101408301528451610160830152602085015161018083015260408501516101a083015260608501516101c083015283516101e0830152602084015161020083015260408401516102208301526060840151610240830152825161026083015260208301516102808301529998505050505050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156139bf576139bf613afb565b604052919050565b600082198211156139da576139da613ab9565b500190565b6000826139fc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613a1b57613a1b613ab9565b500290565b600082821015613a3257613a32613ab9565b500390565b60005b83811015613a52578181015183820152602001613a3a565b83811115610f9c5750506000910152565b600181811c90821680613a7757607f821691505b60208210811415613a9857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ab257613ab2613ab9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461291757600080fd5b6001600160e01b03198116811461291757600080fdfea2646970667358221220af9c605a65416e31b3c4ee01cf4233fc0db5e642bbd5cfcba9747a8899ad9ee364736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000320
-----Decoded View---------------
Arg [0] : _royaltyFeesInbips (uint96): 800
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000320
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.