More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 252 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Listing | 17744573 | 371 days ago | IN | 0 ETH | 0.00658586 | ||||
Add Mogul NFT Ad... | 16878969 | 493 days ago | IN | 0 ETH | 0.00189692 | ||||
Create Auction | 16407070 | 559 days ago | IN | 0 ETH | 0.00546103 | ||||
Buy Tokens | 15948890 | 623 days ago | IN | 0 ETH | 0.00303064 | ||||
Buy Tokens | 15736510 | 653 days ago | IN | 0.3 ETH | 0.00141101 | ||||
Create Listing | 15596992 | 673 days ago | IN | 0 ETH | 0.00475418 | ||||
Create Listing | 15596988 | 673 days ago | IN | 0 ETH | 0.00471201 | ||||
Create Listing | 15596974 | 673 days ago | IN | 0 ETH | 0.00370468 | ||||
Add Mogul NFT Ad... | 15596948 | 673 days ago | IN | 0 ETH | 0.0012389 | ||||
Create Listing | 15108868 | 749 days ago | IN | 0 ETH | 0.00804269 | ||||
Create Listing | 15108861 | 749 days ago | IN | 0 ETH | 0.00669587 | ||||
Cancel Listing | 15108853 | 749 days ago | IN | 0 ETH | 0.00323321 | ||||
Create Listing | 15108844 | 749 days ago | IN | 0 ETH | 0.00875611 | ||||
Cancel Listing | 15108811 | 749 days ago | IN | 0 ETH | 0.00083423 | ||||
Create Listing | 15108796 | 749 days ago | IN | 0 ETH | 0.00278311 | ||||
Cancel Listing | 14773877 | 805 days ago | IN | 0 ETH | 0.00380882 | ||||
Create Listing | 14741771 | 810 days ago | IN | 0 ETH | 0.00901924 | ||||
Create Listing | 14600495 | 832 days ago | IN | 0 ETH | 0.0054789 | ||||
Change Listing P... | 14581342 | 835 days ago | IN | 0 ETH | 0.00099081 | ||||
Create Listing | 14534204 | 842 days ago | IN | 0 ETH | 0.01185884 | ||||
Create Listing | 14447834 | 856 days ago | IN | 0 ETH | 0.00462443 | ||||
Change Listing P... | 14434250 | 858 days ago | IN | 0 ETH | 0.00088739 | ||||
Buy Tokens | 14428794 | 859 days ago | IN | 0.09128 ETH | 0.00204771 | ||||
Buy Tokens | 14424606 | 860 days ago | IN | 0.03 ETH | 0.0022346 | ||||
Cancel Listing | 14382146 | 866 days ago | IN | 0 ETH | 0.00289741 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15736510 | 653 days ago | 0.3 ETH | ||||
14428794 | 859 days ago | 0.09128 ETH | ||||
14424606 | 860 days ago | 0.03 ETH | ||||
13532549 | 999 days ago | 0.0625 ETH | ||||
13532549 | 999 days ago | 1.1875 ETH | ||||
13532533 | 999 days ago | 0.05 ETH | ||||
13532533 | 999 days ago | 0.95 ETH | ||||
13532503 | 999 days ago | 0.04 ETH | ||||
13532503 | 999 days ago | 0.76 ETH | ||||
13532490 | 999 days ago | 0.035 ETH | ||||
13532490 | 999 days ago | 0.665 ETH | ||||
13521102 | 1000 days ago | 0.0425 ETH | ||||
13521102 | 1000 days ago | 0.8075 ETH | ||||
13515617 | 1001 days ago | 0.065 ETH | ||||
13515617 | 1001 days ago | 1.235 ETH | ||||
13515234 | 1001 days ago | 0.0625 ETH | ||||
13515234 | 1001 days ago | 1.1875 ETH | ||||
13515222 | 1001 days ago | 0.055 ETH | ||||
13515222 | 1001 days ago | 1.045 ETH | ||||
13515212 | 1001 days ago | 0.032 ETH | ||||
13515212 | 1001 days ago | 0.608 ETH | ||||
13515204 | 1001 days ago | 0.036 ETH | ||||
13515204 | 1001 days ago | 0.684 ETH | ||||
13515197 | 1001 days ago | 0.7 ETH | ||||
13515197 | 1001 days ago | 0.7 ETH |
Loading...
Loading
Contract Name:
MogulMarketplaceERC1155
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.0; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; contract MogulMarketplaceERC1155 is ERC1155Holder, AccessControl, ReentrancyGuard { using EnumerableSet for EnumerableSet.UintSet; using EnumerableSet for EnumerableSet.AddressSet; using SafeERC20 for IERC20; bytes32 public constant ROLE_ADMIN = keccak256("ROLE_ADMIN"); address payable public treasuryWallet; IERC20 stars; uint256 public nextListingId; uint256 public nextAuctionId; uint256 public starsFeeBasisPoint; //4 decimals, applies to auctions and listings. Fees collected are held in contract uint256 public ethFeeBasisPoint; //4 decimals, applies to auctions and listings. Fees collected are held in contract uint256 public adminEth; //Total Ether available for withdrawal uint256 public adminStars; //Total Stars available for withdrawal uint256 private highestCommissionBasisPoint; //Used to determine what the maximum fee uint256 public starsAvailableForCashBack; //STARS available for cashback uint256 public starsCashBackBasisPoint; bool public starsAllowed = true; bool public ethAllowed = true; struct Listing { address payable seller; address tokenAddress; uint256 tokenId; uint256 tokenAmount; uint256 starsPrice; uint256 ethPrice; bool isStarsListing; bool isEthListing; } struct Auction { address payable seller; address tokenAddress; uint256 tokenId; uint256 tokenAmount; uint256 startingPrice; uint256 startTime; uint256 endTime; uint256 reservePrice; bool isStarsAuction; Bid highestBid; } struct Bid { address payable bidder; uint256 amount; } struct TokenCommissionInfo { address payable artistAddress; uint256 commissionBasisPoint; //4 decimals } EnumerableSet.AddressSet private mogulNFTs; EnumerableSet.UintSet private listingIds; EnumerableSet.UintSet private auctionIds; mapping(uint256 => Listing) public listings; mapping(uint256 => Auction) public auctions; mapping(address => mapping(uint256 => TokenCommissionInfo)) public commissions; //NFT address to (token ID to TokenCommissionInfo) event ListingCreated( uint256 listingId, address seller, address tokenAddress, uint256 tokenId, uint256 tokenAmount, uint256 starsPrice, uint256 ethPrice, bool isStarsListing, bool isEthListing ); event ListingCancelled(uint256 listingId); event ListingPriceChanged( uint256 listingId, uint256 newPrice, bool isStarsPrice ); event AuctionCreated( uint256 auctionId, address seller, address tokenAddress, uint256 tokenId, uint256 tokenAmount, uint256 startingPrice, uint256 startTime, uint256 endTime, uint256 reservePrice, bool isStarsAuction ); event SaleMade( address buyer, uint256 listingId, uint256 amount, bool isStarsPurchase ); event BidPlaced( address bidder, uint256 auctionId, uint256 amount, bool isStarsBid ); event AuctionClaimed(address winner, uint256 auctionId); event AuctionCancelled(uint256 auctionId); event AuctionReservePriceChanged( uint256 auctionId, uint256 newReservePrice ); event TokenCommissionSingleAdded( address tokenAddress, uint256 tokenId, address artistAddress, uint256 commissionBasisPoint ); event TokenCommissionBulkAdded( address tokenAddress, uint256[] tokenIds, address payable[] artistAddresses, uint256[] commissionBasisPoints ); event StarsCashBackBasisPointSet(uint256 newStarsCashBackBasisPoint); event StarsFeeBasisPointSet(uint256 newStarsFeeBasisPoint); event EthFeeBasisPointSet(uint256 newEthFeeBasisPoint); modifier onlyAdmin { require(hasRole(ROLE_ADMIN, msg.sender), "Sender is not admin"); _; } modifier sellerOrAdmin(address seller) { require( msg.sender == seller || hasRole(ROLE_ADMIN, msg.sender), "Sender is not seller or admin" ); _; } /** * @dev Stores the Stars contract, and allows users with the admin role to * grant/revoke the admin role from other users. Stores treasury wallet. * * Params: * starsAddress: the address of the Stars contract * _admin: address of the first admin * _treasuryWallet: address of treasury wallet * _mogulNFTAddress: address of a Mogul NFT */ constructor( address starsAddress, address _admin, address payable _treasuryWallet, address _mogulNFTAddress ) { require( _treasuryWallet != address(0), "Treasury wallet cannot be 0 address" ); _setupRole(ROLE_ADMIN, _admin); _setRoleAdmin(ROLE_ADMIN, ROLE_ADMIN); treasuryWallet = _treasuryWallet; stars = IERC20(starsAddress); mogulNFTs.add(_mogulNFTAddress); } //Allows contract to inherit both ERC1155Receiver and AccessControl function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155Receiver, AccessControl) returns (bool) { return interfaceId == type(ERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } //Get number of listings function getNumListings() external view returns (uint256) { return listingIds.length(); } /** * @dev Get listing ID at index * * Params: * indices: indices of IDs */ function getListingIds(uint256[] memory indices) external view returns (uint256[] memory) { uint256[] memory output = new uint256[](indices.length); for (uint256 i = 0; i < indices.length; i++) { output[i] = listingIds.at(indices[i]); } return output; } /** * @dev Get listing correlated to index * * Params: * indices: indices of IDs */ function getListingsAtIndices(uint256[] memory indices) external view returns (Listing[] memory) { Listing[] memory output = new Listing[](indices.length); for (uint256 i = 0; i < indices.length; i++) { output[i] = listings[listingIds.at(indices[i])]; } return output; } //Get number of auctions function getNumAuctions() external view returns (uint256) { return auctionIds.length(); } /** * @dev Get auction ID at index * * Params: * indices: indices of IDs */ function getAuctionIds(uint256[] memory indices) external view returns (uint256[] memory) { uint256[] memory output = new uint256[](indices.length); for (uint256 i = 0; i < indices.length; i++) { output[i] = auctionIds.at(indices[i]); } return output; } /** * @dev Get auction correlated to index * * Params: * indices: indices of IDs */ function getAuctionsAtIndices(uint256[] memory indices) external view returns (Auction[] memory) { Auction[] memory output = new Auction[](indices.length); for (uint256 i = 0; i < indices.length; i++) { output[i] = auctions[auctionIds.at(indices[i])]; } return output; } /** * @dev Get commission info for array of tokens * * Params: * NFTAddress: address of NFT * tokenIds: token IDs */ function getCommissionInfoForTokens( address NFTAddress, uint256[] memory tokenIds ) external view returns (TokenCommissionInfo[] memory) { TokenCommissionInfo[] memory output = new TokenCommissionInfo[](tokenIds.length); for (uint256 i = 0; i < tokenIds.length; i++) { output[i] = commissions[NFTAddress][tokenIds[i]]; } return output; } /** * @dev Create a new listing * * Params: * tokenAddress: address of token to list * tokenId: id of token * tokenAmount: number of tokens * starsPrice: listing STARS price * ethPrice: listing ETH price * isStarsListing: whether or not the listing can be sold for STARS * isEthListing: whether or not the listing can be sold for ETH * * Requirements: * - Listings of given currencies are allowed * - Price of given currencies are not 0 * - mogulNFTs contains tokenAddress */ function createListing( address tokenAddress, uint256 tokenId, uint256 tokenAmount, uint256 starsPrice, uint256 ethPrice, bool isStarsListing, bool isEthListing ) public nonReentrant() { require( mogulNFTs.contains(tokenAddress), "Only Mogul NFTs can be listed" ); if (isStarsListing) { require(starsPrice != 0, "Price cannot be 0"); } if (isEthListing) { require(ethPrice != 0, "Price cannot be 0"); } require(tokenAmount != 0, "Cannot list 0 tokens"); if (isStarsListing) { require(starsAllowed, "STARS listings are not allowed"); } if (isEthListing) { require(ethAllowed, "ETH listings are not allowed"); } IERC1155 token = IERC1155(tokenAddress); token.safeTransferFrom( msg.sender, address(this), tokenId, tokenAmount, "" ); uint256 listingId = generateListingId(); listings[listingId] = Listing( payable(msg.sender), tokenAddress, tokenId, tokenAmount, starsPrice, ethPrice, isStarsListing, isEthListing ); listingIds.add(listingId); emit ListingCreated( listingId, msg.sender, tokenAddress, tokenId, tokenAmount, starsPrice, ethPrice, isStarsListing, isEthListing ); } /** * @dev Batch create new listings * * Params: * tokenAddresses: addresses of tokens to list * tokenIds: id of each token * tokenAmounts: amount of each token to list * starsPrices: STARS price of each listing * ethPrices: ETH price of each listing * areStarsListings: whether or not each listing can be sold for Stars * areEthListings: whether or not each listing can be sold for ETH * * Requirements: * - All inputs are the same length */ function batchCreateListings( address[] calldata tokenAddresses, uint256[] calldata tokenIds, uint256[] calldata tokenAmounts, uint256[] calldata starsPrices, uint256[] calldata ethPrices, bool[] memory areStarsListings, bool[] memory areEthListings ) external onlyAdmin { require( tokenAddresses.length == tokenIds.length && tokenIds.length == tokenAmounts.length && tokenAmounts.length == starsPrices.length && starsPrices.length == ethPrices.length && ethPrices.length == areStarsListings.length && areStarsListings.length == areEthListings.length, "Incorrect input lengths" ); for (uint256 i = 0; i < tokenAddresses.length; i++) { createListing( tokenAddresses[i], tokenIds[i], tokenAmounts[i], starsPrices[i], ethPrices[i], areStarsListings[i], areEthListings[i] ); } } /** * @dev Cancel a listing * * Params: * listingId: listing ID */ function cancelListing(uint256 listingId) public sellerOrAdmin(listings[listingId].seller) nonReentrant() { require(listingIds.contains(listingId), "Listing does not exist"); Listing storage listing = listings[listingId]; listingIds.remove(listingId); IERC1155 token = IERC1155(listing.tokenAddress); token.safeTransferFrom( address(this), listing.seller, listing.tokenId, listing.tokenAmount, "" ); emit ListingCancelled(listingId); } function batchCancelListing(uint256[] calldata _listingIds) external onlyAdmin { for (uint256 i = 0; i < _listingIds.length; i++) { cancelListing(_listingIds[i]); } } /** * @dev Change price of a listing * * Params: * listingId: listing ID * newPrice: price to change to * isStarsPrice: whether or not the price being changed is in STARS * * Requirements: * - newPrice is not 0 */ function changeListingPrice( uint256 listingId, uint256 newPrice, bool isStarsPrice ) external sellerOrAdmin(listings[listingId].seller) { require(newPrice != 0, "Price cannot be 0"); if (isStarsPrice) { listings[listingId].starsPrice = newPrice; } else { listings[listingId].ethPrice = newPrice; } emit ListingPriceChanged(listingId, newPrice, isStarsPrice); } /** * @dev Buy a token * * Params: * listingId: listing ID * amount: amount tokens to buy * expectedPrice: expected price of purchase * isStarsPurchase: whether or not the user is buying with STARS */ function buyTokens( uint256 listingId, uint256 amount, uint256 expectedPrice, bool isStarsPurchase ) external payable nonReentrant() { require(listingIds.contains(listingId), "Listing does not exist."); Listing storage listing = listings[listingId]; require(listing.tokenAmount >= amount, "Not enough tokens remaining"); if (isStarsPurchase) { require(listing.isStarsListing, "Listing does not accept STARS"); uint256 fullAmount = listing.starsPrice * amount; require(fullAmount == expectedPrice, "Incorrect expected price"); uint256 fee = (fullAmount * starsFeeBasisPoint) / 10000; uint256 commission = (fullAmount * commissions[listing.tokenAddress][listing.tokenId] .commissionBasisPoint) / 10000; if (fee != 0) { stars.safeTransferFrom(msg.sender, address(this), fee); } if ( commissions[listing.tokenAddress][listing.tokenId] .artistAddress != address(0) ) { stars.safeTransferFrom( msg.sender, commissions[listing.tokenAddress][listing.tokenId] .artistAddress, commission ); } stars.safeTransferFrom( msg.sender, listing.seller, fullAmount - fee - commission ); if (starsCashBackBasisPoint != 0) { uint256 totalStarsCashBack = (fullAmount * starsCashBackBasisPoint) / 10000; if (starsAvailableForCashBack >= totalStarsCashBack) { starsAvailableForCashBack -= totalStarsCashBack; stars.safeTransfer(msg.sender, totalStarsCashBack); } } adminStars += fee; } else { require(listing.isEthListing, "Listing does not accept ETH"); uint256 fullAmount = listing.ethPrice * amount; require(fullAmount == expectedPrice, "Incorrect expected price"); uint256 fee = (fullAmount * ethFeeBasisPoint) / 10000; uint256 commission = (fullAmount * commissions[listing.tokenAddress][listing.tokenId] .commissionBasisPoint) / 10000; require(msg.value == fullAmount, "Incorrect transaction value"); (bool success, ) = listing.seller.call{value: fullAmount - fee - commission}(""); require(success, "Payment failure"); if ( commissions[listing.tokenAddress][listing.tokenId] .artistAddress != address(0) ) { (success, ) = commissions[listing.tokenAddress][listing.tokenId] .artistAddress .call{value: commission}(""); require(success, "Payment failure"); } adminEth += fee; } listing.tokenAmount -= amount; if (listing.tokenAmount == 0) { listingIds.remove(listingId); } IERC1155 token = IERC1155(listing.tokenAddress); token.safeTransferFrom( address(this), msg.sender, listing.tokenId, amount, "" ); emit SaleMade(msg.sender, listingId, amount, isStarsPurchase); } /** * @dev Create an auction * * Params: * tokenAddress: address of token * tokenId: token ID * tokenAmount: number of tokens the winner will get * startingPrice: starting price for bids * startTime: auction start time * endTime: auction end time * reservePrice: reserve price * isStarsAuction: whether or not Auction is in Stars */ function createAuction( address tokenAddress, uint256 tokenId, uint256 tokenAmount, uint256 startingPrice, uint256 startTime, uint256 endTime, uint256 reservePrice, bool isStarsAuction ) public nonReentrant() { require(startTime < endTime, "End time must be after start time"); require( startTime > block.timestamp, "Auction must start in the future" ); require( mogulNFTs.contains(tokenAddress), "Only Mogul NFTs can be listed" ); require(tokenAmount != 0, "Cannot auction 0 tokens"); if (isStarsAuction) { require(starsAllowed, "STARS auctions are not allowed"); } else { require(ethAllowed, "ETH auctions are not allowed."); } IERC1155 token = IERC1155(tokenAddress); token.safeTransferFrom( msg.sender, address(this), tokenId, tokenAmount, "" ); uint256 auctionId = generateAuctionId(); auctions[auctionId] = Auction( payable(msg.sender), tokenAddress, tokenId, tokenAmount, startingPrice, startTime, endTime, reservePrice, isStarsAuction, Bid(payable(msg.sender), 0) ); auctionIds.add(auctionId); emit AuctionCreated( auctionId, payable(msg.sender), tokenAddress, tokenId, tokenAmount, startingPrice, startTime, endTime, reservePrice, isStarsAuction ); } /** * @dev Batch create new auctions * * Params: * tokenAddresses: addresses of tokens to auction * tokenIds: id of each token * tokenAmounts: amount of each token to auction * startingPrices: starting price of each auction * startTimes: start time of each auction * endTimes: end time of each auction * reservePrices: reserve price of each auction * areStarsAuctions: whether or not each auction is in Stars * * Requirements: * - All inputs are the same length */ function batchCreateAuctions( address[] calldata tokenAddresses, uint256[] calldata tokenIds, uint256[] calldata tokenAmounts, uint256[] calldata startingPrices, uint256[] memory startTimes, uint256[] memory endTimes, uint256[] memory reservePrices, bool[] memory areStarsAuctions ) external onlyAdmin { require( tokenAddresses.length == tokenIds.length && tokenIds.length == tokenAmounts.length && tokenAmounts.length == startingPrices.length && startingPrices.length == startTimes.length && startTimes.length == endTimes.length && endTimes.length == reservePrices.length && reservePrices.length == areStarsAuctions.length, "Incorrect input lengths" ); for (uint256 i = 0; i < tokenAddresses.length; i++) { createAuction( tokenAddresses[i], tokenIds[i], tokenAmounts[i], startingPrices[i], startTimes[i], endTimes[i], reservePrices[i], areStarsAuctions[i] ); } } /** * @dev Place a bid and refund the previous highest bidder * * Params: * auctionId: auction ID * isStarsBid: true if bid is in Stars, false if it's in eth * amount: amount of bid * * Requirements: * Bid is higher than the previous highest bid */ function placeBid(uint256 auctionId, uint256 amount) external payable nonReentrant() { require(auctionIds.contains(auctionId), "Auction does not exist."); Auction storage auction = auctions[auctionId]; require( block.timestamp >= auction.startTime, "Auction has not started yet" ); require(block.timestamp <= auction.endTime, "Auction has ended"); require( amount > auction.highestBid.amount, "Bid is lower than highest bid" ); require( amount > auction.startingPrice, "Bid must be higher than starting price" ); if (auction.isStarsAuction) { stars.safeTransferFrom(msg.sender, address(this), amount); stars.safeTransfer( auction.highestBid.bidder, auction.highestBid.amount ); auction.highestBid = Bid(payable(msg.sender), amount); } else { require(amount == msg.value, "Amount does not match message value"); (bool success, ) = auction.highestBid.bidder.call{ value: auction.highestBid.amount }(""); require(success, "Payment failure"); auction.highestBid = Bid(payable(msg.sender), amount); } emit BidPlaced(msg.sender, auctionId, amount, auction.isStarsAuction); } /** * @dev End auctions and distributes tokens to the winner, bid to the * seller, and fees to the contract. If the reserve price was not met, only * the seller or admin can call this function. * * Params: * auctionId: auction ID */ function claimAuction(uint256 auctionId) public nonReentrant() { require(auctionIds.contains(auctionId), "Auction does not exist"); Auction memory auction = auctions[auctionId]; require(block.timestamp >= auction.endTime, "Auction is ongoing"); if (msg.sender != auction.seller && !hasRole(ROLE_ADMIN, msg.sender)) { require( auction.highestBid.amount >= auction.reservePrice, "Highest bid did not meet the reserve price." ); } address winner; uint256 fee; if (auction.isStarsAuction) { fee = (auction.highestBid.amount * starsFeeBasisPoint) / 10000; } else { fee = (auction.highestBid.amount * ethFeeBasisPoint) / 10000; } uint256 commission = (auction.highestBid.amount * commissions[auction.tokenAddress][auction.tokenId] .commissionBasisPoint) / 10000; winner = auction.highestBid.bidder; if (auction.isStarsAuction) { stars.safeTransfer( auction.seller, auction.highestBid.amount - fee - commission ); if ( commissions[auction.tokenAddress][auction.tokenId] .artistAddress != address(0) ) { stars.safeTransfer( commissions[auction.tokenAddress][auction.tokenId] .artistAddress, commission ); } if (starsCashBackBasisPoint != 0) { uint256 totalStarsCashBack = (auction.highestBid.amount * starsCashBackBasisPoint) / 10000; if (starsAvailableForCashBack >= totalStarsCashBack) { starsAvailableForCashBack -= totalStarsCashBack; stars.safeTransfer( auction.highestBid.bidder, totalStarsCashBack ); } } adminStars += fee; } else { (bool success, ) = auction.seller.call{ value: auction.highestBid.amount - fee - commission }(""); require(success, "Payment failure"); if ( commissions[auction.tokenAddress][auction.tokenId] .artistAddress != address(0) ) { (success, ) = commissions[auction.tokenAddress][auction.tokenId] .artistAddress .call{value: commission}(""); require(success, "Payment failure"); } adminEth += fee; } IERC1155(auction.tokenAddress).safeTransferFrom( address(this), winner, auction.tokenId, auction.tokenAmount, "" ); auctionIds.remove(auctionId); emit AuctionClaimed(winner, auctionId); } function batchClaimAuction(uint256[] calldata _auctionIds) external onlyAdmin { for (uint256 i = 0; i < _auctionIds.length; i++) { claimAuction(_auctionIds[i]); } } /** * @dev Cancel auction and refund bidders * * Params: * auctionId: auction ID */ function cancelAuction(uint256 auctionId) public nonReentrant() sellerOrAdmin(auctions[auctionId].seller) { require(auctionIds.contains(auctionId), "Auction does not exist"); Auction memory auction = auctions[auctionId]; require( block.timestamp <= auction.endTime || auction.highestBid.amount < auction.reservePrice, "Cannot cancel auction after it has ended unless the highest bid did not meet the reserve price." ); IERC1155(auction.tokenAddress).safeTransferFrom( address(this), auction.seller, auction.tokenId, auction.tokenAmount, "" ); if (auction.isStarsAuction) { stars.safeTransfer( auction.highestBid.bidder, auction.highestBid.amount ); } else { (bool success, ) = auction.highestBid.bidder.call{ value: auction.highestBid.amount }(""); require(success, "Payment failure"); } auctionIds.remove(auctionId); emit AuctionCancelled(auctionId); } function batchCancelAuction(uint256[] calldata _auctionIds) external onlyAdmin { for (uint256 i = 0; i < _auctionIds.length; i++) { cancelAuction(_auctionIds[i]); } } function changeReservePrice(uint256 auctionId, uint256 newReservePrice) external nonReentrant() sellerOrAdmin(auctions[auctionId].seller) { require(auctionIds.contains(auctionId), "Auction does not exist"); auctions[auctionId].reservePrice = newReservePrice; emit AuctionReservePriceChanged(auctionId, newReservePrice); } //Generate ID for next listing function generateListingId() internal returns (uint256) { return nextListingId++; } //Generate ID for next auction function generateAuctionId() internal returns (uint256) { return nextAuctionId++; } //Withdraw ETH to treasury wallet function withdrawETH() external onlyAdmin { (bool success, ) = treasuryWallet.call{value: adminEth}(""); require(success, "Payment failure"); adminEth = 0; } //Withdraw Stars to treasury wallet function withdrawStars() external onlyAdmin { stars.safeTransfer(treasuryWallet, adminStars); adminStars = 0; } //Add to list of valid Mogul NFTs function addMogulNFTAddress(address _mogulNFTAddress) external onlyAdmin { mogulNFTs.add(_mogulNFTAddress); } //Remove from list of valid Mogul NFTs function removeMogulNFTAddress(address _mogulNFTAddress) external onlyAdmin { mogulNFTs.remove(_mogulNFTAddress); } //Set STARS fee (applies to listings and auctions); function setStarsFee(uint256 _feeBasisPoint) external onlyAdmin { require( _feeBasisPoint + highestCommissionBasisPoint < 10000, "Fee plus commission must be less than 100%" ); starsFeeBasisPoint = _feeBasisPoint; emit StarsFeeBasisPointSet(_feeBasisPoint); } //Set ETH fee (applies to listings and auctions); function setEthFee(uint256 _feeBasisPoint) external onlyAdmin { require( _feeBasisPoint + highestCommissionBasisPoint < 10000, "Fee plus commission must be less than 100%" ); ethFeeBasisPoint = _feeBasisPoint; emit EthFeeBasisPointSet(_feeBasisPoint); } function setStarsCashBack(uint256 _starsCashBackBasisPoint) external onlyAdmin { starsCashBackBasisPoint = _starsCashBackBasisPoint; } //Set commission info for one token function setCommission( address NFTAddress, uint256 tokenId, address payable artistAddress, uint256 commissionBasisPoint ) external onlyAdmin { if (commissionBasisPoint > highestCommissionBasisPoint) { require( commissionBasisPoint + starsFeeBasisPoint < 10000 && commissionBasisPoint + ethFeeBasisPoint < 10000, "Fee plus commission must be less than 100%" ); highestCommissionBasisPoint = commissionBasisPoint; } commissions[NFTAddress][tokenId] = TokenCommissionInfo( artistAddress, commissionBasisPoint ); emit TokenCommissionSingleAdded( NFTAddress, tokenId, artistAddress, commissionBasisPoint ); } //Set commission info for multiple tokens function setCommissionBulk( address NFTAddress, uint256[] memory tokenIds, address payable[] memory artistAddresses, uint256[] memory commissionBasisPoints ) external onlyAdmin { require( tokenIds.length == artistAddresses.length && artistAddresses.length == commissionBasisPoints.length, "Invalid input lengths" ); uint256 higherFeeBasisPoint; if (starsFeeBasisPoint > ethFeeBasisPoint) { higherFeeBasisPoint = starsFeeBasisPoint; } else { higherFeeBasisPoint = ethFeeBasisPoint; } for (uint256 i = 0; i < tokenIds.length; i++) { if (commissionBasisPoints[i] > highestCommissionBasisPoint) { require( commissionBasisPoints[i] + higherFeeBasisPoint < 10000, "Fee plus commission must be less than 100%" ); highestCommissionBasisPoint = commissionBasisPoints[i]; } commissions[NFTAddress][tokenIds[i]] = TokenCommissionInfo( artistAddresses[i], commissionBasisPoints[i] ); } emit TokenCommissionBulkAdded( NFTAddress, tokenIds, artistAddresses, commissionBasisPoints ); } //Set whether or not creating new STARS listings and Auctions are allowed function setStarsAllowed(bool _starsAllowed) external onlyAdmin { starsAllowed = _starsAllowed; } //Set whether or not creating new ETH listings and Auctions are allowed function setEthAllowed(bool _ethAllowed) external onlyAdmin { ethAllowed = _ethAllowed; } function depositStarsForCashBack(uint256 amount) public { stars.safeTransferFrom(msg.sender, address(this), amount); starsAvailableForCashBack += amount; } function withdrawStarsForCashBack(uint256 amount) external onlyAdmin nonReentrant() { require( amount <= starsAvailableForCashBack, "Withdraw amount exceeds available balance" ); starsAvailableForCashBack -= amount; stars.safeTransfer(treasuryWallet, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT 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 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"starsAddress","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address payable","name":"_treasuryWallet","type":"address"},{"internalType":"address","name":"_mogulNFTAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"AuctionCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"AuctionClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startingPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isStarsAuction","type":"bool"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newReservePrice","type":"uint256"}],"name":"AuctionReservePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isStarsBid","type":"bool"}],"name":"BidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEthFeeBasisPoint","type":"uint256"}],"name":"EthFeeBasisPointSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"listingId","type":"uint256"}],"name":"ListingCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"listingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"starsPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isStarsListing","type":"bool"},{"indexed":false,"internalType":"bool","name":"isEthListing","type":"bool"}],"name":"ListingCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"listingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isStarsPrice","type":"bool"}],"name":"ListingPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"listingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isStarsPurchase","type":"bool"}],"name":"SaleMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStarsCashBackBasisPoint","type":"uint256"}],"name":"StarsCashBackBasisPointSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStarsFeeBasisPoint","type":"uint256"}],"name":"StarsFeeBasisPointSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address payable[]","name":"artistAddresses","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"commissionBasisPoints","type":"uint256[]"}],"name":"TokenCommissionBulkAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"artistAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"commissionBasisPoint","type":"uint256"}],"name":"TokenCommissionSingleAdded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mogulNFTAddress","type":"address"}],"name":"addMogulNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminStars","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"bool","name":"isStarsAuction","type":"bool"},{"components":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MogulMarketplaceERC1155.Bid","name":"highestBid","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_auctionIds","type":"uint256[]"}],"name":"batchCancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_listingIds","type":"uint256[]"}],"name":"batchCancelListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_auctionIds","type":"uint256[]"}],"name":"batchClaimAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"startingPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"startTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"endTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"reservePrices","type":"uint256[]"},{"internalType":"bool[]","name":"areStarsAuctions","type":"bool[]"}],"name":"batchCreateAuctions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"starsPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"ethPrices","type":"uint256[]"},{"internalType":"bool[]","name":"areStarsListings","type":"bool[]"},{"internalType":"bool[]","name":"areEthListings","type":"bool[]"}],"name":"batchCreateListings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"listingId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expectedPrice","type":"uint256"},{"internalType":"bool","name":"isStarsPurchase","type":"bool"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"listingId","type":"uint256"}],"name":"cancelListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"listingId","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"},{"internalType":"bool","name":"isStarsPrice","type":"bool"}],"name":"changeListingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"newReservePrice","type":"uint256"}],"name":"changeReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"claimAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"commissions","outputs":[{"internalType":"address payable","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"commissionBasisPoint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"bool","name":"isStarsAuction","type":"bool"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"starsPrice","type":"uint256"},{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"bool","name":"isStarsListing","type":"bool"},{"internalType":"bool","name":"isEthListing","type":"bool"}],"name":"createListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositStarsForCashBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethFeeBasisPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indices","type":"uint256[]"}],"name":"getAuctionIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indices","type":"uint256[]"}],"name":"getAuctionsAtIndices","outputs":[{"components":[{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"bool","name":"isStarsAuction","type":"bool"},{"components":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MogulMarketplaceERC1155.Bid","name":"highestBid","type":"tuple"}],"internalType":"struct MogulMarketplaceERC1155.Auction[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"NFTAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getCommissionInfoForTokens","outputs":[{"components":[{"internalType":"address payable","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"commissionBasisPoint","type":"uint256"}],"internalType":"struct MogulMarketplaceERC1155.TokenCommissionInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indices","type":"uint256[]"}],"name":"getListingIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indices","type":"uint256[]"}],"name":"getListingsAtIndices","outputs":[{"components":[{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"starsPrice","type":"uint256"},{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"bool","name":"isStarsListing","type":"bool"},{"internalType":"bool","name":"isEthListing","type":"bool"}],"internalType":"struct MogulMarketplaceERC1155.Listing[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumAuctions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumListings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listings","outputs":[{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"starsPrice","type":"uint256"},{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"bool","name":"isStarsListing","type":"bool"},{"internalType":"bool","name":"isEthListing","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAuctionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextListingId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"placeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_mogulNFTAddress","type":"address"}],"name":"removeMogulNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NFTAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"commissionBasisPoint","type":"uint256"}],"name":"setCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NFTAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address payable[]","name":"artistAddresses","type":"address[]"},{"internalType":"uint256[]","name":"commissionBasisPoints","type":"uint256[]"}],"name":"setCommissionBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ethAllowed","type":"bool"}],"name":"setEthAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBasisPoint","type":"uint256"}],"name":"setEthFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_starsAllowed","type":"bool"}],"name":"setStarsAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_starsCashBackBasisPoint","type":"uint256"}],"name":"setStarsCashBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBasisPoint","type":"uint256"}],"name":"setStarsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"starsAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starsAvailableForCashBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starsCashBackBasisPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starsFeeBasisPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStarsForCashBack","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600d805461ff001960ff19909116600117166101001790553480156200002957600080fd5b50604051620062b0380380620062b08339810160408190526200004c91620002bd565b600180556001600160a01b038216620000825760405162461bcd60e51b8152600401620000799062000324565b60405180910390fd5b6200009d60008051602062006290833981519152846200010e565b620000b860008051602062006290833981519152806200011e565b600280546001600160a01b03199081166001600160a01b03858116919091179092556003805490911691861691909117905562000103600e826200016a602090811b62003b4917901c565b505050505062000380565b6200011a82826200018a565b5050565b806200012a8362000214565b60405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a460009182526020829052604090912060010155565b600062000181836001600160a01b03841662000229565b90505b92915050565b62000196828262000278565b6200011a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001d0620002a1565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60009081526020819052604090206001015490565b6000620002378383620002a5565b6200026f5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000184565b50600062000184565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3390565b60009081526001919091016020526040902054151590565b60008060008060808587031215620002d3578384fd5b8451620002e08162000367565b6020860151909450620002f38162000367565b6040860151909350620003068162000367565b6060860151909250620003198162000367565b939692955090935050565b60208082526023908201527f54726561737572792077616c6c65742063616e6e6f742062652030206164647260408201526265737360e81b606082015260800190565b6001600160a01b03811681146200037d57600080fd5b50565b615f0080620003906000396000f3fe6080604052600436106103815760003560e01c806388fe07da116101d1578063d4eda87711610102578063e6b75031116100a0578063f23a6e611161006f578063f23a6e6114610a32578063f4d6bacc14610a52578063f94545f014610a67578063fc52848214610a8757610381565b8063e6b75031146109bd578063e7dffa3f146109dd578063e986051a146109f2578063ee79eab614610a1257610381565b8063d9ec787d116100dc578063d9ec787d1461093f578063de74e57b1461095f578063e086e5ec14610993578063e5b75693146109a857610381565b8063d4eda877146108ea578063d547741f146108ff578063d8fd449b1461091f57610381565b8063aaccf1ec1161016f578063bc197c8111610149578063bc197c8114610868578063bf97c46714610895578063ca25c0d5146108b5578063d391014b146108d557610381565b8063aaccf1ec1461081e578063ad6a9cb714610833578063b699de0b1461084857610381565b806396b5a755116101ab57806396b5a755146107b45780639aafc6c9146107d4578063a217fddf146107f4578063a9196d5c1461080957610381565b806388fe07da1461076c5780638ec2d0d11461077f57806391d148541461079457610381565b80633853dea0116102b65780634e3bc43f11610254578063676c55d911610223578063676c55d9146107025780636ffb0d1e1461072257806373cb995414610742578063879a30f71461075757610381565b80634e3bc43f1461066c578063571a26a01461069957806357c90de5146106cf57806361146459146106e257610381565b80633f6738a9116102905780633f6738a9146105ea5780634626402b1461060a5780634c76fd231461062c5780634d0dfa4d1461064c57610381565b80633853dea0146105955780633968edad146105b55780633f6697fb146105d557610381565b80632016858a116103235780632f2ff15d116102fd5780632f2ff15d14610508578063305a67a81461052857806336275dba1461054857806336568abe1461057557610381565b80632016858a146104a657806322d8916e146104c8578063248a9ca3146104e857610381565b806310a0ee961161035f57806310a0ee961461040b578063141102861461042b578063149f1dfa146104595780631d32bfbd1461047957610381565b806301f741181461038657806301ffc9a7146103bc5780630f2f59fc146103e9575b600080fd5b34801561039257600080fd5b506103a66103a1366004614c9a565b610a9c565b6040516103b391906152ab565b60405180910390f35b3480156103c857600080fd5b506103dc6103d7366004614d4b565b610b7e565b6040516103b391906152be565b3480156103f557600080fd5b50610409610404366004614ccc565b610ba9565b005b34801561041757600080fd5b50610409610426366004614d94565b610bf9565b34801561043757600080fd5b5061044b61044636600461483f565b610ce0565b6040516103b3929190614fc8565b34801561046557600080fd5b50610409610474366004614c5b565b610d10565b34801561048557600080fd5b506104996104943660046146fb565b610d95565b6040516103b3919061526b565b3480156104b257600080fd5b506104bb610eca565b6040516103b391906152c9565b3480156104d457600080fd5b506104096104e3366004614c5b565b610ed0565b3480156104f457600080fd5b506104bb610503366004614d04565b610f50565b34801561051457600080fd5b50610409610523366004614d1c565b610f65565b34801561053457600080fd5b50610409610543366004614d04565b610f89565b34801561055457600080fd5b50610568610563366004614c9a565b611101565b6040516103b39190615108565b34801561058157600080fd5b50610409610590366004614d1c565b611297565b3480156105a157600080fd5b506104096105b0366004614d04565b6112dd565b3480156105c157600080fd5b506104096105d0366004614d04565b611316565b3480156105e157600080fd5b506103dc611348565b3480156105f657600080fd5b50610409610605366004614d04565b611356565b34801561061657600080fd5b5061061f6113f8565b6040516103b39190614f05565b34801561063857600080fd5b506103a6610647366004614c9a565b611407565b34801561065857600080fd5b50610409610667366004614d04565b6114ca565b34801561067857600080fd5b5061068c610687366004614c9a565b611561565b6040516103b391906151d1565b3480156106a557600080fd5b506106b96106b4366004614d04565b6116bb565b6040516103b39a99989796959493929190614f5f565b6104096106dd366004614d73565b611736565b3480156106ee57600080fd5b506104096106fd366004614ccc565b6119ca565b34801561070e57600080fd5b5061040961071d36600461486a565b611a18565b34801561072e57600080fd5b5061040961073d3660046148b1565b611b2c565b34801561074e57600080fd5b506104bb611dd4565b34801561076357600080fd5b506104bb611dda565b61040961077a366004614dcc565b611deb565b34801561078b57600080fd5b506104bb6123d7565b3480156107a057600080fd5b506103dc6107af366004614d1c565b6123dd565b3480156107c057600080fd5b506104096107cf366004614d04565b612406565b3480156107e057600080fd5b506104096107ef366004614d04565b6126ff565b34801561080057600080fd5b506104bb612cd3565b34801561081557600080fd5b506103dc612cd8565b34801561082a57600080fd5b506104bb612ce1565b34801561083f57600080fd5b506104bb612ce7565b34801561085457600080fd5b50610409610863366004614c5b565b612ced565b34801561087457600080fd5b506108886108833660046145ec565b612d6d565b6040516103b391906152d2565b3480156108a157600080fd5b506104096108b0366004614aed565b612d7e565b3480156108c157600080fd5b506104096108d03660046145d0565b612f98565b3480156108e157600080fd5b506104bb612fd7565b3480156108f657600080fd5b506104bb612fe9565b34801561090b57600080fd5b5061040961091a366004614d1c565b612fef565b34801561092b57600080fd5b5061040961093a366004614748565b61300e565b34801561094b57600080fd5b5061040961095a366004614d73565b613295565b34801561096b57600080fd5b5061097f61097a366004614d04565b61337f565b6040516103b3989796959493929190614f19565b34801561099f57600080fd5b506104096133d4565b3480156109b457600080fd5b506104bb613493565b3480156109c957600080fd5b506104096109d8366004614d04565b61349f565b3480156109e957600080fd5b50610409613558565b3480156109fe57600080fd5b50610409610a0d366004614994565b6135b4565b348015610a1e57600080fd5b50610409610a2d3660046145d0565b613787565b348015610a3e57600080fd5b50610888610a4d366004614695565b6137c6565b348015610a5e57600080fd5b506104bb6137d7565b348015610a7357600080fd5b50610409610a82366004614922565b6137dd565b348015610a9357600080fd5b506104bb613b43565b6060600082516001600160401b03811115610ac757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610af0578160200160208202803683370190505b50905060005b8351811015610b7757610b3a848281518110610b2257634e487b7160e01b600052603260045260246000fd5b60200260200101516010613b6590919063ffffffff16565b828281518110610b5a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610b6f81615e3d565b915050610af6565b5092915050565b60006001600160e01b031982166301ffc9a760e01b1480610ba35750610ba382613b71565b92915050565b610bc1600080516020615eab833981519152336123dd565b610be65760405162461bcd60e51b8152600401610bdd906158c3565b60405180910390fd5b600d805460ff1916911515919091179055565b6000838152601460205260409020546001600160a01b031633811480610c325750610c32600080516020615eab833981519152336123dd565b610c4e5760405162461bcd60e51b8152600401610bdd90615413565b82610c6b5760405162461bcd60e51b8152600401610bdd9061553b565b8115610c8a576000848152601460205260409020600401839055610c9f565b60008481526014602052604090206005018390555b7fb4de243dab4ede8abcce724ddf4ae9cb06784d1485659d964cadd18ec4774165848484604051610cd293929190615d28565b60405180910390a150505050565b6016602090815260009283526040808420909152908252902080546001909101546001600160a01b039091169082565b610d28600080516020615eab833981519152336123dd565b610d445760405162461bcd60e51b8152600401610bdd906158c3565b60005b81811015610d9057610d7e838383818110610d7257634e487b7160e01b600052603260045260246000fd5b90506020020135612406565b80610d8881615e3d565b915050610d47565b505050565b6060600082516001600160401b03811115610dc057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610df957816020015b610de6614371565b815260200190600190039081610dde5790505b50905060005b8351811015610ec2576001600160a01b03851660009081526016602052604081208551909190869084908110610e4557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252818101929092526040908101600020815180830190925280546001600160a01b0316825260010154918101919091528251839083908110610ea457634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610eba90615e3d565b915050610dff565b509392505050565b600b5481565b610ee8600080516020615eab833981519152336123dd565b610f045760405162461bcd60e51b8152600401610bdd906158c3565b60005b81811015610d9057610f3e838383818110610f3257634e487b7160e01b600052603260045260246000fd5b905060200201356126ff565b80610f4881615e3d565b915050610f07565b60009081526020819052604090206001015490565b610f6e82610f50565b610f7f81610f7a613b96565b613b9a565b610d908383613bfe565b6000818152601460205260409020546001600160a01b031633811480610fc25750610fc2600080516020615eab833981519152336123dd565b610fde5760405162461bcd60e51b8152600401610bdd90615413565b600260015414156110015760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611011601083613c83565b61102d5760405162461bcd60e51b8152600401610bdd906159a5565b6000828152601460205260409020611046601084613c8f565b506001810154815460028301546003840154604051637921219560e11b81526001600160a01b0394851694859463f242432a9461108e94309492909316929091600401614fe1565b600060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050507f411aee90354c51b1b04cd563fcab2617142a9d50da19232d888547c8a1b7fd8a846040516110ef91906152c9565b60405180910390a15050600180555050565b6060600082516001600160401b0381111561112c57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561116557816020015b611152614388565b81526020019060019003908161114a5790505b50905060005b8351811015610b7757601560006111b386848151811061119b57634e487b7160e01b600052603260045260246000fd5b60200260200101516012613b6590919063ffffffff16565b8152602080820192909252604090810160002081516101408101835281546001600160a01b03908116825260018301548116828601526002830154828501526003830154606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015460ff16151561010083015283518085019094526009830154168352600a9091015492820192909252610120820152825183908390811061127957634e487b7160e01b600052603260045260246000fd5b6020026020010181905250808061128f90615e3d565b91505061116b565b61129f613b96565b6001600160a01b0316816001600160a01b0316146112cf5760405162461bcd60e51b8152600401610bdd90615c2b565b6112d98282613c9b565b5050565b6112f5600080516020615eab833981519152336123dd565b6113115760405162461bcd60e51b8152600401610bdd906158c3565b600c55565b60035461132e906001600160a01b0316333084613d1e565b80600b60008282546113409190615d8c565b909155505050565b600d54610100900460ff1681565b61136e600080516020615eab833981519152336123dd565b61138a5760405162461bcd60e51b8152600401610bdd906158c3565b612710600a548261139b9190615d8c565b106113b85760405162461bcd60e51b8152600401610bdd90615a0c565b60078190556040517f2548d4d91d8b332ae8945480c38f398dfb94d1463a6e3f0daabefe396f8f3d9f906113ed9083906152c9565b60405180910390a150565b6002546001600160a01b031681565b6060600082516001600160401b0381111561143257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561145b578160200160208202803683370190505b50905060005b8351811015610b775761148d84828151811061119b57634e487b7160e01b600052603260045260246000fd5b8282815181106114ad57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806114c281615e3d565b915050611461565b6114e2600080516020615eab833981519152336123dd565b6114fe5760405162461bcd60e51b8152600401610bdd906158c3565b612710600a548261150f9190615d8c565b1061152c5760405162461bcd60e51b8152600401610bdd90615a0c565b60068190556040517f1464764941ab9dafdffba922e1e7b28bce233da326c0f130752d69a7e08b521c906113ed9083906152c9565b6060600082516001600160401b0381111561158c57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156115c557816020015b6115b26143f4565b8152602001906001900390816115aa5790505b50905060005b8351811015610b7757601460006115fb868481518110610b2257634e487b7160e01b600052603260045260246000fd5b815260208082019290925260409081016000208151610100808201845282546001600160a01b039081168352600184015416948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a08301526006015460ff808216151560c0840152929004909116151560e0820152825183908390811061169d57634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806116b390615e3d565b9150506115cb565b6015602090815260009182526040918290208054600182015460028301546003840154600485015460058601546006870154600788015460088901548b51808d01909c5260098a01546001600160a01b039081168d52600a909a01549a8c019a909a52968816999590971697939692959194909360ff16908a565b600260015414156117595760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611769601283613c83565b6117855760405162461bcd60e51b8152600401610bdd90615566565b600082815260156020526040902060058101544210156117b75760405162461bcd60e51b8152600401610bdd906159d5565b80600601544211156117db5760405162461bcd60e51b8152600401610bdd906156ed565b600a81015482116117fe5760405162461bcd60e51b8152600401610bdd90615a56565b806004015482116118215760405162461bcd60e51b8152600401610bdd9061595f565b600881015460ff16156118a257600354611846906001600160a01b0316333085613d1e565b6009810154600a82015460035461186b926001600160a01b0391821692911690613d7c565b604080518082019091523380825260209091018390526009820180546001600160a01b0319169091179055600a810182905561197c565b3482146118c15760405162461bcd60e51b8152600401610bdd9061591c565b6009810154600a8201546040516000926001600160a01b031691906118e590614e8d565b60006040518083038185875af1925050503d8060008114611922576040519150601f19603f3d011682016040523d82523d6000602084013e611927565b606091505b50509050806119485760405162461bcd60e51b8152600401610bdd90615718565b50604080518082019091523380825260209091018390526009820180546001600160a01b0319169091179055600a81018290555b60088101546040517f78c8056cb003d2206686471949a05cbf5a27d0f87c0f4236a9a957835c9de542916119b99133918791879160ff16906150e0565b60405180910390a150506001805550565b6119e2600080516020615eab833981519152336123dd565b6119fe5760405162461bcd60e51b8152600401610bdd906158c3565b600d80549115156101000261ff0019909216919091179055565b611a30600080516020615eab833981519152336123dd565b611a4c5760405162461bcd60e51b8152600401610bdd906158c3565b600a54811115611aa45761271060065482611a679190615d8c565b108015611a82575061271060075482611a809190615d8c565b105b611a9e5760405162461bcd60e51b8152600401610bdd90615a0c565b600a8190555b6040805180820182526001600160a01b038481168252602080830185815288831660009081526016835285812089825290925290849020925183546001600160a01b031916921691909117825551600190910155517f2bac2bc9e8f23d487a1c4823c97a4864973b4874188cbb3eeb47d76ec439860690610cd29086908690869086906150b6565b60026001541415611b4f5760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611b5f600e88613d9b565b611b7b5760405162461bcd60e51b8152600401610bdd90615bf4565b8115611b9e5783611b9e5760405162461bcd60e51b8152600401610bdd9061553b565b8015611bc15782611bc15760405162461bcd60e51b8152600401610bdd9061553b565b84611bde5760405162461bcd60e51b8152600401610bdd9061559d565b8115611c0657600d5460ff16611c065760405162461bcd60e51b8152600401610bdd906154cd565b8015611c3357600d54610100900460ff16611c335760405162461bcd60e51b8152600401610bdd90615639565b604051637921219560e11b815287906001600160a01b0382169063f242432a90611c6790339030908c908c90600401614fe1565b600060405180830381600087803b158015611c8157600080fd5b505af1158015611c95573d6000803e3d6000fd5b505050506000611ca3613db0565b6040805161010080820183523382526001600160a01b038d811660208085019182528486018f8152606086018f8152608087018f815260a088018f81528e151560c08a019081528e151560e08b0190815260008d815260149097529a909520985189546001600160a01b0319908116918916919091178a55955160018a0180549097169716969096179094559051600287015551600386015590516004850155905160058401555160069092018054935160ff199094169215159290921761ff001916921515029190911790559050611d7d601082613dca565b507f473615488a0acd7ce3cacdfee2c11b0cd8b6e82d0c53cabd1e7e85086f16d41481338b8b8b8b8b8b8b604051611dbd99989796959493929190615ccd565b60405180910390a150506001805550505050505050565b60085481565b6000611de66012613dd6565b905090565b60026001541415611e0e5760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611e1e601085613c83565b611e3a5760405162461bcd60e51b8152600401610bdd90615855565b60008481526014602052604090206003810154841115611e6c5760405162461bcd60e51b8152600401610bdd90615bbd565b811561208257600681015460ff16611e965760405162461bcd60e51b8152600401610bdd90615602565b6000848260040154611ea89190615dc4565b9050838114611ec95760405162461bcd60e51b8152600401610bdd906155cb565b600061271060065483611edc9190615dc4565b611ee69190615da4565b6001808501546001600160a01b03166000908152601660209081526040808320600289015484529091528120909101549192509061271090611f289085615dc4565b611f329190615da4565b90508115611f5257600354611f52906001600160a01b0316333085613d1e565b60018401546001600160a01b039081166000908152601660209081526040808320600289015484529091529020541615611fc85760018401546001600160a01b03908116600090815260166020908152604080832060028901548452909152902054600354611fc8929081169133911684613d1e565b83546120029033906001600160a01b031683611fe48688615de3565b611fee9190615de3565b6003546001600160a01b0316929190613d1e565b600c5415612062576000612710600c548561201d9190615dc4565b6120279190615da4565b905080600b54106120605780600b60008282546120449190615de3565b9091555050600354612060906001600160a01b03163383613d7c565b505b81600960008282546120749190615d8c565b909155506122ef9350505050565b6006810154610100900460ff166120ab5760405162461bcd60e51b8152600401610bdd90615670565b60008482600501546120bd9190615dc4565b90508381146120de5760405162461bcd60e51b8152600401610bdd906155cb565b6000612710600754836120f19190615dc4565b6120fb9190615da4565b6001808501546001600160a01b0316600090815260166020908152604080832060028901548452909152812090910154919250906127109061213d9085615dc4565b6121479190615da4565b90508234146121685760405162461bcd60e51b8152600401610bdd90615a8d565b83546000906001600160a01b0316826121818587615de3565b61218b9190615de3565b60405161219790614e8d565b60006040518083038185875af1925050503d80600081146121d4576040519150601f19603f3d011682016040523d82523d6000602084013e6121d9565b606091505b50509050806121fa5760405162461bcd60e51b8152600401610bdd90615718565b60018501546001600160a01b03908116600090815260166020908152604080832060028a0154845290915290205416156122d35760018501546001600160a01b03908116600090815260166020908152604080832060028a0154845290915290819020549051911690839061226e90614e8d565b60006040518083038185875af1925050503d80600081146122ab576040519150601f19603f3d011682016040523d82523d6000602084013e6122b0565b606091505b505080915050806122d35760405162461bcd60e51b8152600401610bdd90615718565b82600860008282546122e59190615d8c565b9091555050505050505b838160030160008282546123039190615de3565b9091555050600381015461231e5761231c601086613c8f565b505b60018101546002820154604051637921219560e11b81526001600160a01b0390921691829163f242432a9161235c9130913391908b90600401614fe1565b600060405180830381600087803b15801561237657600080fd5b505af115801561238a573d6000803e3d6000fd5b505050507f5849fcb03b709a338ea379a79a96974ae538c21c0fabed319d4690aa6ac54379338787866040516123c394939291906150e0565b60405180910390a150506001805550505050565b600c5481565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600260015414156124295760405162461bcd60e51b8152600401610bdd90615b86565b60026001556000818152601560205260409020546001600160a01b0316338114806124675750612467600080516020615eab833981519152336123dd565b6124835760405162461bcd60e51b8152600401610bdd90615413565b61248e601283613c83565b6124aa5760405162461bcd60e51b8152600401610bdd90615825565b60008281526015602090815260409182902082516101408101845281546001600160a01b03908116825260018301548116828501526002830154828601526003830154606083015260048301546080830152600583015460a0830152600683015460c08301908152600784015460e0840152600884015460ff161515610100840152855180870190965260098401549091168552600a909201549284019290925261012082019290925290514211158061257057508060e0015181610120015160200151105b61258c5760405162461bcd60e51b8152600401610bdd9061544a565b6020810151815160408084015160608501519151637921219560e11b81526001600160a01b039094169363f242432a936125cc9330939192600401614fe1565b600060405180830381600087803b1580156125e657600080fd5b505af11580156125fa573d6000803e3d6000fd5b505050508061010001511561263457610120810151805160209091015160035461262f926001600160a01b0390911691613d7c565b6126c4565b6000816101200151600001516001600160a01b03168261012001516020015160405161265f90614e8d565b60006040518083038185875af1925050503d806000811461269c576040519150601f19603f3d011682016040523d82523d6000602084013e6126a1565b606091505b50509050806126c25760405162461bcd60e51b8152600401610bdd90615718565b505b6126cf601284613c8f565b507f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df836040516119b991906152c9565b600260015414156127225760405162461bcd60e51b8152600401610bdd90615b86565b6002600155612732601282613c83565b61274e5760405162461bcd60e51b8152600401610bdd90615825565b60008181526015602090815260409182902082516101408101845281546001600160a01b03908116825260018301548116828501526002830154828601526003830154606083015260048301546080830152600583015460a0830152600683015460c08301908152600784015460e0840152600884015460ff161515610100840152855180870190965260098401549091168552600a909201549284019290925261012082019290925290514210156128195760405162461bcd60e51b8152600401610bdd906158f0565b80516001600160a01b031633148015906128485750612846600080516020615eab833981519152336123dd565b155b1561287a578060e0015181610120015160200151101561287a5760405162461bcd60e51b8152600401610bdd90615351565b600080826101000151156128b357612710600654846101200151602001516128a29190615dc4565b6128ac9190615da4565b90506128da565b612710600754846101200151602001516128cd9190615dc4565b6128d79190615da4565b90505b6020808401516001600160a01b0316600090815260168252604080822081870151835283528120600101546101208601519092015190916127109161291f9190615dc4565b6129299190615da4565b905083610120015160000151925083610100015115612a7e5761297d84600001518284876101200151602001516129609190615de3565b61296a9190615de3565b6003546001600160a01b03169190613d7c565b6020808501516001600160a01b039081166000908152601683526040808220818901518352909352919091205416156129ef576020808501516001600160a01b03908116600090815260168352604080822081890151835290935291909120546003546129ef92908116911683613d7c565b600c5415612a61576000612710600c5486610120015160200151612a139190615dc4565b612a1d9190615da4565b905080600b5410612a5f5780600b6000828254612a3a9190615de3565b909155505061012085015151600354612a5f916001600160a01b039091169083613d7c565b505b8160096000828254612a739190615d8c565b90915550612c0a9050565b600084600001516001600160a01b0316828487610120015160200151612aa49190615de3565b612aae9190615de3565b604051612aba90614e8d565b60006040518083038185875af1925050503d8060008114612af7576040519150601f19603f3d011682016040523d82523d6000602084013e612afc565b606091505b5050905080612b1d5760405162461bcd60e51b8152600401610bdd90615718565b6020808601516001600160a01b039081166000908152601683526040808220818a0151835290935291909120541615612bf1576020808601516001600160a01b039081166000908152601683526040808220818a015183529093528290205491519116908390612b8c90614e8d565b60006040518083038185875af1925050503d8060008114612bc9576040519150601f19603f3d011682016040523d82523d6000602084013e612bce565b606091505b50508091505080612bf15760405162461bcd60e51b8152600401610bdd90615718565b8260086000828254612c039190615d8c565b9091555050505b83602001516001600160a01b031663f242432a3085876040015188606001516040518563ffffffff1660e01b8152600401612c489493929190614fe1565b600060405180830381600087803b158015612c6257600080fd5b505af1158015612c76573d6000803e3d6000fd5b50505050612c8e856012613c8f90919063ffffffff16565b507f10a4b36a41aae32780e0984ce67fee4a5a8929f404dfd68df31b645baa0189918386604051612cc0929190614fc8565b60405180910390a1505060018055505050565b600081565b600d5460ff1681565b60045481565b60065481565b612d05600080516020615eab833981519152336123dd565b612d215760405162461bcd60e51b8152600401610bdd906158c3565b60005b81811015610d9057612d5b838383818110612d4f57634e487b7160e01b600052603260045260246000fd5b90506020020135610f89565b80612d6581615e3d565b915050612d24565b63bc197c8160e01b95945050505050565b612d96600080516020615eab833981519152336123dd565b612db25760405162461bcd60e51b8152600401610bdd906158c3565b8a89148015612dc057508887145b8015612dcb57508685145b8015612dd75750835185145b8015612de4575082518451145b8015612df1575081518351145b8015612dfe575080518251145b612e1a5760405162461bcd60e51b8152600401610bdd9061588c565b60005b8b811015612f8957612f778d8d83818110612e4857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612e5d91906145d0565b8c8c84818110612e7d57634e487b7160e01b600052603260045260246000fd5b905060200201358b8b85818110612ea457634e487b7160e01b600052603260045260246000fd5b905060200201358a8a86818110612ecb57634e487b7160e01b600052603260045260246000fd5b90506020020135898681518110612ef257634e487b7160e01b600052603260045260246000fd5b6020026020010151898781518110612f1a57634e487b7160e01b600052603260045260246000fd5b6020026020010151898881518110612f4257634e487b7160e01b600052603260045260246000fd5b6020026020010151898981518110612f6a57634e487b7160e01b600052603260045260246000fd5b60200260200101516137dd565b80612f8181615e3d565b915050612e1d565b50505050505050505050505050565b612fb0600080516020615eab833981519152336123dd565b612fcc5760405162461bcd60e51b8152600401610bdd906158c3565b6112d9600e82613de1565b600080516020615eab83398151915281565b60075481565b612ff882610f50565b61300481610f7a613b96565b610d908383613c9b565b613026600080516020615eab833981519152336123dd565b6130425760405162461bcd60e51b8152600401610bdd906158c3565b81518351148015613054575080518251145b6130705760405162461bcd60e51b8152600401610bdd90615778565b60006007546006541115613087575060065461308c565b506007545b60005b845181101561325057600a548382815181106130bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151111561314b57612710828483815181106130ed57634e487b7160e01b600052603260045260246000fd5b60200260200101516130ff9190615d8c565b1061311c5760405162461bcd60e51b8152600401610bdd90615a0c565b82818151811061313c57634e487b7160e01b600052603260045260246000fd5b6020026020010151600a819055505b604051806040016040528085838151811061317657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031681526020018483815181106131ac57634e487b7160e01b600052603260045260246000fd5b602002602001015181525060166000886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106131fe57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825281810192909252604001600020825181546001600160a01b0319166001600160a01b039091161781559101516001909101558061324881615e3d565b91505061308f565b507fb4347d764d60959f296b5437e67674d3e0f95c18c6eb2be0909821ebfd4ed70e85858585604051613286949392919061503d565b60405180910390a15050505050565b600260015414156132b85760405162461bcd60e51b8152600401610bdd90615b86565b60026001556000828152601560205260409020546001600160a01b0316338114806132f657506132f6600080516020615eab833981519152336123dd565b6133125760405162461bcd60e51b8152600401610bdd90615413565b61331d601284613c83565b6133395760405162461bcd60e51b8152600401610bdd90615825565b60008381526015602052604090819020600701839055517fe1cac5dced4f280522703654f134d3e9c1938cce8ea173bbbd59126188d8fa26906119b99085908590615d1a565b60146020526000908152604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b0395861696959094169492939192909160ff8082169161010090041688565b6133ec600080516020615eab833981519152336123dd565b6134085760405162461bcd60e51b8152600401610bdd906158c3565b6002546008546040516000926001600160a01b0316919061342890614e8d565b60006040518083038185875af1925050503d8060008114613465576040519150601f19603f3d011682016040523d82523d6000602084013e61346a565b606091505b505090508061348b5760405162461bcd60e51b8152600401610bdd90615718565b506000600855565b6000611de66010613dd6565b6134b7600080516020615eab833981519152336123dd565b6134d35760405162461bcd60e51b8152600401610bdd906158c3565b600260015414156134f65760405162461bcd60e51b8152600401610bdd90615b86565b6002600155600b5481111561351d5760405162461bcd60e51b8152600401610bdd906157a7565b80600b600082825461352f9190615de3565b9091555050600254600354613551916001600160a01b03918216911683613d7c565b5060018055565b613570600080516020615eab833981519152336123dd565b61358c5760405162461bcd60e51b8152600401610bdd906158c3565b6002546009546003546135ad926001600160a01b0391821692911690613d7c565b6000600955565b6135cc600080516020615eab833981519152336123dd565b6135e85760405162461bcd60e51b8152600401610bdd906158c3565b8a891480156135f657508887145b801561360157508685145b801561360c57508483145b80156136185750815183145b8015613625575080518251145b6136415760405162461bcd60e51b8152600401610bdd9061588c565b60005b8b811015612f89576137758d8d8381811061366f57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061368491906145d0565b8c8c848181106136a457634e487b7160e01b600052603260045260246000fd5b905060200201358b8b858181106136cb57634e487b7160e01b600052603260045260246000fd5b905060200201358a8a868181106136f257634e487b7160e01b600052603260045260246000fd5b9050602002013589898781811061371957634e487b7160e01b600052603260045260246000fd5b9050602002013588878151811061374057634e487b7160e01b600052603260045260246000fd5b602002602001015188888151811061376857634e487b7160e01b600052603260045260246000fd5b6020026020010151611b2c565b8061377f81615e3d565b915050613644565b61379f600080516020615eab833981519152336123dd565b6137bb5760405162461bcd60e51b8152600401610bdd906158c3565b6112d9600e82613b49565b63f23a6e6160e01b95945050505050565b60095481565b600260015414156138005760405162461bcd60e51b8152600401610bdd90615b86565b60026001558284106138245760405162461bcd60e51b8152600401610bdd90615afb565b4284116138435760405162461bcd60e51b8152600401610bdd906157f0565b61384e600e89613d9b565b61386a5760405162461bcd60e51b8152600401610bdd90615bf4565b856138875760405162461bcd60e51b8152600401610bdd9061531a565b80156138b457600d5460ff166138af5760405162461bcd60e51b8152600401610bdd90615741565b6138db565b600d54610100900460ff166138db5760405162461bcd60e51b8152600401610bdd90615504565b604051637921219560e11b815288906001600160a01b0382169063f242432a9061390f90339030908d908d90600401614fe1565b600060405180830381600087803b15801561392957600080fd5b505af115801561393d573d6000803e3d6000fd5b50505050600061394b613df6565b9050604051806101400160405280336001600160a01b031681526020018b6001600160a01b031681526020018a815260200189815260200188815260200187815260200186815260200185815260200184151581526020016040518060400160405280336001600160a01b0316815260200160008152508152506015600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160090160008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550602082015181600101555050905050613ae9816012613dca90919063ffffffff16565b507f69347c7137bbb60bb8e71d6c135c630105bb7828cbdfbd204863422b15c1033881338c8c8c8c8c8c8c8c604051613b2b9a99989796959493929190615c7a565b60405180910390a15050600180555050505050505050565b60055481565b6000613b5e836001600160a01b038416613e07565b9392505050565b6000613b5e8383613e51565b60006001600160e01b03198216637965db0b60e01b1480610ba35750610ba382613eaa565b3390565b613ba482826123dd565b6112d957613bbc816001600160a01b03166014613ecf565b613bc7836020613ecf565b604051602001613bd8929190614e90565b60408051601f198184030181529082905262461bcd60e51b8252610bdd916004016152e7565b613c0882826123dd565b6112d9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055613c3f613b96565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000613b5e8383614080565b6000613b5e8383614098565b613ca582826123dd565b156112d9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055613cda613b96565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b613d76846323b872dd60e01b858585604051602401613d3f93929190615019565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526141af565b50505050565b610d908363a9059cbb60e01b8484604051602401613d3f929190614fc8565b6000613b5e836001600160a01b038416614080565b6004805460009182613dc183615e3d565b91905055905090565b6000613b5e8383613e07565b6000610ba38261423e565b6000613b5e836001600160a01b038416614098565b6005805460009182613dc183615e3d565b6000613e138383614080565b613e4957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ba3565b506000610ba3565b81546000908210613e745760405162461bcd60e51b8152600401610bdd9061539c565b826000018281548110613e9757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60006001600160e01b03198216630271189760e51b1480610ba35750610ba382614242565b60606000613ede836002615dc4565b613ee9906002615d8c565b6001600160401b03811115613f0e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613f38576020820181803683370190505b509050600360fc1b81600081518110613f6157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613f9e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000613fc2846002615dc4565b613fcd906001615d8c565b90505b6001811115614061576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061400f57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061403357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361405a81615e26565b9050613fd0565b508315613b5e5760405162461bcd60e51b8152600401610bdd906153de565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156141a55760006140bc600183615de3565b85549091506000906140d090600190615de3565b905060008660000182815481106140f757634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061412857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061416957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ba3565b6000915050610ba3565b6000614204826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661425b9092919063ffffffff16565b805190915015610d9057808060200190518101906142229190614ce8565b610d905760405162461bcd60e51b8152600401610bdd90615b3c565b5490565b6001600160e01b031981166301ffc9a760e01b14919050565b606061426a8484600085614272565b949350505050565b6060824710156142945760405162461bcd60e51b8152600401610bdd906156a7565b61429d85614332565b6142b95760405162461bcd60e51b8152600401610bdd90615ac4565b600080866001600160a01b031685876040516142d59190614e71565b60006040518083038185875af1925050503d8060008114614312576040519150601f19603f3d011682016040523d82523d6000602084013e614317565b606091505b5091509150614327828286614338565b979650505050505050565b3b151590565b60608315614347575081613b5e565b8251156143575782518084602001fd5b8160405162461bcd60e51b8152600401610bdd91906152e7565b604080518082019091526000808252602082015290565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016143ef614371565b905290565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b60008083601f840112614460578182fd5b5081356001600160401b03811115614476578182fd5b602083019150836020808302850101111561449057600080fd5b9250929050565b600082601f8301126144a7578081fd5b813560206144bc6144b783615d69565b615d40565b82815281810190858301838502870184018810156144d8578586fd5b855b858110156144ff5781356144ed81615e9c565b845292840192908401906001016144da565b5090979650505050505050565b600082601f83011261451c578081fd5b8135602061452c6144b783615d69565b8281528181019085830183850287018401881015614548578586fd5b855b858110156144ff5781358452928401929084019060010161454a565b600082601f830112614576578081fd5b81356001600160401b0381111561458f5761458f615e6e565b6145a2601f8201601f1916602001615d40565b8181528460208386010111156145b6578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156145e1578081fd5b8135613b5e81615e84565b600080600080600060a08688031215614603578081fd5b853561460e81615e84565b9450602086013561461e81615e84565b935060408601356001600160401b0380821115614639578283fd5b61464589838a0161450c565b9450606088013591508082111561465a578283fd5b61466689838a0161450c565b9350608088013591508082111561467b578283fd5b5061468888828901614566565b9150509295509295909350565b600080600080600060a086880312156146ac578081fd5b85356146b781615e84565b945060208601356146c781615e84565b9350604086013592506060860135915060808601356001600160401b038111156146ef578182fd5b61468888828901614566565b6000806040838503121561470d578182fd5b823561471881615e84565b915060208301356001600160401b03811115614732578182fd5b61473e8582860161450c565b9150509250929050565b6000806000806080858703121561475d578384fd5b843561476881615e84565b93506020858101356001600160401b0380821115614784578586fd5b61479089838a0161450c565b955060408801359150808211156147a5578485fd5b818801915088601f8301126147b8578485fd5b81356147c66144b782615d69565b81815284810190848601868402860187018d10156147e2578889fd5b8895505b8386101561480d5780356147f981615e84565b8352600195909501949186019186016147e6565b50965050506060880135925080831115614825578384fd5b50506148338782880161450c565b91505092959194509250565b60008060408385031215614851578182fd5b823561485c81615e84565b946020939093013593505050565b6000806000806080858703121561487f578182fd5b843561488a81615e84565b93506020850135925060408501356148a181615e84565b9396929550929360600135925050565b600080600080600080600060e0888a0312156148cb578485fd5b87356148d681615e84565b96506020880135955060408801359450606088013593506080880135925060a088013561490281615e9c565b915060c088013561491281615e9c565b8091505092959891949750929550565b600080600080600080600080610100898b03121561493e578182fd5b883561494981615e84565b97506020890135965060408901359550606089013594506080890135935060a0890135925060c0890135915060e089013561498381615e9c565b809150509295985092959890939650565b60008060008060008060008060008060008060e08d8f0312156149b5578586fd5b6001600160401b038d3511156149c9578586fd5b6149d68e8e358f0161444f565b909c509a506001600160401b0360208e013511156149f2578586fd5b614a028e60208f01358f0161444f565b909a5098506001600160401b0360408e01351115614a1e578586fd5b614a2e8e60408f01358f0161444f565b90985096506001600160401b0360608e01351115614a4a578586fd5b614a5a8e60608f01358f0161444f565b90965094506001600160401b0360808e01351115614a76578384fd5b614a868e60808f01358f0161444f565b90945092506001600160401b0360a08e01351115614aa2578081fd5b614ab28e60a08f01358f01614497565b91506001600160401b0360c08e01351115614acb578081fd5b614adb8e60c08f01358f01614497565b90509295989b509295989b509295989b565b6000806000806000806000806000806000806101008d8f031215614b0f578586fd5b6001600160401b038d351115614b23578586fd5b614b308e8e358f0161444f565b909c509a506001600160401b0360208e01351115614b4c578586fd5b614b5c8e60208f01358f0161444f565b909a5098506001600160401b0360408e01351115614b78578586fd5b614b888e60408f01358f0161444f565b90985096506001600160401b0360608e01351115614ba4578586fd5b614bb48e60608f01358f0161444f565b90965094506001600160401b0360808e01351115614bd0578182fd5b614be08e60808f01358f0161450c565b93506001600160401b0360a08e01351115614bf9578182fd5b614c098e60a08f01358f0161450c565b92506001600160401b0360c08e01351115614c22578182fd5b614c328e60c08f01358f0161450c565b91506001600160401b0360e08e01351115614c4b578081fd5b614adb8e60e08f01358f01614497565b60008060208385031215614c6d578182fd5b82356001600160401b03811115614c82578283fd5b614c8e8582860161444f565b90969095509350505050565b600060208284031215614cab578081fd5b81356001600160401b03811115614cc0578182fd5b61426a8482850161450c565b600060208284031215614cdd578081fd5b8135613b5e81615e9c565b600060208284031215614cf9578081fd5b8151613b5e81615e9c565b600060208284031215614d15578081fd5b5035919050565b60008060408385031215614d2e578182fd5b823591506020830135614d4081615e84565b809150509250929050565b600060208284031215614d5c578081fd5b81356001600160e01b031981168114613b5e578182fd5b60008060408385031215614d85578182fd5b50508035926020909101359150565b600080600060608486031215614da8578081fd5b83359250602084013591506040840135614dc181615e9c565b809150509250925092565b60008060008060808587031215614de1578182fd5b8435935060208501359250604085013591506060850135614e0181615e9c565b939692955090935050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614e4857815187529582019590820190600101614e2c565b509495945050505050565b15159052565b80516001600160a01b03168252602090810151910152565b60008251614e83818460208701615dfa565b9190910192915050565b90565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351614ec8816017850160208801615dfa565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614ef9816028840160208801615dfa565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296909716602087015260408601949094526060850192909252608084015260a0830152151560c082015290151560e08201526101000190565b6001600160a01b038b811682528a16602082015260408101899052606081018890526080810187905260a0810186905260c0810185905260e081018490528215156101008201526101608101614fb9610120830184614e59565b9b9a5050505050505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808716835260206080818501526150606080850188614e19565b8481036040860152865180825282880191830190855b81811015615094578351861683529284019291840191600101615076565b505085810360608701526150a88188614e19565b9a9950505050505050505050565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b6001600160a01b03949094168452602084019290925260408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156151c457815161513a858251614e0c565b8681015161514a88870182614e0c565b508086015185870152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101008082015161519882880182614e53565b505061012090810151906151ae86820183614e59565b5050610160939093019290850190600101615125565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156151c457815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c08082015115159086015260e0908101519061525581870183614e53565b50506101009390930192908501906001016151ee565b602080825282518282018190526000919060409081850190868401855b828110156151c45761529b848351614e59565b9284019290850190600101615288565b600060208252613b5e6020830184614e19565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152615306816040850160208701615dfa565b601f01601f19169190910160400192915050565b60208082526017908201527f43616e6e6f742061756374696f6e203020746f6b656e73000000000000000000604082015260600190565b6020808252602b908201527f486967686573742062696420646964206e6f74206d656574207468652072657360408201526a32b93b3290383934b1b29760a91b606082015260800190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b6020808252601d908201527f53656e646572206973206e6f742073656c6c6572206f722061646d696e000000604082015260600190565b6020808252605f908201527f43616e6e6f742063616e63656c2061756374696f6e206166746572206974206860408201527f617320656e64656420756e6c657373207468652068696768657374206269642060608201527f646964206e6f74206d6565742074686520726573657276652070726963652e00608082015260a00190565b6020808252601e908201527f5354415253206c697374696e677320617265206e6f7420616c6c6f7765640000604082015260600190565b6020808252601d908201527f4554482061756374696f6e7320617265206e6f7420616c6c6f7765642e000000604082015260600190565b602080825260119082015270050726963652063616e6e6f74206265203607c1b604082015260600190565b60208082526017908201527f41756374696f6e20646f6573206e6f742065786973742e000000000000000000604082015260600190565b60208082526014908201527343616e6e6f74206c697374203020746f6b656e7360601b604082015260600190565b60208082526018908201527f496e636f72726563742065787065637465642070726963650000000000000000604082015260600190565b6020808252601d908201527f4c697374696e6720646f6573206e6f7420616363657074205354415253000000604082015260600190565b6020808252601c908201527f455448206c697374696e677320617265206e6f7420616c6c6f77656400000000604082015260600190565b6020808252601b908201527f4c697374696e6720646f6573206e6f7420616363657074204554480000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b602080825260119082015270105d58dd1a5bdb881a185cc8195b991959607a1b604082015260600190565b6020808252600f908201526e5061796d656e74206661696c75726560881b604082015260600190565b6020808252601e908201527f53544152532061756374696f6e7320617265206e6f7420616c6c6f7765640000604082015260600190565b602080825260159082015274496e76616c696420696e707574206c656e6774687360581b604082015260600190565b60208082526029908201527f576974686472617720616d6f756e74206578636565647320617661696c61626c604082015268652062616c616e636560b81b606082015260800190565b6020808252818101527f41756374696f6e206d75737420737461727420696e2074686520667574757265604082015260600190565b602080825260169082015275105d58dd1a5bdb88191bd95cc81b9bdd08195e1a5cdd60521b604082015260600190565b60208082526017908201527f4c697374696e6720646f6573206e6f742065786973742e000000000000000000604082015260600190565b60208082526017908201527f496e636f727265637420696e707574206c656e67746873000000000000000000604082015260600190565b60208082526013908201527229b2b73232b91034b9903737ba1030b236b4b760691b604082015260600190565b60208082526012908201527141756374696f6e206973206f6e676f696e6760701b604082015260600190565b60208082526023908201527f416d6f756e7420646f6573206e6f74206d61746368206d6573736167652076616040820152626c756560e81b606082015260800190565b60208082526026908201527f426964206d75737420626520686967686572207468616e207374617274696e6760408201526520707269636560d01b606082015260800190565b602080825260169082015275131a5cdd1a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604082015260600190565b6020808252601b908201527f41756374696f6e20686173206e6f742073746172746564207965740000000000604082015260600190565b6020808252602a908201527f46656520706c757320636f6d6d697373696f6e206d757374206265206c657373604082015269207468616e203130302560b01b606082015260800190565b6020808252601d908201527f426964206973206c6f776572207468616e206869676865737420626964000000604082015260600190565b6020808252601b908201527f496e636f7272656374207472616e73616374696f6e2076616c75650000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526021908201527f456e642074696d65206d7573742062652061667465722073746172742074696d6040820152606560f81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e670000000000604082015260600190565b6020808252601d908201527f4f6e6c79204d6f67756c204e4654732063616e206265206c6973746564000000604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b998a526001600160a01b0398891660208b01529690971660408901526060880194909452608087019290925260a086015260c085015260e084015261010083019190915215156101208201526101400190565b9889526001600160a01b0397881660208a01529590961660408801526060870193909352608086019190915260a085015260c084015290151560e083015215156101008201526101200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b6040518181016001600160401b0381118282101715615d6157615d61615e6e565b604052919050565b60006001600160401b03821115615d8257615d82615e6e565b5060209081020190565b60008219821115615d9f57615d9f615e58565b500190565b600082615dbf57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615dde57615dde615e58565b500290565b600082821015615df557615df5615e58565b500390565b60005b83811015615e15578181015183820152602001615dfd565b83811115613d765750506000910152565b600081615e3557615e35615e58565b506000190190565b6000600019821415615e5157615e51615e58565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615e9957600080fd5b50565b8015158114615e9957600080fdfe2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca025096a264697066735822122016ccb0b77b62be2fd15b6edc10b8663587db3c2dd173bf0183443e958200b9a864736f6c634300080000332172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca025096000000000000000000000000c55c2175e90a46602fd42e931f62b3acc1a013ca000000000000000000000000e6a451b2b47e054c8cd37cddaab65aceea61f0cc0000000000000000000000001c3b019f6d5a38d3eeea65cc8ab8eca8d61dcc7000000000000000000000000073d7a7a3b831329aeb3f669b0f2fab639ac31e0a
Deployed Bytecode
0x6080604052600436106103815760003560e01c806388fe07da116101d1578063d4eda87711610102578063e6b75031116100a0578063f23a6e611161006f578063f23a6e6114610a32578063f4d6bacc14610a52578063f94545f014610a67578063fc52848214610a8757610381565b8063e6b75031146109bd578063e7dffa3f146109dd578063e986051a146109f2578063ee79eab614610a1257610381565b8063d9ec787d116100dc578063d9ec787d1461093f578063de74e57b1461095f578063e086e5ec14610993578063e5b75693146109a857610381565b8063d4eda877146108ea578063d547741f146108ff578063d8fd449b1461091f57610381565b8063aaccf1ec1161016f578063bc197c8111610149578063bc197c8114610868578063bf97c46714610895578063ca25c0d5146108b5578063d391014b146108d557610381565b8063aaccf1ec1461081e578063ad6a9cb714610833578063b699de0b1461084857610381565b806396b5a755116101ab57806396b5a755146107b45780639aafc6c9146107d4578063a217fddf146107f4578063a9196d5c1461080957610381565b806388fe07da1461076c5780638ec2d0d11461077f57806391d148541461079457610381565b80633853dea0116102b65780634e3bc43f11610254578063676c55d911610223578063676c55d9146107025780636ffb0d1e1461072257806373cb995414610742578063879a30f71461075757610381565b80634e3bc43f1461066c578063571a26a01461069957806357c90de5146106cf57806361146459146106e257610381565b80633f6738a9116102905780633f6738a9146105ea5780634626402b1461060a5780634c76fd231461062c5780634d0dfa4d1461064c57610381565b80633853dea0146105955780633968edad146105b55780633f6697fb146105d557610381565b80632016858a116103235780632f2ff15d116102fd5780632f2ff15d14610508578063305a67a81461052857806336275dba1461054857806336568abe1461057557610381565b80632016858a146104a657806322d8916e146104c8578063248a9ca3146104e857610381565b806310a0ee961161035f57806310a0ee961461040b578063141102861461042b578063149f1dfa146104595780631d32bfbd1461047957610381565b806301f741181461038657806301ffc9a7146103bc5780630f2f59fc146103e9575b600080fd5b34801561039257600080fd5b506103a66103a1366004614c9a565b610a9c565b6040516103b391906152ab565b60405180910390f35b3480156103c857600080fd5b506103dc6103d7366004614d4b565b610b7e565b6040516103b391906152be565b3480156103f557600080fd5b50610409610404366004614ccc565b610ba9565b005b34801561041757600080fd5b50610409610426366004614d94565b610bf9565b34801561043757600080fd5b5061044b61044636600461483f565b610ce0565b6040516103b3929190614fc8565b34801561046557600080fd5b50610409610474366004614c5b565b610d10565b34801561048557600080fd5b506104996104943660046146fb565b610d95565b6040516103b3919061526b565b3480156104b257600080fd5b506104bb610eca565b6040516103b391906152c9565b3480156104d457600080fd5b506104096104e3366004614c5b565b610ed0565b3480156104f457600080fd5b506104bb610503366004614d04565b610f50565b34801561051457600080fd5b50610409610523366004614d1c565b610f65565b34801561053457600080fd5b50610409610543366004614d04565b610f89565b34801561055457600080fd5b50610568610563366004614c9a565b611101565b6040516103b39190615108565b34801561058157600080fd5b50610409610590366004614d1c565b611297565b3480156105a157600080fd5b506104096105b0366004614d04565b6112dd565b3480156105c157600080fd5b506104096105d0366004614d04565b611316565b3480156105e157600080fd5b506103dc611348565b3480156105f657600080fd5b50610409610605366004614d04565b611356565b34801561061657600080fd5b5061061f6113f8565b6040516103b39190614f05565b34801561063857600080fd5b506103a6610647366004614c9a565b611407565b34801561065857600080fd5b50610409610667366004614d04565b6114ca565b34801561067857600080fd5b5061068c610687366004614c9a565b611561565b6040516103b391906151d1565b3480156106a557600080fd5b506106b96106b4366004614d04565b6116bb565b6040516103b39a99989796959493929190614f5f565b6104096106dd366004614d73565b611736565b3480156106ee57600080fd5b506104096106fd366004614ccc565b6119ca565b34801561070e57600080fd5b5061040961071d36600461486a565b611a18565b34801561072e57600080fd5b5061040961073d3660046148b1565b611b2c565b34801561074e57600080fd5b506104bb611dd4565b34801561076357600080fd5b506104bb611dda565b61040961077a366004614dcc565b611deb565b34801561078b57600080fd5b506104bb6123d7565b3480156107a057600080fd5b506103dc6107af366004614d1c565b6123dd565b3480156107c057600080fd5b506104096107cf366004614d04565b612406565b3480156107e057600080fd5b506104096107ef366004614d04565b6126ff565b34801561080057600080fd5b506104bb612cd3565b34801561081557600080fd5b506103dc612cd8565b34801561082a57600080fd5b506104bb612ce1565b34801561083f57600080fd5b506104bb612ce7565b34801561085457600080fd5b50610409610863366004614c5b565b612ced565b34801561087457600080fd5b506108886108833660046145ec565b612d6d565b6040516103b391906152d2565b3480156108a157600080fd5b506104096108b0366004614aed565b612d7e565b3480156108c157600080fd5b506104096108d03660046145d0565b612f98565b3480156108e157600080fd5b506104bb612fd7565b3480156108f657600080fd5b506104bb612fe9565b34801561090b57600080fd5b5061040961091a366004614d1c565b612fef565b34801561092b57600080fd5b5061040961093a366004614748565b61300e565b34801561094b57600080fd5b5061040961095a366004614d73565b613295565b34801561096b57600080fd5b5061097f61097a366004614d04565b61337f565b6040516103b3989796959493929190614f19565b34801561099f57600080fd5b506104096133d4565b3480156109b457600080fd5b506104bb613493565b3480156109c957600080fd5b506104096109d8366004614d04565b61349f565b3480156109e957600080fd5b50610409613558565b3480156109fe57600080fd5b50610409610a0d366004614994565b6135b4565b348015610a1e57600080fd5b50610409610a2d3660046145d0565b613787565b348015610a3e57600080fd5b50610888610a4d366004614695565b6137c6565b348015610a5e57600080fd5b506104bb6137d7565b348015610a7357600080fd5b50610409610a82366004614922565b6137dd565b348015610a9357600080fd5b506104bb613b43565b6060600082516001600160401b03811115610ac757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610af0578160200160208202803683370190505b50905060005b8351811015610b7757610b3a848281518110610b2257634e487b7160e01b600052603260045260246000fd5b60200260200101516010613b6590919063ffffffff16565b828281518110610b5a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610b6f81615e3d565b915050610af6565b5092915050565b60006001600160e01b031982166301ffc9a760e01b1480610ba35750610ba382613b71565b92915050565b610bc1600080516020615eab833981519152336123dd565b610be65760405162461bcd60e51b8152600401610bdd906158c3565b60405180910390fd5b600d805460ff1916911515919091179055565b6000838152601460205260409020546001600160a01b031633811480610c325750610c32600080516020615eab833981519152336123dd565b610c4e5760405162461bcd60e51b8152600401610bdd90615413565b82610c6b5760405162461bcd60e51b8152600401610bdd9061553b565b8115610c8a576000848152601460205260409020600401839055610c9f565b60008481526014602052604090206005018390555b7fb4de243dab4ede8abcce724ddf4ae9cb06784d1485659d964cadd18ec4774165848484604051610cd293929190615d28565b60405180910390a150505050565b6016602090815260009283526040808420909152908252902080546001909101546001600160a01b039091169082565b610d28600080516020615eab833981519152336123dd565b610d445760405162461bcd60e51b8152600401610bdd906158c3565b60005b81811015610d9057610d7e838383818110610d7257634e487b7160e01b600052603260045260246000fd5b90506020020135612406565b80610d8881615e3d565b915050610d47565b505050565b6060600082516001600160401b03811115610dc057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610df957816020015b610de6614371565b815260200190600190039081610dde5790505b50905060005b8351811015610ec2576001600160a01b03851660009081526016602052604081208551909190869084908110610e4557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252818101929092526040908101600020815180830190925280546001600160a01b0316825260010154918101919091528251839083908110610ea457634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610eba90615e3d565b915050610dff565b509392505050565b600b5481565b610ee8600080516020615eab833981519152336123dd565b610f045760405162461bcd60e51b8152600401610bdd906158c3565b60005b81811015610d9057610f3e838383818110610f3257634e487b7160e01b600052603260045260246000fd5b905060200201356126ff565b80610f4881615e3d565b915050610f07565b60009081526020819052604090206001015490565b610f6e82610f50565b610f7f81610f7a613b96565b613b9a565b610d908383613bfe565b6000818152601460205260409020546001600160a01b031633811480610fc25750610fc2600080516020615eab833981519152336123dd565b610fde5760405162461bcd60e51b8152600401610bdd90615413565b600260015414156110015760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611011601083613c83565b61102d5760405162461bcd60e51b8152600401610bdd906159a5565b6000828152601460205260409020611046601084613c8f565b506001810154815460028301546003840154604051637921219560e11b81526001600160a01b0394851694859463f242432a9461108e94309492909316929091600401614fe1565b600060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050507f411aee90354c51b1b04cd563fcab2617142a9d50da19232d888547c8a1b7fd8a846040516110ef91906152c9565b60405180910390a15050600180555050565b6060600082516001600160401b0381111561112c57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561116557816020015b611152614388565b81526020019060019003908161114a5790505b50905060005b8351811015610b7757601560006111b386848151811061119b57634e487b7160e01b600052603260045260246000fd5b60200260200101516012613b6590919063ffffffff16565b8152602080820192909252604090810160002081516101408101835281546001600160a01b03908116825260018301548116828601526002830154828501526003830154606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015460ff16151561010083015283518085019094526009830154168352600a9091015492820192909252610120820152825183908390811061127957634e487b7160e01b600052603260045260246000fd5b6020026020010181905250808061128f90615e3d565b91505061116b565b61129f613b96565b6001600160a01b0316816001600160a01b0316146112cf5760405162461bcd60e51b8152600401610bdd90615c2b565b6112d98282613c9b565b5050565b6112f5600080516020615eab833981519152336123dd565b6113115760405162461bcd60e51b8152600401610bdd906158c3565b600c55565b60035461132e906001600160a01b0316333084613d1e565b80600b60008282546113409190615d8c565b909155505050565b600d54610100900460ff1681565b61136e600080516020615eab833981519152336123dd565b61138a5760405162461bcd60e51b8152600401610bdd906158c3565b612710600a548261139b9190615d8c565b106113b85760405162461bcd60e51b8152600401610bdd90615a0c565b60078190556040517f2548d4d91d8b332ae8945480c38f398dfb94d1463a6e3f0daabefe396f8f3d9f906113ed9083906152c9565b60405180910390a150565b6002546001600160a01b031681565b6060600082516001600160401b0381111561143257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561145b578160200160208202803683370190505b50905060005b8351811015610b775761148d84828151811061119b57634e487b7160e01b600052603260045260246000fd5b8282815181106114ad57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806114c281615e3d565b915050611461565b6114e2600080516020615eab833981519152336123dd565b6114fe5760405162461bcd60e51b8152600401610bdd906158c3565b612710600a548261150f9190615d8c565b1061152c5760405162461bcd60e51b8152600401610bdd90615a0c565b60068190556040517f1464764941ab9dafdffba922e1e7b28bce233da326c0f130752d69a7e08b521c906113ed9083906152c9565b6060600082516001600160401b0381111561158c57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156115c557816020015b6115b26143f4565b8152602001906001900390816115aa5790505b50905060005b8351811015610b7757601460006115fb868481518110610b2257634e487b7160e01b600052603260045260246000fd5b815260208082019290925260409081016000208151610100808201845282546001600160a01b039081168352600184015416948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a08301526006015460ff808216151560c0840152929004909116151560e0820152825183908390811061169d57634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806116b390615e3d565b9150506115cb565b6015602090815260009182526040918290208054600182015460028301546003840154600485015460058601546006870154600788015460088901548b51808d01909c5260098a01546001600160a01b039081168d52600a909a01549a8c019a909a52968816999590971697939692959194909360ff16908a565b600260015414156117595760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611769601283613c83565b6117855760405162461bcd60e51b8152600401610bdd90615566565b600082815260156020526040902060058101544210156117b75760405162461bcd60e51b8152600401610bdd906159d5565b80600601544211156117db5760405162461bcd60e51b8152600401610bdd906156ed565b600a81015482116117fe5760405162461bcd60e51b8152600401610bdd90615a56565b806004015482116118215760405162461bcd60e51b8152600401610bdd9061595f565b600881015460ff16156118a257600354611846906001600160a01b0316333085613d1e565b6009810154600a82015460035461186b926001600160a01b0391821692911690613d7c565b604080518082019091523380825260209091018390526009820180546001600160a01b0319169091179055600a810182905561197c565b3482146118c15760405162461bcd60e51b8152600401610bdd9061591c565b6009810154600a8201546040516000926001600160a01b031691906118e590614e8d565b60006040518083038185875af1925050503d8060008114611922576040519150601f19603f3d011682016040523d82523d6000602084013e611927565b606091505b50509050806119485760405162461bcd60e51b8152600401610bdd90615718565b50604080518082019091523380825260209091018390526009820180546001600160a01b0319169091179055600a81018290555b60088101546040517f78c8056cb003d2206686471949a05cbf5a27d0f87c0f4236a9a957835c9de542916119b99133918791879160ff16906150e0565b60405180910390a150506001805550565b6119e2600080516020615eab833981519152336123dd565b6119fe5760405162461bcd60e51b8152600401610bdd906158c3565b600d80549115156101000261ff0019909216919091179055565b611a30600080516020615eab833981519152336123dd565b611a4c5760405162461bcd60e51b8152600401610bdd906158c3565b600a54811115611aa45761271060065482611a679190615d8c565b108015611a82575061271060075482611a809190615d8c565b105b611a9e5760405162461bcd60e51b8152600401610bdd90615a0c565b600a8190555b6040805180820182526001600160a01b038481168252602080830185815288831660009081526016835285812089825290925290849020925183546001600160a01b031916921691909117825551600190910155517f2bac2bc9e8f23d487a1c4823c97a4864973b4874188cbb3eeb47d76ec439860690610cd29086908690869086906150b6565b60026001541415611b4f5760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611b5f600e88613d9b565b611b7b5760405162461bcd60e51b8152600401610bdd90615bf4565b8115611b9e5783611b9e5760405162461bcd60e51b8152600401610bdd9061553b565b8015611bc15782611bc15760405162461bcd60e51b8152600401610bdd9061553b565b84611bde5760405162461bcd60e51b8152600401610bdd9061559d565b8115611c0657600d5460ff16611c065760405162461bcd60e51b8152600401610bdd906154cd565b8015611c3357600d54610100900460ff16611c335760405162461bcd60e51b8152600401610bdd90615639565b604051637921219560e11b815287906001600160a01b0382169063f242432a90611c6790339030908c908c90600401614fe1565b600060405180830381600087803b158015611c8157600080fd5b505af1158015611c95573d6000803e3d6000fd5b505050506000611ca3613db0565b6040805161010080820183523382526001600160a01b038d811660208085019182528486018f8152606086018f8152608087018f815260a088018f81528e151560c08a019081528e151560e08b0190815260008d815260149097529a909520985189546001600160a01b0319908116918916919091178a55955160018a0180549097169716969096179094559051600287015551600386015590516004850155905160058401555160069092018054935160ff199094169215159290921761ff001916921515029190911790559050611d7d601082613dca565b507f473615488a0acd7ce3cacdfee2c11b0cd8b6e82d0c53cabd1e7e85086f16d41481338b8b8b8b8b8b8b604051611dbd99989796959493929190615ccd565b60405180910390a150506001805550505050505050565b60085481565b6000611de66012613dd6565b905090565b60026001541415611e0e5760405162461bcd60e51b8152600401610bdd90615b86565b6002600155611e1e601085613c83565b611e3a5760405162461bcd60e51b8152600401610bdd90615855565b60008481526014602052604090206003810154841115611e6c5760405162461bcd60e51b8152600401610bdd90615bbd565b811561208257600681015460ff16611e965760405162461bcd60e51b8152600401610bdd90615602565b6000848260040154611ea89190615dc4565b9050838114611ec95760405162461bcd60e51b8152600401610bdd906155cb565b600061271060065483611edc9190615dc4565b611ee69190615da4565b6001808501546001600160a01b03166000908152601660209081526040808320600289015484529091528120909101549192509061271090611f289085615dc4565b611f329190615da4565b90508115611f5257600354611f52906001600160a01b0316333085613d1e565b60018401546001600160a01b039081166000908152601660209081526040808320600289015484529091529020541615611fc85760018401546001600160a01b03908116600090815260166020908152604080832060028901548452909152902054600354611fc8929081169133911684613d1e565b83546120029033906001600160a01b031683611fe48688615de3565b611fee9190615de3565b6003546001600160a01b0316929190613d1e565b600c5415612062576000612710600c548561201d9190615dc4565b6120279190615da4565b905080600b54106120605780600b60008282546120449190615de3565b9091555050600354612060906001600160a01b03163383613d7c565b505b81600960008282546120749190615d8c565b909155506122ef9350505050565b6006810154610100900460ff166120ab5760405162461bcd60e51b8152600401610bdd90615670565b60008482600501546120bd9190615dc4565b90508381146120de5760405162461bcd60e51b8152600401610bdd906155cb565b6000612710600754836120f19190615dc4565b6120fb9190615da4565b6001808501546001600160a01b0316600090815260166020908152604080832060028901548452909152812090910154919250906127109061213d9085615dc4565b6121479190615da4565b90508234146121685760405162461bcd60e51b8152600401610bdd90615a8d565b83546000906001600160a01b0316826121818587615de3565b61218b9190615de3565b60405161219790614e8d565b60006040518083038185875af1925050503d80600081146121d4576040519150601f19603f3d011682016040523d82523d6000602084013e6121d9565b606091505b50509050806121fa5760405162461bcd60e51b8152600401610bdd90615718565b60018501546001600160a01b03908116600090815260166020908152604080832060028a0154845290915290205416156122d35760018501546001600160a01b03908116600090815260166020908152604080832060028a0154845290915290819020549051911690839061226e90614e8d565b60006040518083038185875af1925050503d80600081146122ab576040519150601f19603f3d011682016040523d82523d6000602084013e6122b0565b606091505b505080915050806122d35760405162461bcd60e51b8152600401610bdd90615718565b82600860008282546122e59190615d8c565b9091555050505050505b838160030160008282546123039190615de3565b9091555050600381015461231e5761231c601086613c8f565b505b60018101546002820154604051637921219560e11b81526001600160a01b0390921691829163f242432a9161235c9130913391908b90600401614fe1565b600060405180830381600087803b15801561237657600080fd5b505af115801561238a573d6000803e3d6000fd5b505050507f5849fcb03b709a338ea379a79a96974ae538c21c0fabed319d4690aa6ac54379338787866040516123c394939291906150e0565b60405180910390a150506001805550505050565b600c5481565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600260015414156124295760405162461bcd60e51b8152600401610bdd90615b86565b60026001556000818152601560205260409020546001600160a01b0316338114806124675750612467600080516020615eab833981519152336123dd565b6124835760405162461bcd60e51b8152600401610bdd90615413565b61248e601283613c83565b6124aa5760405162461bcd60e51b8152600401610bdd90615825565b60008281526015602090815260409182902082516101408101845281546001600160a01b03908116825260018301548116828501526002830154828601526003830154606083015260048301546080830152600583015460a0830152600683015460c08301908152600784015460e0840152600884015460ff161515610100840152855180870190965260098401549091168552600a909201549284019290925261012082019290925290514211158061257057508060e0015181610120015160200151105b61258c5760405162461bcd60e51b8152600401610bdd9061544a565b6020810151815160408084015160608501519151637921219560e11b81526001600160a01b039094169363f242432a936125cc9330939192600401614fe1565b600060405180830381600087803b1580156125e657600080fd5b505af11580156125fa573d6000803e3d6000fd5b505050508061010001511561263457610120810151805160209091015160035461262f926001600160a01b0390911691613d7c565b6126c4565b6000816101200151600001516001600160a01b03168261012001516020015160405161265f90614e8d565b60006040518083038185875af1925050503d806000811461269c576040519150601f19603f3d011682016040523d82523d6000602084013e6126a1565b606091505b50509050806126c25760405162461bcd60e51b8152600401610bdd90615718565b505b6126cf601284613c8f565b507f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df836040516119b991906152c9565b600260015414156127225760405162461bcd60e51b8152600401610bdd90615b86565b6002600155612732601282613c83565b61274e5760405162461bcd60e51b8152600401610bdd90615825565b60008181526015602090815260409182902082516101408101845281546001600160a01b03908116825260018301548116828501526002830154828601526003830154606083015260048301546080830152600583015460a0830152600683015460c08301908152600784015460e0840152600884015460ff161515610100840152855180870190965260098401549091168552600a909201549284019290925261012082019290925290514210156128195760405162461bcd60e51b8152600401610bdd906158f0565b80516001600160a01b031633148015906128485750612846600080516020615eab833981519152336123dd565b155b1561287a578060e0015181610120015160200151101561287a5760405162461bcd60e51b8152600401610bdd90615351565b600080826101000151156128b357612710600654846101200151602001516128a29190615dc4565b6128ac9190615da4565b90506128da565b612710600754846101200151602001516128cd9190615dc4565b6128d79190615da4565b90505b6020808401516001600160a01b0316600090815260168252604080822081870151835283528120600101546101208601519092015190916127109161291f9190615dc4565b6129299190615da4565b905083610120015160000151925083610100015115612a7e5761297d84600001518284876101200151602001516129609190615de3565b61296a9190615de3565b6003546001600160a01b03169190613d7c565b6020808501516001600160a01b039081166000908152601683526040808220818901518352909352919091205416156129ef576020808501516001600160a01b03908116600090815260168352604080822081890151835290935291909120546003546129ef92908116911683613d7c565b600c5415612a61576000612710600c5486610120015160200151612a139190615dc4565b612a1d9190615da4565b905080600b5410612a5f5780600b6000828254612a3a9190615de3565b909155505061012085015151600354612a5f916001600160a01b039091169083613d7c565b505b8160096000828254612a739190615d8c565b90915550612c0a9050565b600084600001516001600160a01b0316828487610120015160200151612aa49190615de3565b612aae9190615de3565b604051612aba90614e8d565b60006040518083038185875af1925050503d8060008114612af7576040519150601f19603f3d011682016040523d82523d6000602084013e612afc565b606091505b5050905080612b1d5760405162461bcd60e51b8152600401610bdd90615718565b6020808601516001600160a01b039081166000908152601683526040808220818a0151835290935291909120541615612bf1576020808601516001600160a01b039081166000908152601683526040808220818a015183529093528290205491519116908390612b8c90614e8d565b60006040518083038185875af1925050503d8060008114612bc9576040519150601f19603f3d011682016040523d82523d6000602084013e612bce565b606091505b50508091505080612bf15760405162461bcd60e51b8152600401610bdd90615718565b8260086000828254612c039190615d8c565b9091555050505b83602001516001600160a01b031663f242432a3085876040015188606001516040518563ffffffff1660e01b8152600401612c489493929190614fe1565b600060405180830381600087803b158015612c6257600080fd5b505af1158015612c76573d6000803e3d6000fd5b50505050612c8e856012613c8f90919063ffffffff16565b507f10a4b36a41aae32780e0984ce67fee4a5a8929f404dfd68df31b645baa0189918386604051612cc0929190614fc8565b60405180910390a1505060018055505050565b600081565b600d5460ff1681565b60045481565b60065481565b612d05600080516020615eab833981519152336123dd565b612d215760405162461bcd60e51b8152600401610bdd906158c3565b60005b81811015610d9057612d5b838383818110612d4f57634e487b7160e01b600052603260045260246000fd5b90506020020135610f89565b80612d6581615e3d565b915050612d24565b63bc197c8160e01b95945050505050565b612d96600080516020615eab833981519152336123dd565b612db25760405162461bcd60e51b8152600401610bdd906158c3565b8a89148015612dc057508887145b8015612dcb57508685145b8015612dd75750835185145b8015612de4575082518451145b8015612df1575081518351145b8015612dfe575080518251145b612e1a5760405162461bcd60e51b8152600401610bdd9061588c565b60005b8b811015612f8957612f778d8d83818110612e4857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612e5d91906145d0565b8c8c84818110612e7d57634e487b7160e01b600052603260045260246000fd5b905060200201358b8b85818110612ea457634e487b7160e01b600052603260045260246000fd5b905060200201358a8a86818110612ecb57634e487b7160e01b600052603260045260246000fd5b90506020020135898681518110612ef257634e487b7160e01b600052603260045260246000fd5b6020026020010151898781518110612f1a57634e487b7160e01b600052603260045260246000fd5b6020026020010151898881518110612f4257634e487b7160e01b600052603260045260246000fd5b6020026020010151898981518110612f6a57634e487b7160e01b600052603260045260246000fd5b60200260200101516137dd565b80612f8181615e3d565b915050612e1d565b50505050505050505050505050565b612fb0600080516020615eab833981519152336123dd565b612fcc5760405162461bcd60e51b8152600401610bdd906158c3565b6112d9600e82613de1565b600080516020615eab83398151915281565b60075481565b612ff882610f50565b61300481610f7a613b96565b610d908383613c9b565b613026600080516020615eab833981519152336123dd565b6130425760405162461bcd60e51b8152600401610bdd906158c3565b81518351148015613054575080518251145b6130705760405162461bcd60e51b8152600401610bdd90615778565b60006007546006541115613087575060065461308c565b506007545b60005b845181101561325057600a548382815181106130bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151111561314b57612710828483815181106130ed57634e487b7160e01b600052603260045260246000fd5b60200260200101516130ff9190615d8c565b1061311c5760405162461bcd60e51b8152600401610bdd90615a0c565b82818151811061313c57634e487b7160e01b600052603260045260246000fd5b6020026020010151600a819055505b604051806040016040528085838151811061317657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031681526020018483815181106131ac57634e487b7160e01b600052603260045260246000fd5b602002602001015181525060166000886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106131fe57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825281810192909252604001600020825181546001600160a01b0319166001600160a01b039091161781559101516001909101558061324881615e3d565b91505061308f565b507fb4347d764d60959f296b5437e67674d3e0f95c18c6eb2be0909821ebfd4ed70e85858585604051613286949392919061503d565b60405180910390a15050505050565b600260015414156132b85760405162461bcd60e51b8152600401610bdd90615b86565b60026001556000828152601560205260409020546001600160a01b0316338114806132f657506132f6600080516020615eab833981519152336123dd565b6133125760405162461bcd60e51b8152600401610bdd90615413565b61331d601284613c83565b6133395760405162461bcd60e51b8152600401610bdd90615825565b60008381526015602052604090819020600701839055517fe1cac5dced4f280522703654f134d3e9c1938cce8ea173bbbd59126188d8fa26906119b99085908590615d1a565b60146020526000908152604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b0395861696959094169492939192909160ff8082169161010090041688565b6133ec600080516020615eab833981519152336123dd565b6134085760405162461bcd60e51b8152600401610bdd906158c3565b6002546008546040516000926001600160a01b0316919061342890614e8d565b60006040518083038185875af1925050503d8060008114613465576040519150601f19603f3d011682016040523d82523d6000602084013e61346a565b606091505b505090508061348b5760405162461bcd60e51b8152600401610bdd90615718565b506000600855565b6000611de66010613dd6565b6134b7600080516020615eab833981519152336123dd565b6134d35760405162461bcd60e51b8152600401610bdd906158c3565b600260015414156134f65760405162461bcd60e51b8152600401610bdd90615b86565b6002600155600b5481111561351d5760405162461bcd60e51b8152600401610bdd906157a7565b80600b600082825461352f9190615de3565b9091555050600254600354613551916001600160a01b03918216911683613d7c565b5060018055565b613570600080516020615eab833981519152336123dd565b61358c5760405162461bcd60e51b8152600401610bdd906158c3565b6002546009546003546135ad926001600160a01b0391821692911690613d7c565b6000600955565b6135cc600080516020615eab833981519152336123dd565b6135e85760405162461bcd60e51b8152600401610bdd906158c3565b8a891480156135f657508887145b801561360157508685145b801561360c57508483145b80156136185750815183145b8015613625575080518251145b6136415760405162461bcd60e51b8152600401610bdd9061588c565b60005b8b811015612f89576137758d8d8381811061366f57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061368491906145d0565b8c8c848181106136a457634e487b7160e01b600052603260045260246000fd5b905060200201358b8b858181106136cb57634e487b7160e01b600052603260045260246000fd5b905060200201358a8a868181106136f257634e487b7160e01b600052603260045260246000fd5b9050602002013589898781811061371957634e487b7160e01b600052603260045260246000fd5b9050602002013588878151811061374057634e487b7160e01b600052603260045260246000fd5b602002602001015188888151811061376857634e487b7160e01b600052603260045260246000fd5b6020026020010151611b2c565b8061377f81615e3d565b915050613644565b61379f600080516020615eab833981519152336123dd565b6137bb5760405162461bcd60e51b8152600401610bdd906158c3565b6112d9600e82613b49565b63f23a6e6160e01b95945050505050565b60095481565b600260015414156138005760405162461bcd60e51b8152600401610bdd90615b86565b60026001558284106138245760405162461bcd60e51b8152600401610bdd90615afb565b4284116138435760405162461bcd60e51b8152600401610bdd906157f0565b61384e600e89613d9b565b61386a5760405162461bcd60e51b8152600401610bdd90615bf4565b856138875760405162461bcd60e51b8152600401610bdd9061531a565b80156138b457600d5460ff166138af5760405162461bcd60e51b8152600401610bdd90615741565b6138db565b600d54610100900460ff166138db5760405162461bcd60e51b8152600401610bdd90615504565b604051637921219560e11b815288906001600160a01b0382169063f242432a9061390f90339030908d908d90600401614fe1565b600060405180830381600087803b15801561392957600080fd5b505af115801561393d573d6000803e3d6000fd5b50505050600061394b613df6565b9050604051806101400160405280336001600160a01b031681526020018b6001600160a01b031681526020018a815260200189815260200188815260200187815260200186815260200185815260200184151581526020016040518060400160405280336001600160a01b0316815260200160008152508152506015600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160090160008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550602082015181600101555050905050613ae9816012613dca90919063ffffffff16565b507f69347c7137bbb60bb8e71d6c135c630105bb7828cbdfbd204863422b15c1033881338c8c8c8c8c8c8c8c604051613b2b9a99989796959493929190615c7a565b60405180910390a15050600180555050505050505050565b60055481565b6000613b5e836001600160a01b038416613e07565b9392505050565b6000613b5e8383613e51565b60006001600160e01b03198216637965db0b60e01b1480610ba35750610ba382613eaa565b3390565b613ba482826123dd565b6112d957613bbc816001600160a01b03166014613ecf565b613bc7836020613ecf565b604051602001613bd8929190614e90565b60408051601f198184030181529082905262461bcd60e51b8252610bdd916004016152e7565b613c0882826123dd565b6112d9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055613c3f613b96565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000613b5e8383614080565b6000613b5e8383614098565b613ca582826123dd565b156112d9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055613cda613b96565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b613d76846323b872dd60e01b858585604051602401613d3f93929190615019565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526141af565b50505050565b610d908363a9059cbb60e01b8484604051602401613d3f929190614fc8565b6000613b5e836001600160a01b038416614080565b6004805460009182613dc183615e3d565b91905055905090565b6000613b5e8383613e07565b6000610ba38261423e565b6000613b5e836001600160a01b038416614098565b6005805460009182613dc183615e3d565b6000613e138383614080565b613e4957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ba3565b506000610ba3565b81546000908210613e745760405162461bcd60e51b8152600401610bdd9061539c565b826000018281548110613e9757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60006001600160e01b03198216630271189760e51b1480610ba35750610ba382614242565b60606000613ede836002615dc4565b613ee9906002615d8c565b6001600160401b03811115613f0e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613f38576020820181803683370190505b509050600360fc1b81600081518110613f6157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613f9e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000613fc2846002615dc4565b613fcd906001615d8c565b90505b6001811115614061576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061400f57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061403357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361405a81615e26565b9050613fd0565b508315613b5e5760405162461bcd60e51b8152600401610bdd906153de565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156141a55760006140bc600183615de3565b85549091506000906140d090600190615de3565b905060008660000182815481106140f757634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061412857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061416957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ba3565b6000915050610ba3565b6000614204826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661425b9092919063ffffffff16565b805190915015610d9057808060200190518101906142229190614ce8565b610d905760405162461bcd60e51b8152600401610bdd90615b3c565b5490565b6001600160e01b031981166301ffc9a760e01b14919050565b606061426a8484600085614272565b949350505050565b6060824710156142945760405162461bcd60e51b8152600401610bdd906156a7565b61429d85614332565b6142b95760405162461bcd60e51b8152600401610bdd90615ac4565b600080866001600160a01b031685876040516142d59190614e71565b60006040518083038185875af1925050503d8060008114614312576040519150601f19603f3d011682016040523d82523d6000602084013e614317565b606091505b5091509150614327828286614338565b979650505050505050565b3b151590565b60608315614347575081613b5e565b8251156143575782518084602001fd5b8160405162461bcd60e51b8152600401610bdd91906152e7565b604080518082019091526000808252602082015290565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016143ef614371565b905290565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b60008083601f840112614460578182fd5b5081356001600160401b03811115614476578182fd5b602083019150836020808302850101111561449057600080fd5b9250929050565b600082601f8301126144a7578081fd5b813560206144bc6144b783615d69565b615d40565b82815281810190858301838502870184018810156144d8578586fd5b855b858110156144ff5781356144ed81615e9c565b845292840192908401906001016144da565b5090979650505050505050565b600082601f83011261451c578081fd5b8135602061452c6144b783615d69565b8281528181019085830183850287018401881015614548578586fd5b855b858110156144ff5781358452928401929084019060010161454a565b600082601f830112614576578081fd5b81356001600160401b0381111561458f5761458f615e6e565b6145a2601f8201601f1916602001615d40565b8181528460208386010111156145b6578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156145e1578081fd5b8135613b5e81615e84565b600080600080600060a08688031215614603578081fd5b853561460e81615e84565b9450602086013561461e81615e84565b935060408601356001600160401b0380821115614639578283fd5b61464589838a0161450c565b9450606088013591508082111561465a578283fd5b61466689838a0161450c565b9350608088013591508082111561467b578283fd5b5061468888828901614566565b9150509295509295909350565b600080600080600060a086880312156146ac578081fd5b85356146b781615e84565b945060208601356146c781615e84565b9350604086013592506060860135915060808601356001600160401b038111156146ef578182fd5b61468888828901614566565b6000806040838503121561470d578182fd5b823561471881615e84565b915060208301356001600160401b03811115614732578182fd5b61473e8582860161450c565b9150509250929050565b6000806000806080858703121561475d578384fd5b843561476881615e84565b93506020858101356001600160401b0380821115614784578586fd5b61479089838a0161450c565b955060408801359150808211156147a5578485fd5b818801915088601f8301126147b8578485fd5b81356147c66144b782615d69565b81815284810190848601868402860187018d10156147e2578889fd5b8895505b8386101561480d5780356147f981615e84565b8352600195909501949186019186016147e6565b50965050506060880135925080831115614825578384fd5b50506148338782880161450c565b91505092959194509250565b60008060408385031215614851578182fd5b823561485c81615e84565b946020939093013593505050565b6000806000806080858703121561487f578182fd5b843561488a81615e84565b93506020850135925060408501356148a181615e84565b9396929550929360600135925050565b600080600080600080600060e0888a0312156148cb578485fd5b87356148d681615e84565b96506020880135955060408801359450606088013593506080880135925060a088013561490281615e9c565b915060c088013561491281615e9c565b8091505092959891949750929550565b600080600080600080600080610100898b03121561493e578182fd5b883561494981615e84565b97506020890135965060408901359550606089013594506080890135935060a0890135925060c0890135915060e089013561498381615e9c565b809150509295985092959890939650565b60008060008060008060008060008060008060e08d8f0312156149b5578586fd5b6001600160401b038d3511156149c9578586fd5b6149d68e8e358f0161444f565b909c509a506001600160401b0360208e013511156149f2578586fd5b614a028e60208f01358f0161444f565b909a5098506001600160401b0360408e01351115614a1e578586fd5b614a2e8e60408f01358f0161444f565b90985096506001600160401b0360608e01351115614a4a578586fd5b614a5a8e60608f01358f0161444f565b90965094506001600160401b0360808e01351115614a76578384fd5b614a868e60808f01358f0161444f565b90945092506001600160401b0360a08e01351115614aa2578081fd5b614ab28e60a08f01358f01614497565b91506001600160401b0360c08e01351115614acb578081fd5b614adb8e60c08f01358f01614497565b90509295989b509295989b509295989b565b6000806000806000806000806000806000806101008d8f031215614b0f578586fd5b6001600160401b038d351115614b23578586fd5b614b308e8e358f0161444f565b909c509a506001600160401b0360208e01351115614b4c578586fd5b614b5c8e60208f01358f0161444f565b909a5098506001600160401b0360408e01351115614b78578586fd5b614b888e60408f01358f0161444f565b90985096506001600160401b0360608e01351115614ba4578586fd5b614bb48e60608f01358f0161444f565b90965094506001600160401b0360808e01351115614bd0578182fd5b614be08e60808f01358f0161450c565b93506001600160401b0360a08e01351115614bf9578182fd5b614c098e60a08f01358f0161450c565b92506001600160401b0360c08e01351115614c22578182fd5b614c328e60c08f01358f0161450c565b91506001600160401b0360e08e01351115614c4b578081fd5b614adb8e60e08f01358f01614497565b60008060208385031215614c6d578182fd5b82356001600160401b03811115614c82578283fd5b614c8e8582860161444f565b90969095509350505050565b600060208284031215614cab578081fd5b81356001600160401b03811115614cc0578182fd5b61426a8482850161450c565b600060208284031215614cdd578081fd5b8135613b5e81615e9c565b600060208284031215614cf9578081fd5b8151613b5e81615e9c565b600060208284031215614d15578081fd5b5035919050565b60008060408385031215614d2e578182fd5b823591506020830135614d4081615e84565b809150509250929050565b600060208284031215614d5c578081fd5b81356001600160e01b031981168114613b5e578182fd5b60008060408385031215614d85578182fd5b50508035926020909101359150565b600080600060608486031215614da8578081fd5b83359250602084013591506040840135614dc181615e9c565b809150509250925092565b60008060008060808587031215614de1578182fd5b8435935060208501359250604085013591506060850135614e0181615e9c565b939692955090935050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614e4857815187529582019590820190600101614e2c565b509495945050505050565b15159052565b80516001600160a01b03168252602090810151910152565b60008251614e83818460208701615dfa565b9190910192915050565b90565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351614ec8816017850160208801615dfa565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614ef9816028840160208801615dfa565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296909716602087015260408601949094526060850192909252608084015260a0830152151560c082015290151560e08201526101000190565b6001600160a01b038b811682528a16602082015260408101899052606081018890526080810187905260a0810186905260c0810185905260e081018490528215156101008201526101608101614fb9610120830184614e59565b9b9a5050505050505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808716835260206080818501526150606080850188614e19565b8481036040860152865180825282880191830190855b81811015615094578351861683529284019291840191600101615076565b505085810360608701526150a88188614e19565b9a9950505050505050505050565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b6001600160a01b03949094168452602084019290925260408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156151c457815161513a858251614e0c565b8681015161514a88870182614e0c565b508086015185870152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101008082015161519882880182614e53565b505061012090810151906151ae86820183614e59565b5050610160939093019290850190600101615125565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156151c457815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c08082015115159086015260e0908101519061525581870183614e53565b50506101009390930192908501906001016151ee565b602080825282518282018190526000919060409081850190868401855b828110156151c45761529b848351614e59565b9284019290850190600101615288565b600060208252613b5e6020830184614e19565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152615306816040850160208701615dfa565b601f01601f19169190910160400192915050565b60208082526017908201527f43616e6e6f742061756374696f6e203020746f6b656e73000000000000000000604082015260600190565b6020808252602b908201527f486967686573742062696420646964206e6f74206d656574207468652072657360408201526a32b93b3290383934b1b29760a91b606082015260800190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b6020808252601d908201527f53656e646572206973206e6f742073656c6c6572206f722061646d696e000000604082015260600190565b6020808252605f908201527f43616e6e6f742063616e63656c2061756374696f6e206166746572206974206860408201527f617320656e64656420756e6c657373207468652068696768657374206269642060608201527f646964206e6f74206d6565742074686520726573657276652070726963652e00608082015260a00190565b6020808252601e908201527f5354415253206c697374696e677320617265206e6f7420616c6c6f7765640000604082015260600190565b6020808252601d908201527f4554482061756374696f6e7320617265206e6f7420616c6c6f7765642e000000604082015260600190565b602080825260119082015270050726963652063616e6e6f74206265203607c1b604082015260600190565b60208082526017908201527f41756374696f6e20646f6573206e6f742065786973742e000000000000000000604082015260600190565b60208082526014908201527343616e6e6f74206c697374203020746f6b656e7360601b604082015260600190565b60208082526018908201527f496e636f72726563742065787065637465642070726963650000000000000000604082015260600190565b6020808252601d908201527f4c697374696e6720646f6573206e6f7420616363657074205354415253000000604082015260600190565b6020808252601c908201527f455448206c697374696e677320617265206e6f7420616c6c6f77656400000000604082015260600190565b6020808252601b908201527f4c697374696e6720646f6573206e6f7420616363657074204554480000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b602080825260119082015270105d58dd1a5bdb881a185cc8195b991959607a1b604082015260600190565b6020808252600f908201526e5061796d656e74206661696c75726560881b604082015260600190565b6020808252601e908201527f53544152532061756374696f6e7320617265206e6f7420616c6c6f7765640000604082015260600190565b602080825260159082015274496e76616c696420696e707574206c656e6774687360581b604082015260600190565b60208082526029908201527f576974686472617720616d6f756e74206578636565647320617661696c61626c604082015268652062616c616e636560b81b606082015260800190565b6020808252818101527f41756374696f6e206d75737420737461727420696e2074686520667574757265604082015260600190565b602080825260169082015275105d58dd1a5bdb88191bd95cc81b9bdd08195e1a5cdd60521b604082015260600190565b60208082526017908201527f4c697374696e6720646f6573206e6f742065786973742e000000000000000000604082015260600190565b60208082526017908201527f496e636f727265637420696e707574206c656e67746873000000000000000000604082015260600190565b60208082526013908201527229b2b73232b91034b9903737ba1030b236b4b760691b604082015260600190565b60208082526012908201527141756374696f6e206973206f6e676f696e6760701b604082015260600190565b60208082526023908201527f416d6f756e7420646f6573206e6f74206d61746368206d6573736167652076616040820152626c756560e81b606082015260800190565b60208082526026908201527f426964206d75737420626520686967686572207468616e207374617274696e6760408201526520707269636560d01b606082015260800190565b602080825260169082015275131a5cdd1a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604082015260600190565b6020808252601b908201527f41756374696f6e20686173206e6f742073746172746564207965740000000000604082015260600190565b6020808252602a908201527f46656520706c757320636f6d6d697373696f6e206d757374206265206c657373604082015269207468616e203130302560b01b606082015260800190565b6020808252601d908201527f426964206973206c6f776572207468616e206869676865737420626964000000604082015260600190565b6020808252601b908201527f496e636f7272656374207472616e73616374696f6e2076616c75650000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526021908201527f456e642074696d65206d7573742062652061667465722073746172742074696d6040820152606560f81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e670000000000604082015260600190565b6020808252601d908201527f4f6e6c79204d6f67756c204e4654732063616e206265206c6973746564000000604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b998a526001600160a01b0398891660208b01529690971660408901526060880194909452608087019290925260a086015260c085015260e084015261010083019190915215156101208201526101400190565b9889526001600160a01b0397881660208a01529590961660408801526060870193909352608086019190915260a085015260c084015290151560e083015215156101008201526101200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b6040518181016001600160401b0381118282101715615d6157615d61615e6e565b604052919050565b60006001600160401b03821115615d8257615d82615e6e565b5060209081020190565b60008219821115615d9f57615d9f615e58565b500190565b600082615dbf57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615dde57615dde615e58565b500290565b600082821015615df557615df5615e58565b500390565b60005b83811015615e15578181015183820152602001615dfd565b83811115613d765750506000910152565b600081615e3557615e35615e58565b506000190190565b6000600019821415615e5157615e51615e58565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615e9957600080fd5b50565b8015158114615e9957600080fdfe2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca025096a264697066735822122016ccb0b77b62be2fd15b6edc10b8663587db3c2dd173bf0183443e958200b9a864736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c55c2175e90a46602fd42e931f62b3acc1a013ca000000000000000000000000e6a451b2b47e054c8cd37cddaab65aceea61f0cc0000000000000000000000001c3b019f6d5a38d3eeea65cc8ab8eca8d61dcc7000000000000000000000000073d7a7a3b831329aeb3f669b0f2fab639ac31e0a
-----Decoded View---------------
Arg [0] : starsAddress (address): 0xc55c2175E90A46602fD42e931f62B3Acc1A013Ca
Arg [1] : _admin (address): 0xE6a451b2b47E054C8Cd37cDdaAB65acEea61F0cc
Arg [2] : _treasuryWallet (address): 0x1c3B019F6d5a38d3EEea65cc8AB8EcA8D61dCC70
Arg [3] : _mogulNFTAddress (address): 0x73D7A7A3b831329AEb3F669b0f2fAB639ac31E0a
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c55c2175e90a46602fd42e931f62b3acc1a013ca
Arg [1] : 000000000000000000000000e6a451b2b47e054c8cd37cddaab65aceea61f0cc
Arg [2] : 0000000000000000000000001c3b019f6d5a38d3eeea65cc8ab8eca8d61dcc70
Arg [3] : 00000000000000000000000073d7a7a3b831329aeb3f669b0f2fab639ac31e0a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000601 | 46,840.85 | $28.16 |
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.