Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 771 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Settle Auction | 19178551 | 144 days ago | IN | 0 ETH | 0.01000154 | ||||
Settle Multiple ... | 19178540 | 144 days ago | IN | 0 ETH | 0.03235437 | ||||
Settle Multiple ... | 19178488 | 144 days ago | IN | 0 ETH | 0.07468429 | ||||
Settle Auction | 19178361 | 144 days ago | IN | 0 ETH | 0.00937288 | ||||
Settle Multiple ... | 19178327 | 144 days ago | IN | 0 ETH | 0.00419197 | ||||
Settle Auction | 19178267 | 144 days ago | IN | 0 ETH | 0.00495915 | ||||
Settle Auction | 19178262 | 144 days ago | IN | 0 ETH | 0.00417391 | ||||
Settle Auction | 19178261 | 144 days ago | IN | 0 ETH | 0.00497315 | ||||
Settle Auction | 19178257 | 144 days ago | IN | 0 ETH | 0.0048352 | ||||
Settle Auction | 19178255 | 144 days ago | IN | 0 ETH | 0.00464465 | ||||
Settle Auction | 19178253 | 144 days ago | IN | 0 ETH | 0.00627317 | ||||
Settle Auction | 19178251 | 144 days ago | IN | 0 ETH | 0.00586037 | ||||
Settle Auction | 19178244 | 144 days ago | IN | 0 ETH | 0.00399271 | ||||
Settle Auction | 19178240 | 144 days ago | IN | 0 ETH | 0.00408633 | ||||
Settle Auction | 19178238 | 144 days ago | IN | 0 ETH | 0.00649994 | ||||
Settle Auction | 19178237 | 144 days ago | IN | 0 ETH | 0.00417367 | ||||
Settle Auction | 19178234 | 144 days ago | IN | 0 ETH | 0.00451189 | ||||
Settle Auction | 19178232 | 144 days ago | IN | 0 ETH | 0.00482366 | ||||
Settle Auction | 19178229 | 144 days ago | IN | 0 ETH | 0.00484793 | ||||
Settle Auction | 19178227 | 144 days ago | IN | 0 ETH | 0.00472601 | ||||
Settle Auction | 19178225 | 144 days ago | IN | 0 ETH | 0.00404006 | ||||
Settle Auction | 19178223 | 144 days ago | IN | 0 ETH | 0.00580965 | ||||
Settle Auction | 19178221 | 144 days ago | IN | 0 ETH | 0.00501967 | ||||
Settle Auction | 19178215 | 144 days ago | IN | 0 ETH | 0.00437302 | ||||
Settle Auction | 19178212 | 144 days ago | IN | 0 ETH | 0.00646389 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
19178551 | 144 days ago | 0.21 ETH | ||||
19178551 | 144 days ago | 0.63 ETH | ||||
19178540 | 144 days ago | 0.569 ETH | ||||
19178540 | 144 days ago | 0.573 ETH | ||||
19178540 | 144 days ago | 0.3465 ETH | ||||
19178540 | 144 days ago | 0.375 ETH | ||||
19178540 | 144 days ago | 0.4125 ETH | ||||
19178488 | 144 days ago | 4.346 ETH | ||||
19178488 | 144 days ago | 0.3825 ETH | ||||
19178488 | 144 days ago | 0.4875 ETH | ||||
19178488 | 144 days ago | 0.2325 ETH | ||||
19178488 | 144 days ago | 0.537 ETH | ||||
19178488 | 144 days ago | 0.27 ETH | ||||
19178488 | 144 days ago | 0.04 ETH | ||||
19178488 | 144 days ago | 0.54675 ETH | ||||
19178488 | 144 days ago | 0.3375 ETH | ||||
19178488 | 144 days ago | 0.05 ETH | ||||
19178488 | 144 days ago | 0.41625 ETH | ||||
19178488 | 144 days ago | 0.27 ETH | ||||
19178488 | 144 days ago | 0.04 ETH | ||||
19178488 | 144 days ago | 0.3375 ETH | ||||
19178488 | 144 days ago | 0.05 ETH | ||||
19178488 | 144 days ago | 0.75 ETH | ||||
19178488 | 144 days ago | 0.3375 ETH | ||||
19178488 | 144 days ago | 0.05 ETH |
Loading...
Loading
Contract Name:
ArtMarketplace
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.3/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "./libs/SafeTransferLib.sol"; contract ArtMarketplace is Ownable { uint256 private constant BPS = 10_000; uint256 private constant BID_INCREASE_THRESHOLD = 0.2 ether; uint256 private constant DEFAULT_SPLIT = 7_500; uint256 private constant EXTENSION_TIME = 10 minutes; uint256 private constant INIT_AUCTION_DURATION = 24 hours; uint256 private constant MIN_BID = 0.1 ether; uint256 private constant MIN_BID_INCREASE_PRE = 2_000; uint256 private constant MIN_BID_INCREASE_POST = 1_000; uint256 private constant SAFE_GAS_LIMIT = 30_000; IERC721 private constant CONTRACT_AD = IERC721(0x9CF0aB1cc434dB83097B7E9c831a764481DEc747); IERC721 private constant CONTRACT_FPP = IERC721(0xA8A425864dB32fCBB459Bf527BdBb8128e6abF21); mapping(address => uint256) public discountsCount; address public beneficiary; bool public paused; struct Auction { uint24 offsetFromEnd; uint72 amount; address bidder; } struct AuctionConfig { address artist; uint16 split; uint80 buyNowStartTime; uint80 auctionStartTime; uint88 buyNowPrice; uint88 reservePrice; uint256 preBidPrice; } mapping(uint256 => AuctionConfig) public auctionConfig; mapping(uint256 => Auction) public auctionIdToAuction; event BidMade( uint256 indexed auctionId, address indexed collectionAddress, uint256 indexed tokenId, address bidder, uint256 amount, uint256 timestamp ); event Settled( uint256 indexed auctionId, address indexed collectionAddress, uint256 indexed tokenId, uint256 timestamp, uint256 price ); function bid( uint256 auctionId ) external payable { require(!paused, 'Bidding is paused'); if (auctionConfig[auctionId].auctionStartTime == type(uint80).max) { auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp); } uint256 preBidPrice = auctionConfig[auctionId].preBidPrice; require( ( isAuctionActive(auctionId) || (preBidPrice > 0 && msg.value >= preBidPrice) ) && block.timestamp >= auctionConfig[auctionId].buyNowStartTime, 'Auction Inactive' ); Auction memory highestBid = auctionIdToAuction[auctionId]; uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE; require( msg.value >= (highestBid.amount * (BPS + bidIncrease) / BPS) && msg.value >= reservePrice(auctionId), 'Bid not high enough' ); uint256 refundAmount; address refundBidder; uint256 offset = highestBid.offsetFromEnd; uint256 endTime = getAuctionEndTime(auctionId); if (highestBid.amount > 0) { refundAmount = highestBid.amount; refundBidder = highestBid.bidder; } if (endTime - block.timestamp < EXTENSION_TIME) { offset += block.timestamp + EXTENSION_TIME - endTime; } auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(msg.value), msg.sender); emit BidMade( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), msg.sender, msg.value, block.timestamp ); if (refundAmount > 0) { SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT); } } function bidOnFavs( uint256[] calldata favorites, uint256[] calldata expectedPrices ) external payable { require(!paused, 'Bidding is paused'); require(favorites.length == expectedPrices.length); uint256 totalFailed; uint256 expectedTotal; for(uint256 i; i < favorites.length; ++i) { uint256 auctionId = favorites[i]; uint256 expectedPrice = expectedPrices[i]; expectedTotal += expectedPrice; AuctionConfig memory config = auctionConfig[auctionId]; if (config.auctionStartTime == type(uint80).max) { auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp); } if ( !( isAuctionActive(auctionId) || (config.preBidPrice > 0 && expectedPrice >= config.preBidPrice) ) || block.timestamp < config.buyNowStartTime ) { totalFailed += expectedPrice; continue; } Auction memory highestBid = auctionIdToAuction[auctionId]; uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE; if ( expectedPrice >= (highestBid.amount * (BPS + bidIncrease) / BPS) && expectedPrice >= reservePrice(auctionId) ) { uint256 refundAmount; address refundBidder; uint256 offset = highestBid.offsetFromEnd; uint256 endTime = getAuctionEndTime(auctionId); if (highestBid.amount > 0) { refundAmount = highestBid.amount; refundBidder = highestBid.bidder; } if (endTime - block.timestamp < EXTENSION_TIME) { offset += block.timestamp + EXTENSION_TIME - endTime; } auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(expectedPrice), msg.sender); emit BidMade( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), msg.sender, expectedPrice, block.timestamp ); if (refundAmount > 0) { SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT); } } else { totalFailed += expectedPrice; } } require(msg.value == expectedTotal, 'Incorrect amount of ETH sent'); if (totalFailed > 0) { SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT); } } function buyNow( uint256 auctionId ) external payable { AuctionConfig memory config = auctionConfig[auctionId]; uint256 amountToPay = config.buyNowPrice; require(!paused, 'Buying is paused'); require(block.timestamp >= config.buyNowStartTime, 'Can not buy now yet.'); require(config.auctionStartTime > block.timestamp, 'Auction already started.'); require(amountToPay != 0 && msg.value == amountToPay, 'Incorrect ETH sent.'); auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp - INIT_AUCTION_DURATION); auctionIdToAuction[auctionId] = Auction(0, uint72(msg.value), msg.sender); _mint(msg.sender, auctionId); emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp, amountToPay ); uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } function buyNowMultiple( uint256[] calldata auctionIds ) external payable { require(!paused, 'Buying is paused'); uint256 totalFailed; uint256 totalPrice; for(uint256 i; i < auctionIds.length; ++i) { uint256 auctionId = auctionIds[i]; AuctionConfig memory config = auctionConfig[auctionId]; uint256 amountToPay = config.buyNowPrice; if ( (block.timestamp < config.buyNowStartTime) ||(config.auctionStartTime <= block.timestamp) || amountToPay == 0 ) { totalFailed += amountToPay; continue; } auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp - INIT_AUCTION_DURATION); auctionIdToAuction[auctionId] = Auction(0, uint72(amountToPay), msg.sender); totalPrice += amountToPay; _mint(msg.sender, auctionId); emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp, amountToPay ); uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } require(totalPrice == msg.value, 'Incorrect ETH amount sent.'); if (totalFailed > 0) { SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT); } } function settleAuction( uint256 auctionId ) external payable { Auction memory highestBid = auctionIdToAuction[auctionId]; AuctionConfig memory config = auctionConfig[auctionId]; require(isAuctionOver(auctionId), 'Auction is still active'); uint256 amountToPay = highestBid.amount; if (amountToPay > 0) { _mint(highestBid.bidder, auctionId); } else { require(msg.value == reservePrice(auctionId), 'Incorrect funds sent for unclaimed'); amountToPay = msg.value; _mint(owner(), auctionId); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp, amountToPay ); uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 tokensOwnedInContractAD = CONTRACT_AD.balanceOf(highestBid.bidder); uint256 tokensOwnedInContractFPP = CONTRACT_FPP.balanceOf(highestBid.bidder); uint256 potentialDiscount = tokensOwnedInContractAD + tokensOwnedInContractFPP; if ( highestBid.bidder != address(0) && potentialDiscount > 0 && potentialDiscount > discountsCount[highestBid.bidder] ) { uint256 rebate = amountToPay * 10 / 100; amountToPay = amountToPay - rebate; discountsCount[highestBid.bidder] += 1; SafeTransferLib.forceSafeTransferETH(highestBid.bidder, rebate, SAFE_GAS_LIMIT); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp, amountToPay ); uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } function settleMultipleAuctions( uint256[] calldata auctionIds ) external payable { uint256 unclaimedCost; uint256 amountForBene; for (uint256 i; i < auctionIds.length; ++i) { uint256 auctionId = auctionIds[i]; Auction memory highestBid = auctionIdToAuction[auctionId]; require(isAuctionOver(auctionId), 'Auction is still active'); uint256 amountToPay = highestBid.amount; if (amountToPay > 0) { _mint(highestBid.bidder, auctionId); } else { amountToPay = reservePrice(auctionId); unclaimedCost += amountToPay; _mint(owner(), auctionId); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp, amountToPay ); AuctionConfig memory config = auctionConfig[auctionId]; uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 tokensOwnedInContractAD = CONTRACT_AD.balanceOf(highestBid.bidder); uint256 tokensOwnedInContractFPP = CONTRACT_FPP.balanceOf(highestBid.bidder); uint256 potentialDiscount = tokensOwnedInContractAD + tokensOwnedInContractFPP; if ( highestBid.bidder != address(0) && potentialDiscount > 0 && potentialDiscount > discountsCount[highestBid.bidder] ) { uint256 rebate = amountToPay * 10 / 100; amountToPay = amountToPay - rebate; discountsCount[highestBid.bidder] += 1; SafeTransferLib.forceSafeTransferETH(highestBid.bidder, rebate, SAFE_GAS_LIMIT); } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); amountForBene += amountToPay - amountForArtist; } require(msg.value == unclaimedCost, 'Incorrect funds sent for unclaimed'); SafeTransferLib.forceSafeTransferETH(beneficiary, amountForBene, SAFE_GAS_LIMIT); } function _mint( address to, uint256 auctionId ) internal { address collection = getCollectionFromId(auctionId); uint256 tokenId = getArtTokenIdFromId(auctionId); try INFT(collection).ownerOf(tokenId) returns (address _owner) { if (_owner == address(0)) { INFT(collection).mint(to, tokenId); } else { INFT(collection).transferFrom(_owner, to, tokenId); } } catch { INFT(collection).mint(to, tokenId); } } // INTERNAL function _changePrices( address collectionAddress, uint256 tokenId, uint256 newBuyNowPrice, uint256 newReservePrice, uint256 newPreBidPrice ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].auctionStartTime > block.timestamp); auctionConfig[auctionId].buyNowPrice = uint88(newBuyNowPrice); auctionConfig[auctionId].reservePrice = uint88(newReservePrice); auctionConfig[auctionId].preBidPrice = newPreBidPrice; } function _changeSplit( address collectionAddress, uint256 tokenId, address artist, uint256 newSplit ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); if (artist != address(0)) { auctionConfig[auctionId].artist = artist; } auctionConfig[auctionId].split = uint16(newSplit); } function _resetAuction( address collectionAddress, uint256 tokenId ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); if (!isAuctionOver(auctionId)) { Auction memory auctionData = auctionIdToAuction[auctionId]; if (auctionData.amount > 0) { SafeTransferLib.forceSafeTransferETH(auctionData.bidder, auctionData.amount, SAFE_GAS_LIMIT); } } auctionConfig[auctionId] = AuctionConfig(address(0),0,0,0,0,0,0); auctionIdToAuction[auctionId] = Auction(0,0,address(0)); } function _reschedule( address collectionAddress, uint256 tokenId, uint256 newBuyNowStartTime, uint256 newAuctionStartTime ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].auctionStartTime > block.timestamp); require(newBuyNowStartTime <= newAuctionStartTime); auctionConfig[auctionId].buyNowStartTime = uint80(newBuyNowStartTime); auctionConfig[auctionId].auctionStartTime = uint80(newAuctionStartTime); } function _schedule( address collectionAddress, uint256 tokenId, uint256 buyNowStartTime, uint256 auctionStartTime, address artist, uint256 split, uint256 buyNowPrice, uint256 reserve, uint256 preBidPrice ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].auctionStartTime == 0); uint256 adjAucStartTime = auctionStartTime; if (adjAucStartTime == 0) { adjAucStartTime = type(uint80).max; } auctionConfig[auctionId] = AuctionConfig( artist, uint16(split), uint80(buyNowStartTime), uint80(adjAucStartTime), uint88(buyNowPrice), uint88(reserve), uint256(preBidPrice) ); } // ONLY OWNER function changePrices( address collectionAddress, uint256 tokenId, uint256 newBuyNowPrice, uint256 newReservePrice, uint256 newPreBidPrice ) external onlyOwner { _changePrices(collectionAddress, tokenId, newBuyNowPrice, newReservePrice, newPreBidPrice); } function changePricesMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata newBuyNowPrices, uint256[] calldata newReservePrices, uint256[] calldata newPreBidPrices ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == newBuyNowPrices.length && newBuyNowPrices.length == newReservePrices.length && newReservePrices.length == newPreBidPrices.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _changePrices(collections[i], tokenIds[i], newBuyNowPrices[i], newReservePrices[i], newPreBidPrices[i]); } } function changeSplit( address collectionAddress, uint256 tokenId, address artist, uint256 split ) external onlyOwner { _changeSplit(collectionAddress, tokenId, artist, split); } function changeSplitMultiple( address[] calldata collections, uint256[] calldata tokenIds, address[] calldata artists, uint256[] calldata splits ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == artists.length && artists.length == splits.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _changeSplit(collections[i], tokenIds[i], artists[i], splits[i]); } } function scheduleMultipleLight( address collections, uint256[] calldata tokenIds, uint256 buyNowStartTime, uint256 auctionStartTimes, address artists, uint256 splits, uint256 buyNowPrice, uint256 reservePrices, uint256 preBidPrices ) external onlyOwner { for(uint256 i; i < tokenIds.length; ++i) { _schedule( collections, tokenIds[i], buyNowStartTime, auctionStartTimes, artists, splits, buyNowPrice, reservePrices, preBidPrices ); } } function reschedule( address collectionAddress, uint256 tokenId, uint256 newBuyNowStartTime, uint256 newAuctionStartTime ) external onlyOwner { _reschedule(collectionAddress, tokenId, newBuyNowStartTime, newAuctionStartTime); } function resetAuction( address collectionAddress, uint256 tokenId ) external onlyOwner { _resetAuction(collectionAddress, tokenId); } function resetMultiple( address[] calldata collections, uint256[] calldata tokenIds ) external onlyOwner { require( collections.length == tokenIds.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _resetAuction(collections[i], tokenIds[i]); } } function rescheduleMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata newBuyNowStartTimes, uint256[] calldata newAuctionStartTimes ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == newBuyNowStartTimes.length && newBuyNowStartTimes.length == newAuctionStartTimes.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _reschedule(collections[i], tokenIds[i], newBuyNowStartTimes[i], newAuctionStartTimes[i]); } } function schedule( address collectionAddress, uint256 tokenId, uint256 buyNowStartTime, uint256 auctionStartTime, address artist, uint256 split, uint256 buyNowPrice, uint256 reserve, uint256 preBidPrice ) external onlyOwner { _schedule( collectionAddress, tokenId, buyNowStartTime, auctionStartTime, artist, split, buyNowPrice, reserve, preBidPrice ); } function scheduleMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata buyNowStartTimes, uint256[] calldata auctionStartTimes, address[] calldata artists, uint256[] calldata splits, uint256[] calldata buyNowPrices, uint256[] calldata reservePrices, uint256[] calldata preBidPrices ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == buyNowStartTimes.length && buyNowStartTimes.length == auctionStartTimes.length && auctionStartTimes.length == artists.length && artists.length == splits.length && splits.length == buyNowPrices.length && buyNowPrices.length == reservePrices.length && reservePrices.length == preBidPrices.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _schedule( collections[i], tokenIds[i], buyNowStartTimes[i], auctionStartTimes[i], artists[i], splits[i], buyNowPrices[i], reservePrices[i], preBidPrices[i] ); } } function setBeneficiary( address _beneficiary ) external onlyOwner { beneficiary = _beneficiary; } function setPaused( bool _paused ) external onlyOwner { paused = _paused; } // GETTERS function artTokentoAuctionId( address collection, uint256 tokenId ) public pure returns (uint256) { return (uint256(uint160(collection)) << 96) | uint96(tokenId); } function isAuctionActive( uint256 auctionId ) public view returns (bool) { uint256 startTime = auctionConfig[auctionId].auctionStartTime; uint256 endTime = getAuctionEndTime(auctionId); return (startTime > 0 && block.timestamp >= startTime && block.timestamp < endTime); } function isAuctionOver( uint256 auctionId ) public view returns (bool) { uint256 startTime = auctionConfig[auctionId].auctionStartTime; uint256 endTime = getAuctionEndTime(auctionId); return (startTime > 0 && block.timestamp >= endTime); } function getAuctionEndTime( uint256 auctionId ) public view returns (uint256) { return auctionConfig[auctionId].auctionStartTime + INIT_AUCTION_DURATION + auctionIdToAuction[auctionId].offsetFromEnd; } function getAuctionStartTime( uint256 auctionId ) external view returns (uint256) { return auctionConfig[auctionId].auctionStartTime; } function getCollectionFromId( uint256 id ) public pure returns (address) { return address(uint160(id >> 96)); } function getArtTokenIdFromId( uint256 id ) public pure returns (uint256) { return uint256(uint96(id)); } function reservePrice( uint256 auctionId ) public view returns (uint256) { uint256 reserve = auctionConfig[auctionId].reservePrice; return reserve != 0 ? reserve : MIN_BID; } } interface INFT { function mint(address to, uint256 tokenId) external; function ownerOf(uint256 tokenId) external view returns (address); function transferFrom(address from, address to, uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.4; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// /// @dev Note: /// - For ETH transfers, please use `forceSafeTransferETH` for gas griefing protection. /// - For ERC20s, this implementation won't check that a token has code, /// responsibility is delegated to the caller. library SafeTransferLib { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ETH transfer has failed. error ETHTransferFailed(); /// @dev The ERC20 `transferFrom` has failed. error TransferFromFailed(); /// @dev The ERC20 `transfer` has failed. error TransferFailed(); /// @dev The ERC20 `approve` has failed. error ApproveFailed(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Suggested gas stipend for contract receiving ETH /// that disallows any storage writes. uint256 internal constant _GAS_STIPEND_NO_STORAGE_WRITES = 2300; /// @dev Suggested gas stipend for contract receiving ETH to perform a few /// storage reads and writes, but low enough to prevent griefing. /// Multiply by a small constant (e.g. 2), if needed. uint256 internal constant _GAS_STIPEND_NO_GRIEF = 100000; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ETH OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` (in wei) ETH to `to`. /// Reverts upon failure. /// /// Note: This implementation does NOT protect against gas griefing. /// Please use `forceSafeTransferETH` for gas griefing protection. function safeTransferETH(address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal { /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(gasStipend, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // To coerce gas estimation to provide enough gas for the `create` above. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a gas stipend /// equal to `_GAS_STIPEND_NO_GRIEF`. This gas stipend is a reasonable default /// for 99% of cases and can be overridden with the three-argument version of this /// function if necessary. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount) internal { // Manually inlined because the compiler doesn't inline functions with branches. /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(_GAS_STIPEND_NO_GRIEF, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // To coerce gas estimation to provide enough gas for the `create` above. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// Simply use `gasleft()` for `gasStipend` if you don't need a gas stipend. /// /// Note: Does NOT revert upon failure. /// Returns whether the transfer of ETH is successful instead. function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal returns (bool success) { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. success := call(gasStipend, to, amount, 0, 0, 0, 0) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have at least `amount` approved for /// the current contract to manage. function safeTransferFrom(address token, address from, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x60, amount) // Store the `amount` argument. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x0c, 0x23b872dd000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends all of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have their entire balance approved for /// the current contract to manage. function safeTransferAllFrom(address token, address from, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `balanceOf(address)`. mstore(0x0c, 0x70a08231000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x00, 0x23b872dd) // The `amount` argument is already written to the memory word at 0x60. amount := mload(0x60) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransfer(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sends all of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransferAll(address token, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`. mstore(0x20, address()) // Store the address of the current contract. if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x14, to) // Store the `to` argument. // The `amount` argument is already written to the memory word at 0x34. amount := mload(0x34) // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract. /// Reverts upon failure. function safeApprove(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `approve(address,uint256)`. mstore(0x00, 0x095ea7b3000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `ApproveFailed()`. mstore(0x00, 0x3e3f8f73) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Returns the amount of ERC20 `token` owned by `account`. /// Returns zero if the `token` does not exist. function balanceOf(address token, address account) internal view returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x14, account) // Store the `account` argument. // Store the function selector of `balanceOf(address)`. mstore(0x00, 0x70a08231000000000000000000000000) amount := mul( mload(0x20), and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20) ) ) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "remappings": [] }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BidMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Settled","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"artTokentoAuctionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionConfig","outputs":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint16","name":"split","type":"uint16"},{"internalType":"uint80","name":"buyNowStartTime","type":"uint80"},{"internalType":"uint80","name":"auctionStartTime","type":"uint80"},{"internalType":"uint88","name":"buyNowPrice","type":"uint88"},{"internalType":"uint88","name":"reservePrice","type":"uint88"},{"internalType":"uint256","name":"preBidPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionIdToAuction","outputs":[{"internalType":"uint24","name":"offsetFromEnd","type":"uint24"},{"internalType":"uint72","name":"amount","type":"uint72"},{"internalType":"address","name":"bidder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"favorites","type":"uint256[]"},{"internalType":"uint256[]","name":"expectedPrices","type":"uint256[]"}],"name":"bidOnFavs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"buyNow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"buyNowMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newBuyNowPrice","type":"uint256"},{"internalType":"uint256","name":"newReservePrice","type":"uint256"},{"internalType":"uint256","name":"newPreBidPrice","type":"uint256"}],"name":"changePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newBuyNowPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"newReservePrices","type":"uint256[]"},{"internalType":"uint256[]","name":"newPreBidPrices","type":"uint256[]"}],"name":"changePricesMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"}],"name":"changeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"}],"name":"changeSplitMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"discountsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getArtTokenIdFromId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCollectionFromId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newBuyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"newAuctionStartTime","type":"uint256"}],"name":"reschedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newBuyNowStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"newAuctionStartTimes","type":"uint256[]"}],"name":"rescheduleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"reservePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"resetMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"buyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"auctionStartTime","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"},{"internalType":"uint256","name":"buyNowPrice","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"preBidPrice","type":"uint256"}],"name":"schedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"buyNowStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"auctionStartTimes","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"},{"internalType":"uint256[]","name":"buyNowPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"reservePrices","type":"uint256[]"},{"internalType":"uint256[]","name":"preBidPrices","type":"uint256[]"}],"name":"scheduleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collections","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"buyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"auctionStartTimes","type":"uint256"},{"internalType":"address","name":"artists","type":"address"},{"internalType":"uint256","name":"splits","type":"uint256"},{"internalType":"uint256","name":"buyNowPrice","type":"uint256"},{"internalType":"uint256","name":"reservePrices","type":"uint256"},{"internalType":"uint256","name":"preBidPrices","type":"uint256"}],"name":"scheduleMultipleLight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"settleAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"settleMultipleAuctions","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080806040523461005a575f8054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3612c15908161005f8239f35b5f80fdfe6102e0806040526004361015610013575f80fd5b5f3560e01c90816302548376146120725750806302ffbaba14611cce57806308a0f32f14611a535780630b2a16f114611a1a5780631033a663146116515780631107a8fc146115ce57806316c38b3c146115895780631ae03271146114ec5780631c31f710146114a957806327327ba01461144d5780632c104a921461142f5780632e993611146110e357806337fee6251461104a57806338af3eed14611022578063454a2ab314610d1c578063469847fd14610a0a57806355808c741461074457806359aab2421461070f5780635c975abb146106ea5780637100dd87146106a6578063715018a61461064f5780638624e7df146106095780638c77cc09146105e35780638da5cb5b146105bc578063919e84f514610586578063930e79f11461056857806395657db014610548578063ba6646be146103ff578063c621820414610368578063cc14394c14610318578063e361c5a8146102f2578063e71f7b15146102ca578063ecee4c9d1461029b578063f2fde38b146101da5763f5d8d7ba1461019e575f80fd5b346101d65760203660031901126101d6576001600160a01b036101bf6120e9565b165f526001602052602060405f2054604051908152f35b5f80fd5b346101d65760203660031901126101d6576101f36120e9565b6101fb6126d5565b6001600160a01b03908116908115610247575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101d65760403660031901126101d6576102c86102b76120e9565b6102bf6126d5565b60243590612853565b005b346101d65760203660031901126101d65760206102e86004356124cf565b6040519015158152f35b346101d65760203660031901126101d65760206103106004356124a5565b604051908152f35b346101d6576101203660031901126101d6576102c86103356120e9565b61033d6120ff565b906103466126d5565b610104359160e4359160c4359160a43591606435906044359060243590612a5f565b346101d6576101203660031901126101d6576103826120e9565b60243567ffffffffffffffff81116101d6576103a29036906004016120b8565b91906044356064356103b26120ff565b60a43560c4359160e4359361010435956103ca6126d5565b5f5b8a81106103d557005b806103f98989898f8f8f898c926103f28f959b60019c8f956121dd565b3590612a5f565b016103cc565b346101d65760a03660031901126101d65767ffffffffffffffff6004358181116101d6576104319036906004016120b8565b6024929192358281116101d65761044c9036906004016120b8565b6044358481116101d6576104649036906004016120b8565b94906064358281116101d65761047e9036906004016120b8565b9590926084359081116101d6576104999036906004016120b8565b6104a49591956126d5565b8183148061053f575b80610536575b8061052d575b6104c2906123d2565b5f5b8381106104cd57005b806105278989898f8f8f9789610519828f959b8f8f6105209760019f858093610505610500836105129861050b966121dd565b612416565b9f6121dd565b35996121dd565b35976121dd565b35956121dd565b359361272c565b016104c4565b508781146104b9565b508789146104b3565b508882146104ad565b346101d65760203660031901126101d657602060405160043560601c8152f35b346101d65760203660031901126101d6576020610310600435612461565b346101d65760203660031901126101d6576004355f52600360205260206001600160501b03600160405f20015416604051908152f35b346101d6575f3660031901126101d6575f546040516001600160a01b039091168152602090f35b346101d65760203660031901126101d65760206040516001600160601b03600435168152f35b346101d65760803660031901126101d6576106226120e9565b604435906001600160a01b03821682036101d6576102c8916106426126d5565b60643591602435906127cf565b346101d6575f3660031901126101d6576106676126d5565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101d65760403660031901126101d65760206106c16120e9565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101d6575f3660031901126101d657602060ff60025460a01c166040519015158152f35b346101d65760803660031901126101d6576102c861072b6120e9565b6107336126d5565b6064359060443590602435906129e2565b346101d6576101203660031901126101d65767ffffffffffffffff6004358181116101d6576107779036906004016120b8565b60c052610140526024358181116101d6576107969036906004016120b8565b61020052610180526044358181116101d6576107b69036906004016120b8565b6101e052610100526064358181116101d6576107d69036906004016120b8565b610240526101a0526084358181116101d6576107f69036906004016120b8565b6102c05260a05260a4358181116101d6576108159036906004016120b8565b6102605260e05260c4358181116101d6576108349036906004016120b8565b610280526101205260e4358181116101d6576108549036906004016120b8565b6102a05261016052610104359081116101d6576108759036906004016120b8565b610220526101c0526108856126d5565b6102005160c05114806109fb575b806109ec575b806109dd575b806109ce575b806109bf575b806109b0575b806109a1575b6108c0906123d2565b5f6080525b60c051608051106108d257005b6109936108ea61050060805160c051610140516121dd565b6108fd60805161020051610180516121dd565b356109116080516101e051610100516121dd565b35610925608051610240516101a0516121dd565b3561093b6105006080516102c05160a0516121dd565b61094d6080516102605160e0516121dd565b359161096260805161028051610120516121dd565b35936109776080516102a051610160516121dd565b359561098c608051610220516101c0516121dd565b3597612a5f565b6001608051016080526108c5565b50610220516102a051146108b7565b506102a05161028051146108b1565b506102805161026051146108ab565b50610260516102c051146108a5565b506102c051610240511461089f565b50610240516101e05114610899565b506101e0516102005114610893565b60203660031901126101d65760043567ffffffffffffffff81116101d657610a369036906004016120b8565b90610a4960ff60025460a01c1615612353565b5f9182918291426201517f1901905b808410610abd5785853403610a785780610a6e57005b6102c89033612687565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610acc8583866121dd565b3594855f52600360205260405f2060405190610ae782612231565b805460018060a01b038116835261ffff8160a01c16602084015260b01c9081604084015260018101549160026001600160501b038416928360608701526001600160581b038560501c1660808701528460a81c60a0870152015460c08501524210908115610d11575b508015610cfd575b610cd857428611610cc457610cac610cb292610c0f6001968b5f5260036020528760405f20016001600160501b038b166001600160501b0319825416179055604051610ba381612201565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c16906122cf565b99610c1a8133612517565b6040514281526001600160581b038560501c1660208201526001600160601b038216915f80516020612bc083398151915260408260601c93a461ffff6020820151168015610cbb575b612710610c7f610c90926001600160581b038760501c166122dc565b048092888060a01b03905116612687565b6001600160581b03868060a01b03600254169360501c166122ef565b90612687565b01929190610a58565b50611d4c610c63565b634e487b7160e01b5f52601160045260245ffd5b6001939750610cf7929891506001600160581b039060501c16906122cf565b95610cb2565b506001600160581b038160501c1615610b58565b90504210158a610b50565b6020806003193601126101d65760043590610d3f60ff60025460a01c1615612392565b815f5260038152600260405f206001810180546001600160501b03808083161461100a575b5050500154610d72836124cf565b908115610fed575b5080610fd5575b15610f9e57815f526004815260405f209160405192610d9f84612201565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610f95576103e8905b612710918201808311610cc457610df7916122dc565b0434101580610f83575b15610f48575f95815f9851169483610e1888612461565b92511680610f32575b505061025880610e3142846122ef565b10610efd575b5050806bffffffffffffffffff0000009160405195610e5587612201565b168552838501923416835260046040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610eea42343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610ef457005b6102c891612687565b949194420191824211610cc457610f24610f2a926bffffffffffffffffff000000946122ef565b906122cf565b939088610e37565b90516001600160a01b0316985096508880610e21565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610f8d856124a5565b341015610e01565b6107d090610de1565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526003815260405f205460b01c421015610d81565b801515915081610fff575b5083610d7a565b905034101583610ff8565b4216906001600160501b031916179055848080610d64565b346101d6575f3660031901126101d6576002546040516001600160a01b039091168152602090f35b346101d65761105836612160565b9596611069959495939291936126d5565b858814806110da575b806110d1575b611081906123d2565b5f5b88811061108c57005b806110cb6110a06105006001948d876121dd565b8a6110ac848c8c6121dd565b356110c4856110bc818b8d6121dd565b35938c6121dd565b35926129e2565b01611083565b50818714611078565b50818614611072565b6020806003193601126101d65760043590815f526004815260405f20916040519261110d84612201565b5462ffffff811684526001600160481b03604084860195828460181c168752019160601c8252825f526003845260405f206040519361114b85612231565b81549260018060a01b03978885168752600261ffff9489890196868160a01c16885260b01c60408a015260018101546001600160501b03811660608b01526001600160581b038160501c1660808b015260a81c60a08a0152015460c08801526111bb6111b68461242a565b612283565b5116958615611404576040906111d4838a885116612517565b8260601c936001600160601b0384169586868686514281528d878201525f80516020612bc0833981519152978891a451169586156113fa575b80516040516370a0823160e01b808252918c1660048201528381602481739cf0ab1cc434db83097b7e9c831a764481dec7475afa9081156113c2575f916113cd575b508b8351166040519283526004830152838260248173a8a425864db32fcbb459bf527bdbb8128e6abf215afa9081156113c2575f91611391575b61129392506122cf565b8a825116908115159182611387575b82611371575b50506112f0575b5088956102c899956112e695610cac99956127109560406112db968e825191428352820152a4886122dc565b049384915116612687565b60025416926122ef565b969290949793919895600a8502858104600a1486151715610cc4576064611319910480966122ef565b98878951165f526001875260405f209384549360018501809511610cc4576102c89c60408b9a8e61135d610cac9f9c8e6112e69e6112db9c6127109e555116612687565b5096505095509599509550955095986112af565b9091505f526001835260405f2054108b806112a8565b81151592506112a2565b90508382813d83116113bb575b6113a88183612261565b810103126101d657611293915190611289565b503d61139e565b6040513d5f823e3d90fd5b90508381813d83116113f3575b6113e48183612261565b810103126101d657518c61124f565b503d6113da565b611d4c965061120d565b9550611419611412826124a5565b34146122fc565b6040349661142a838a5f5416612517565b6111d4565b346101d65760203660031901126101d65760206102e860043561242a565b346101d65761145b36612115565b906114679392936126d5565b6114728285146123d2565b5f5b84811061147d57005b806114a361149161050060019489896121dd565b61149c8387876121dd565b3590612853565b01611474565b346101d65760203660031901126101d6576114c26120e9565b6114ca6126d5565b600280546001600160a01b0319166001600160a01b0392909216919091179055005b346101d6576114fa36612160565b9594939092916115086126d5565b81861480611580575b80611577575b611520906123d2565b5f5b86811061152b57005b80611571878a8761156a858f6105008f998b61155c828f61155660019f83610500916115639a6121dd565b9b6121dd565b35966121dd565b938c6121dd565b35926127cf565b01611522565b50808714611517565b50808214611511565b346101d65760203660031901126101d6576004358015158091036101d6576115af6126d5565b6002805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101d65760203660031901126101d6576004355f52600360205260e060405f2080549060026001820154910154906040519260018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b03811660608401526001600160581b038160501c16608084015260a81c60a083015260c0820152f35b61165a36612115565b92919061166f60ff60025460a01c1615612392565b8382036101d6575f935f925f5b8181106116d757868534036116925780610a6e57005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6116e28183886121dd565b35906116fa6116f28286886121dd565b3580976122cf565b95825f5260038060205260405f206040519161171583612231565b815460018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b0360019260028482015491838316928360608901526001600160581b038160501c16608089015260a81c60a0880152015460c0860152146119ef575b5050611785846124cf565b80156119ce575b159081156119b7575b506119a957825f52600460205260405f2092604051936117b485612201565b5462ffffff811685526001600160481b038160181c169081602087015260601c60408601526702c68af0bb1400008110155f146119a0576103e8905b612710918201808311610cc457611806916122dc565b048210158061198e575b15611979575f905f9262ffffff86511661182983612461565b966001600160481b036020820151168061195f575b5050610258968761184f42836122ef565b1061193e575b506001965062ffffff6040519161186b83612201565b168152602081016001600160481b03831681526040820190338252845f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b038216938061191c8460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a48061192e575b50505b0161167c565b61193791612687565b8880611925565b908742014211610cc457610f246119599260019942016122ef565b8d611855565b6040909101516001600160a01b0316955093508d8061183e565b506001925061198891986122cf565b96611928565b50611998816124a5565b821015611810565b6107d0906117f0565b6001925061198891986122cf565b6001600160501b039150604001511642108a611795565b5060c081015180151590816119e4575b5061178c565b90508210158b6119de565b855f5260205260405f20016001600160501b0342166001600160501b03198254161790558a8061177a565b346101d65760a03660031901126101d6576102c8611a366120e9565b611a3e6126d5565b6084359060643590604435906024359061272c565b6020806003193601126101d65760043590815f526003815260405f2090604051611a7c81612231565b82549060018060a01b0391828116825261ffff9184810192808360a01c168452604082019260b01c83526001870154966001600160501b03809460026060860193838c1685526001600160581b038c60501c169b8c608089015260a81c60a0880152015460c0860152611af760ff60025460a01c1615612353565b51164210611c925783429151161115611c4d5786151580611c44575b15611c09576201517f19420193428511610cc45788610cac9787966112e6966102c89c5f5260038352600160405f200191166001600160501b0319825416179055604051611b6081612201565b5f81528181016001600160481b03341681526040820190338252845f52600484526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055611bbe8233612517565b89604051914283528201526001600160601b038216915f80516020612bc083398151915260408260601c93a451168015611c00575b6112db61271091886122dc565b50611d4c611bf3565b60405162461bcd60e51b815260048101879052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b50863414611b13565b60405162461bcd60e51b815260048101879052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b815260048101889052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b6020806003193601126101d65760043567ffffffffffffffff81116101d657611cfb9036906004016120b8565b5f915f935f925b808410611d29576102c886611d188734146122fc565b6002546001600160a01b0316612687565b90919294611d388683866121dd565b35805f526004845260405f209060405191611d5283612201565b549162ffffff831681526001600160481b03868201818560181c16815260406060930194831c8552611d866111b68561242a565b5116918215612043578351611da59082906001600160a01b0316612517565b60405142815283888201526001600160601b03821690825f80516020612bc0833981519152604082871c93a45f526003865260405f209260405191611de983612231565b845491600260018060a01b0396878516865260a061ffff86821c1695868d89015260b01c604088015260019485830154906001600160501b038216908901526001600160581b038160501c16608089015260a81c90870152015460c08501528215612039575b80516040516370a0823160e01b808252918816600482015260249391908b818681739cf0ab1cc434db83097b7e9c831a764481dec7475afa9081156113c2575f9161200c575b508884511660405192835260048301528b82868173a8a425864db32fcbb459bf527bdbb8128e6abf215afa9081156113c2575f91611fdb575b611ed892506122cf565b87835116908115159182611fd1575b82611fbc575b5050611f22575b5050509282611f13610f24936127106112db611f189860019a986122dc565b6122ef565b9501929190611d02565b600a959295808402908482041484151715611fa9576064611f45910480946122ef565b95878351165f52818b5260405f20908154928301809311611f9657506112db8895611f8760019b9996611f189b611f1397610f249b9761271097555116612687565b95985050509382959750611ef4565b634e487b7160e01b5f9081526011600452fd5b86634e487b7160e01b5f5260116004525ffd5b9091505f52818b5260405f2054108e80611eed565b8115159250611ee7565b90508b82813d8311612005575b611ff28183612261565b810103126101d657611ed8915190611ece565b503d611fe8565b90508b81813d8311612032575b6120238183612261565b810103126101d657518f611e95565b503d612019565b611d4c9250611e4f565b979150612059612052896124a5565b80936122cf565b9761206d8160018060a01b035f5416612517565b611da5565b346101d65760203660031901126101d6576060906004355f52600460205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101d65782359167ffffffffffffffff83116101d6576020808501948460051b0101116101d657565b600435906001600160a01b03821682036101d657565b608435906001600160a01b03821682036101d657565b60406003198201126101d65767ffffffffffffffff916004358381116101d65782612142916004016120b8565b939093926024359182116101d65761215c916004016120b8565b9091565b60806003198201126101d65767ffffffffffffffff906004358281116101d6578161218d916004016120b8565b939093926024358181116101d657836121a8916004016120b8565b939093926044358381116101d657826121c3916004016120b8565b939093926064359182116101d65761215c916004016120b8565b91908110156121ed5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b6060810190811067ffffffffffffffff82111761221d57604052565b634e487b7160e01b5f52604160045260245ffd5b60e0810190811067ffffffffffffffff82111761221d57604052565b67ffffffffffffffff811161221d57604052565b90601f8019910116810190811067ffffffffffffffff82111761221d57604052565b1561228a57565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b91908201809211610cc457565b81810292918115918404141715610cc457565b91908203918211610cc457565b1561230357565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b1561235a57565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b1561239957565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b156123d957565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101d65790565b805f52600360205261244c6001600160501b03600160405f2001541691612461565b9015159081612459575090565b905042101590565b805f5260036020526001600160501b03600160405f20015416620151808101809111610cc4576124a2915f52600460205262ffffff60405f205416906122cf565b90565b5f9081526003602052604090206001015460a81c80156124c25790565b5067016345785d8a000090565b805f5260036020526124f16001600160501b03600160405f2001541691612461565b811515918261250c575b5081612505575090565b9050421090565b42101591505f6124fb565b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa5f9181612643575b506125b45750833b156101d65782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af19081156125ab575061259c575b505b565b6125a59061224d565b5f612598565b513d5f823e3d90fd5b6001600160a01b03908116806125ff575050833b156101d65782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f90839081838160448101612587565b8591959392933b156101d6575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af19081156125ab575061259c5750565b9091506020813d60201161267f575b8161265f60209383612261565b810103126101d657516001600160a01b03811681036101d657905f61254c565b3d9150612652565b8147106126c8575f8080808585617530f1156126a1575050565b601691600b915f526073825360ff602053f0156126ba57565b620f42405a1161259a575f80fd5b63b12d13eb5f526004601cfd5b5f546001600160a01b031633036126e857565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f908152600360205260409020600181018054929391926001600160501b03164210156101d65780546affffffffffffffffffffff60501b191660509490941b600160501b600160a81b03169390931783556002926127cb916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b0155565b9161ffff926001600160601b0361259a959316906001600160601b03199060601b16179060018060a01b03168061282f575b505f908152600360205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600360205260405f20906001600160601b0360a01b8254161790555f612801565b6001600160601b03918219928391169160601b16176128718161242a565b15612986575b6040805161288481612231565b5f8082526020808301828152848401838152606085018481526080860185815260a080880187815260c089018881528b895260039097529689902097519451935160b01b6001600160b01b03191661ffff60a01b9490911b939093166001600160a01b0390941693909317919091178555519051925160a81b6001600160a81b0319166001600160501b0390911660509390931b600160501b600160a81b0316929092179190911760018301556002905191015580519261294484612201565b5f84526bffffffffffffffffff00000062ffffff60208601935f8552808701955f87525f5260046020525f20955116925160181b16925160601b169117179055565b805f5260046020526040805f2081519061299f82612201565b549062ffffff821681526001600160481b038260181c169182602083015260601c9283910152806129d2575b5050612877565b6129db91612687565b5f806129cb565b906001600160601b039093929316906001600160601b03199060601b16175f52600360205260405f209060018201926001600160501b0392838554164210156101d6578282116101d65780546001600160b01b031691841660b01b6001600160b01b031916919091179055166001600160501b0319825416179055565b906001600160601b0390989794959692939816906001600160601b03199060601b161791825f5260036020526001600160501b039586600160405f200154166101d6578815612bb5575b8691829161ffff906001600160581b03988997886040519e8f90612acc82612231565b600160a01b600190038095168252866020830196168652886040830198168852606082019e8f91169052608001981688528d8960a082019b168b5260c0019c8d525f52600360205260405f209c51166001600160601b0360a01b8d5416178c555116612b50908b9081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5189546001600160b01b0316911660b01b6001600160b01b0319161788559451905192519190921660501b600160501b600160a81b0316919093166001600160501b0316176001600160a81b03199190921660a81b1617600183015551600290910155565b9597508795612aa956feb2790cfbb501cb5d139a6d2e6b8157f1e9fc7043f1354b6645d9accfa9d95582a2646970667358221220c5260d13e9ea62b2fa727de223ec22263c52626459d96e2cfb51097a16f5875e64736f6c63430008160033
Deployed Bytecode
0x6102e0806040526004361015610013575f80fd5b5f3560e01c90816302548376146120725750806302ffbaba14611cce57806308a0f32f14611a535780630b2a16f114611a1a5780631033a663146116515780631107a8fc146115ce57806316c38b3c146115895780631ae03271146114ec5780631c31f710146114a957806327327ba01461144d5780632c104a921461142f5780632e993611146110e357806337fee6251461104a57806338af3eed14611022578063454a2ab314610d1c578063469847fd14610a0a57806355808c741461074457806359aab2421461070f5780635c975abb146106ea5780637100dd87146106a6578063715018a61461064f5780638624e7df146106095780638c77cc09146105e35780638da5cb5b146105bc578063919e84f514610586578063930e79f11461056857806395657db014610548578063ba6646be146103ff578063c621820414610368578063cc14394c14610318578063e361c5a8146102f2578063e71f7b15146102ca578063ecee4c9d1461029b578063f2fde38b146101da5763f5d8d7ba1461019e575f80fd5b346101d65760203660031901126101d6576001600160a01b036101bf6120e9565b165f526001602052602060405f2054604051908152f35b5f80fd5b346101d65760203660031901126101d6576101f36120e9565b6101fb6126d5565b6001600160a01b03908116908115610247575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101d65760403660031901126101d6576102c86102b76120e9565b6102bf6126d5565b60243590612853565b005b346101d65760203660031901126101d65760206102e86004356124cf565b6040519015158152f35b346101d65760203660031901126101d65760206103106004356124a5565b604051908152f35b346101d6576101203660031901126101d6576102c86103356120e9565b61033d6120ff565b906103466126d5565b610104359160e4359160c4359160a43591606435906044359060243590612a5f565b346101d6576101203660031901126101d6576103826120e9565b60243567ffffffffffffffff81116101d6576103a29036906004016120b8565b91906044356064356103b26120ff565b60a43560c4359160e4359361010435956103ca6126d5565b5f5b8a81106103d557005b806103f98989898f8f8f898c926103f28f959b60019c8f956121dd565b3590612a5f565b016103cc565b346101d65760a03660031901126101d65767ffffffffffffffff6004358181116101d6576104319036906004016120b8565b6024929192358281116101d65761044c9036906004016120b8565b6044358481116101d6576104649036906004016120b8565b94906064358281116101d65761047e9036906004016120b8565b9590926084359081116101d6576104999036906004016120b8565b6104a49591956126d5565b8183148061053f575b80610536575b8061052d575b6104c2906123d2565b5f5b8381106104cd57005b806105278989898f8f8f9789610519828f959b8f8f6105209760019f858093610505610500836105129861050b966121dd565b612416565b9f6121dd565b35996121dd565b35976121dd565b35956121dd565b359361272c565b016104c4565b508781146104b9565b508789146104b3565b508882146104ad565b346101d65760203660031901126101d657602060405160043560601c8152f35b346101d65760203660031901126101d6576020610310600435612461565b346101d65760203660031901126101d6576004355f52600360205260206001600160501b03600160405f20015416604051908152f35b346101d6575f3660031901126101d6575f546040516001600160a01b039091168152602090f35b346101d65760203660031901126101d65760206040516001600160601b03600435168152f35b346101d65760803660031901126101d6576106226120e9565b604435906001600160a01b03821682036101d6576102c8916106426126d5565b60643591602435906127cf565b346101d6575f3660031901126101d6576106676126d5565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101d65760403660031901126101d65760206106c16120e9565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101d6575f3660031901126101d657602060ff60025460a01c166040519015158152f35b346101d65760803660031901126101d6576102c861072b6120e9565b6107336126d5565b6064359060443590602435906129e2565b346101d6576101203660031901126101d65767ffffffffffffffff6004358181116101d6576107779036906004016120b8565b60c052610140526024358181116101d6576107969036906004016120b8565b61020052610180526044358181116101d6576107b69036906004016120b8565b6101e052610100526064358181116101d6576107d69036906004016120b8565b610240526101a0526084358181116101d6576107f69036906004016120b8565b6102c05260a05260a4358181116101d6576108159036906004016120b8565b6102605260e05260c4358181116101d6576108349036906004016120b8565b610280526101205260e4358181116101d6576108549036906004016120b8565b6102a05261016052610104359081116101d6576108759036906004016120b8565b610220526101c0526108856126d5565b6102005160c05114806109fb575b806109ec575b806109dd575b806109ce575b806109bf575b806109b0575b806109a1575b6108c0906123d2565b5f6080525b60c051608051106108d257005b6109936108ea61050060805160c051610140516121dd565b6108fd60805161020051610180516121dd565b356109116080516101e051610100516121dd565b35610925608051610240516101a0516121dd565b3561093b6105006080516102c05160a0516121dd565b61094d6080516102605160e0516121dd565b359161096260805161028051610120516121dd565b35936109776080516102a051610160516121dd565b359561098c608051610220516101c0516121dd565b3597612a5f565b6001608051016080526108c5565b50610220516102a051146108b7565b506102a05161028051146108b1565b506102805161026051146108ab565b50610260516102c051146108a5565b506102c051610240511461089f565b50610240516101e05114610899565b506101e0516102005114610893565b60203660031901126101d65760043567ffffffffffffffff81116101d657610a369036906004016120b8565b90610a4960ff60025460a01c1615612353565b5f9182918291426201517f1901905b808410610abd5785853403610a785780610a6e57005b6102c89033612687565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610acc8583866121dd565b3594855f52600360205260405f2060405190610ae782612231565b805460018060a01b038116835261ffff8160a01c16602084015260b01c9081604084015260018101549160026001600160501b038416928360608701526001600160581b038560501c1660808701528460a81c60a0870152015460c08501524210908115610d11575b508015610cfd575b610cd857428611610cc457610cac610cb292610c0f6001968b5f5260036020528760405f20016001600160501b038b166001600160501b0319825416179055604051610ba381612201565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c16906122cf565b99610c1a8133612517565b6040514281526001600160581b038560501c1660208201526001600160601b038216915f80516020612bc083398151915260408260601c93a461ffff6020820151168015610cbb575b612710610c7f610c90926001600160581b038760501c166122dc565b048092888060a01b03905116612687565b6001600160581b03868060a01b03600254169360501c166122ef565b90612687565b01929190610a58565b50611d4c610c63565b634e487b7160e01b5f52601160045260245ffd5b6001939750610cf7929891506001600160581b039060501c16906122cf565b95610cb2565b506001600160581b038160501c1615610b58565b90504210158a610b50565b6020806003193601126101d65760043590610d3f60ff60025460a01c1615612392565b815f5260038152600260405f206001810180546001600160501b03808083161461100a575b5050500154610d72836124cf565b908115610fed575b5080610fd5575b15610f9e57815f526004815260405f209160405192610d9f84612201565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610f95576103e8905b612710918201808311610cc457610df7916122dc565b0434101580610f83575b15610f48575f95815f9851169483610e1888612461565b92511680610f32575b505061025880610e3142846122ef565b10610efd575b5050806bffffffffffffffffff0000009160405195610e5587612201565b168552838501923416835260046040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610eea42343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610ef457005b6102c891612687565b949194420191824211610cc457610f24610f2a926bffffffffffffffffff000000946122ef565b906122cf565b939088610e37565b90516001600160a01b0316985096508880610e21565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610f8d856124a5565b341015610e01565b6107d090610de1565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526003815260405f205460b01c421015610d81565b801515915081610fff575b5083610d7a565b905034101583610ff8565b4216906001600160501b031916179055848080610d64565b346101d6575f3660031901126101d6576002546040516001600160a01b039091168152602090f35b346101d65761105836612160565b9596611069959495939291936126d5565b858814806110da575b806110d1575b611081906123d2565b5f5b88811061108c57005b806110cb6110a06105006001948d876121dd565b8a6110ac848c8c6121dd565b356110c4856110bc818b8d6121dd565b35938c6121dd565b35926129e2565b01611083565b50818714611078565b50818614611072565b6020806003193601126101d65760043590815f526004815260405f20916040519261110d84612201565b5462ffffff811684526001600160481b03604084860195828460181c168752019160601c8252825f526003845260405f206040519361114b85612231565b81549260018060a01b03978885168752600261ffff9489890196868160a01c16885260b01c60408a015260018101546001600160501b03811660608b01526001600160581b038160501c1660808b015260a81c60a08a0152015460c08801526111bb6111b68461242a565b612283565b5116958615611404576040906111d4838a885116612517565b8260601c936001600160601b0384169586868686514281528d878201525f80516020612bc0833981519152978891a451169586156113fa575b80516040516370a0823160e01b808252918c1660048201528381602481739cf0ab1cc434db83097b7e9c831a764481dec7475afa9081156113c2575f916113cd575b508b8351166040519283526004830152838260248173a8a425864db32fcbb459bf527bdbb8128e6abf215afa9081156113c2575f91611391575b61129392506122cf565b8a825116908115159182611387575b82611371575b50506112f0575b5088956102c899956112e695610cac99956127109560406112db968e825191428352820152a4886122dc565b049384915116612687565b60025416926122ef565b969290949793919895600a8502858104600a1486151715610cc4576064611319910480966122ef565b98878951165f526001875260405f209384549360018501809511610cc4576102c89c60408b9a8e61135d610cac9f9c8e6112e69e6112db9c6127109e555116612687565b5096505095509599509550955095986112af565b9091505f526001835260405f2054108b806112a8565b81151592506112a2565b90508382813d83116113bb575b6113a88183612261565b810103126101d657611293915190611289565b503d61139e565b6040513d5f823e3d90fd5b90508381813d83116113f3575b6113e48183612261565b810103126101d657518c61124f565b503d6113da565b611d4c965061120d565b9550611419611412826124a5565b34146122fc565b6040349661142a838a5f5416612517565b6111d4565b346101d65760203660031901126101d65760206102e860043561242a565b346101d65761145b36612115565b906114679392936126d5565b6114728285146123d2565b5f5b84811061147d57005b806114a361149161050060019489896121dd565b61149c8387876121dd565b3590612853565b01611474565b346101d65760203660031901126101d6576114c26120e9565b6114ca6126d5565b600280546001600160a01b0319166001600160a01b0392909216919091179055005b346101d6576114fa36612160565b9594939092916115086126d5565b81861480611580575b80611577575b611520906123d2565b5f5b86811061152b57005b80611571878a8761156a858f6105008f998b61155c828f61155660019f83610500916115639a6121dd565b9b6121dd565b35966121dd565b938c6121dd565b35926127cf565b01611522565b50808714611517565b50808214611511565b346101d65760203660031901126101d6576004358015158091036101d6576115af6126d5565b6002805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101d65760203660031901126101d6576004355f52600360205260e060405f2080549060026001820154910154906040519260018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b03811660608401526001600160581b038160501c16608084015260a81c60a083015260c0820152f35b61165a36612115565b92919061166f60ff60025460a01c1615612392565b8382036101d6575f935f925f5b8181106116d757868534036116925780610a6e57005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6116e28183886121dd565b35906116fa6116f28286886121dd565b3580976122cf565b95825f5260038060205260405f206040519161171583612231565b815460018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b0360019260028482015491838316928360608901526001600160581b038160501c16608089015260a81c60a0880152015460c0860152146119ef575b5050611785846124cf565b80156119ce575b159081156119b7575b506119a957825f52600460205260405f2092604051936117b485612201565b5462ffffff811685526001600160481b038160181c169081602087015260601c60408601526702c68af0bb1400008110155f146119a0576103e8905b612710918201808311610cc457611806916122dc565b048210158061198e575b15611979575f905f9262ffffff86511661182983612461565b966001600160481b036020820151168061195f575b5050610258968761184f42836122ef565b1061193e575b506001965062ffffff6040519161186b83612201565b168152602081016001600160481b03831681526040820190338252845f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b038216938061191c8460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a48061192e575b50505b0161167c565b61193791612687565b8880611925565b908742014211610cc457610f246119599260019942016122ef565b8d611855565b6040909101516001600160a01b0316955093508d8061183e565b506001925061198891986122cf565b96611928565b50611998816124a5565b821015611810565b6107d0906117f0565b6001925061198891986122cf565b6001600160501b039150604001511642108a611795565b5060c081015180151590816119e4575b5061178c565b90508210158b6119de565b855f5260205260405f20016001600160501b0342166001600160501b03198254161790558a8061177a565b346101d65760a03660031901126101d6576102c8611a366120e9565b611a3e6126d5565b6084359060643590604435906024359061272c565b6020806003193601126101d65760043590815f526003815260405f2090604051611a7c81612231565b82549060018060a01b0391828116825261ffff9184810192808360a01c168452604082019260b01c83526001870154966001600160501b03809460026060860193838c1685526001600160581b038c60501c169b8c608089015260a81c60a0880152015460c0860152611af760ff60025460a01c1615612353565b51164210611c925783429151161115611c4d5786151580611c44575b15611c09576201517f19420193428511610cc45788610cac9787966112e6966102c89c5f5260038352600160405f200191166001600160501b0319825416179055604051611b6081612201565b5f81528181016001600160481b03341681526040820190338252845f52600484526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055611bbe8233612517565b89604051914283528201526001600160601b038216915f80516020612bc083398151915260408260601c93a451168015611c00575b6112db61271091886122dc565b50611d4c611bf3565b60405162461bcd60e51b815260048101879052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b50863414611b13565b60405162461bcd60e51b815260048101879052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b815260048101889052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b6020806003193601126101d65760043567ffffffffffffffff81116101d657611cfb9036906004016120b8565b5f915f935f925b808410611d29576102c886611d188734146122fc565b6002546001600160a01b0316612687565b90919294611d388683866121dd565b35805f526004845260405f209060405191611d5283612201565b549162ffffff831681526001600160481b03868201818560181c16815260406060930194831c8552611d866111b68561242a565b5116918215612043578351611da59082906001600160a01b0316612517565b60405142815283888201526001600160601b03821690825f80516020612bc0833981519152604082871c93a45f526003865260405f209260405191611de983612231565b845491600260018060a01b0396878516865260a061ffff86821c1695868d89015260b01c604088015260019485830154906001600160501b038216908901526001600160581b038160501c16608089015260a81c90870152015460c08501528215612039575b80516040516370a0823160e01b808252918816600482015260249391908b818681739cf0ab1cc434db83097b7e9c831a764481dec7475afa9081156113c2575f9161200c575b508884511660405192835260048301528b82868173a8a425864db32fcbb459bf527bdbb8128e6abf215afa9081156113c2575f91611fdb575b611ed892506122cf565b87835116908115159182611fd1575b82611fbc575b5050611f22575b5050509282611f13610f24936127106112db611f189860019a986122dc565b6122ef565b9501929190611d02565b600a959295808402908482041484151715611fa9576064611f45910480946122ef565b95878351165f52818b5260405f20908154928301809311611f9657506112db8895611f8760019b9996611f189b611f1397610f249b9761271097555116612687565b95985050509382959750611ef4565b634e487b7160e01b5f9081526011600452fd5b86634e487b7160e01b5f5260116004525ffd5b9091505f52818b5260405f2054108e80611eed565b8115159250611ee7565b90508b82813d8311612005575b611ff28183612261565b810103126101d657611ed8915190611ece565b503d611fe8565b90508b81813d8311612032575b6120238183612261565b810103126101d657518f611e95565b503d612019565b611d4c9250611e4f565b979150612059612052896124a5565b80936122cf565b9761206d8160018060a01b035f5416612517565b611da5565b346101d65760203660031901126101d6576060906004355f52600460205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101d65782359167ffffffffffffffff83116101d6576020808501948460051b0101116101d657565b600435906001600160a01b03821682036101d657565b608435906001600160a01b03821682036101d657565b60406003198201126101d65767ffffffffffffffff916004358381116101d65782612142916004016120b8565b939093926024359182116101d65761215c916004016120b8565b9091565b60806003198201126101d65767ffffffffffffffff906004358281116101d6578161218d916004016120b8565b939093926024358181116101d657836121a8916004016120b8565b939093926044358381116101d657826121c3916004016120b8565b939093926064359182116101d65761215c916004016120b8565b91908110156121ed5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b6060810190811067ffffffffffffffff82111761221d57604052565b634e487b7160e01b5f52604160045260245ffd5b60e0810190811067ffffffffffffffff82111761221d57604052565b67ffffffffffffffff811161221d57604052565b90601f8019910116810190811067ffffffffffffffff82111761221d57604052565b1561228a57565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b91908201809211610cc457565b81810292918115918404141715610cc457565b91908203918211610cc457565b1561230357565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b1561235a57565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b1561239957565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b156123d957565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101d65790565b805f52600360205261244c6001600160501b03600160405f2001541691612461565b9015159081612459575090565b905042101590565b805f5260036020526001600160501b03600160405f20015416620151808101809111610cc4576124a2915f52600460205262ffffff60405f205416906122cf565b90565b5f9081526003602052604090206001015460a81c80156124c25790565b5067016345785d8a000090565b805f5260036020526124f16001600160501b03600160405f2001541691612461565b811515918261250c575b5081612505575090565b9050421090565b42101591505f6124fb565b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa5f9181612643575b506125b45750833b156101d65782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af19081156125ab575061259c575b505b565b6125a59061224d565b5f612598565b513d5f823e3d90fd5b6001600160a01b03908116806125ff575050833b156101d65782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f90839081838160448101612587565b8591959392933b156101d6575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af19081156125ab575061259c5750565b9091506020813d60201161267f575b8161265f60209383612261565b810103126101d657516001600160a01b03811681036101d657905f61254c565b3d9150612652565b8147106126c8575f8080808585617530f1156126a1575050565b601691600b915f526073825360ff602053f0156126ba57565b620f42405a1161259a575f80fd5b63b12d13eb5f526004601cfd5b5f546001600160a01b031633036126e857565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f908152600360205260409020600181018054929391926001600160501b03164210156101d65780546affffffffffffffffffffff60501b191660509490941b600160501b600160a81b03169390931783556002926127cb916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b0155565b9161ffff926001600160601b0361259a959316906001600160601b03199060601b16179060018060a01b03168061282f575b505f908152600360205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600360205260405f20906001600160601b0360a01b8254161790555f612801565b6001600160601b03918219928391169160601b16176128718161242a565b15612986575b6040805161288481612231565b5f8082526020808301828152848401838152606085018481526080860185815260a080880187815260c089018881528b895260039097529689902097519451935160b01b6001600160b01b03191661ffff60a01b9490911b939093166001600160a01b0390941693909317919091178555519051925160a81b6001600160a81b0319166001600160501b0390911660509390931b600160501b600160a81b0316929092179190911760018301556002905191015580519261294484612201565b5f84526bffffffffffffffffff00000062ffffff60208601935f8552808701955f87525f5260046020525f20955116925160181b16925160601b169117179055565b805f5260046020526040805f2081519061299f82612201565b549062ffffff821681526001600160481b038260181c169182602083015260601c9283910152806129d2575b5050612877565b6129db91612687565b5f806129cb565b906001600160601b039093929316906001600160601b03199060601b16175f52600360205260405f209060018201926001600160501b0392838554164210156101d6578282116101d65780546001600160b01b031691841660b01b6001600160b01b031916919091179055166001600160501b0319825416179055565b906001600160601b0390989794959692939816906001600160601b03199060601b161791825f5260036020526001600160501b039586600160405f200154166101d6578815612bb5575b8691829161ffff906001600160581b03988997886040519e8f90612acc82612231565b600160a01b600190038095168252866020830196168652886040830198168852606082019e8f91169052608001981688528d8960a082019b168b5260c0019c8d525f52600360205260405f209c51166001600160601b0360a01b8d5416178c555116612b50908b9081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5189546001600160b01b0316911660b01b6001600160b01b0319161788559451905192519190921660501b600160501b600160a81b0316919093166001600160501b0316176001600160a81b03199190921660a81b1617600183015551600290910155565b9597508795612aa956feb2790cfbb501cb5d139a6d2e6b8157f1e9fc7043f1354b6645d9accfa9d95582a2646970667358221220c5260d13e9ea62b2fa727de223ec22263c52626459d96e2cfb51097a16f5875e64736f6c63430008160033
Deployed Bytecode Sourcemap
261:22354:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;-1:-1:-1;;;;;261:22354:5;;:::i;:::-;;;;975:49;261:22354;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;:::i;:::-;1063:62:2;;:::i;:::-;-1:-1:-1;;;;;261:22354:5;;;;2162:22:2;;261:22354:5;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;2566:40:2;261:22354:5;2566:40:2;;261:22354:5;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;18349:7;261:22354;;:::i;:::-;1063:62:2;;:::i;:::-;261:22354:5;;18349:7;;:::i;:::-;261:22354;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;19706:11;261:22354;;:::i;:::-;;;:::i;:::-;1063:62:2;;;:::i;:::-;261:22354:5;;;;;;;;;;;;;;;;;;;;19706:11;;:::i;261:22354::-;;;;;;-1:-1:-1;;261:22354:5;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;1063:62:2;;;:::i;:::-;261:22354:5;17699:19;;;;;;261:22354;17720:3;17773:11;17923:12;17773:11;;;;;;;;;;;;;261:22354;17773:11;;;;:::i;:::-;261:22354;17923:12;;:::i;:::-;261:22354;17688:9;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:2;;;;;:::i;:::-;16281:37:5;;;:82;;;261:22354;16281:141;;;261:22354;16281:194;;;261:22354;16266:246;;;:::i;:::-;261:22354;16533:22;;;;;;261:22354;16557:3;16584:14;16654:18;16584:14;;;;;;;;16633:19;16584:14;;;;;;16654:18;16584:14;261:22354;16584:14;;;;;;;16613:18;16584:14;16600:11;16584:14;;:::i;:::-;;:::i;:::-;16600:11;;:::i;:::-;261:22354;16613:18;;:::i;:::-;261:22354;16633:19;;:::i;:::-;261:22354;16654:18;;:::i;:::-;261:22354;16654:18;;:::i;:::-;261:22354;16522:9;;16281:194;-1:-1:-1;16426:49:5;;;16281:194;;:141;16373:49;;;;16281:141;;:82;16322:41;;;;16281:82;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;22290:2;261:22354;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;22126:13;261:22354;;;-1:-1:-1;;;;;261:22354:5;;;;22126:41;261:22354;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;261:22354:5;;;;;;16878:5;1063:62:2;;;:::i;:::-;261:22354:5;;;;;16878:5;;:::i;261:22354::-;;;;;;-1:-1:-1;;261:22354:5;;;;1063:62:2;;:::i;:::-;261:22354:5;;;-1:-1:-1;;;;;;261:22354:5;;;;-1:-1:-1;;;;;261:22354:5;2566:40:2;261:22354:5;;2566:40:2;261:22354:5;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;:::i;:::-;;;21219:2;261:22354;;;;-1:-1:-1;;261:22354:5;;;-1:-1:-1;;;;;261:22354:5;21186:54;261:22354;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;1061:18;261:22354;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;18184:19;261:22354;;:::i;:::-;1063:62:2;;:::i;:::-;261:22354:5;;;;;;;;18184:19;;:::i;261:22354::-;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;1063:62:2;;:::i;:::-;20129:37:5;;;;;:83;;;261:22354;20129:144;;;261:22354;20129:190;;;261:22354;20129:231;;;261:22354;20129:271;;;261:22354;20129:324;;;261:22354;20129:371;;;261:22354;20114:423;;;:::i;:::-;261:22354;20547:9;;20558:22;;;;;;;;261:22354;20582:3;20808:15;20614:14;;;;;;;;;:::i;:::-;20638:11;;;;;;;;:::i;:::-;261:22354;20659:19;;;;;;;;:::i;:::-;261:22354;20688:20;;;;;;;;:::i;:::-;261:22354;20718:10;;;;;;;;;:::i;:::-;20738:9;;;;;;;;:::i;:::-;261:22354;20757:15;;;;;;;;;:::i;:::-;261:22354;20782:16;;;;;;;;;:::i;:::-;261:22354;20808:15;;;;;;;;;:::i;:::-;261:22354;20808:15;;:::i;:::-;261:22354;20582:3;;261:22354;20582:3;;20547:9;;20129:371;-1:-1:-1;20481:19:5;;20457:43;;;20129:371;;:324;20433:20;;;20410:43;;;20129:324;;:271;20381:19;;;20364:36;;;20129:271;;:231;20347:13;;;20329:31;;;20129:231;;:190;20305:14;;;20277:42;;;20129:190;;:144;20249:24;;;20222:51;;;20129:144;;:83;20189:23;;;20170:42;;;20129:83;;261:22354;;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;;;;;:::i;:::-;;7183:36;261:22354;7192:6;261:22354;;;;7191:7;7183:36;:::i;:::-;261:22354;;;;;;7488:15;-1:-1:-1;;920:51:5;;7286:21;;;;;;8502:9;;;8488:23;261:22354;;8552:15;8548:113;;261:22354;8548:113;8639:14;7855:10;;8639:14;:::i;261:22354::-;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;;;;;;;;7309:3;7342:13;;;;;;;;;:::i;:::-;261:22354;;;;;7393:13;261:22354;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7192:6;-1:-1:-1;;;;;261:22354:5;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;7488:15;:40;7487:97;;;;;7309:3;7487:125;;;;;7309:3;7474:210;;7488:15;920:51;;;;8421:29;8452:14;261:22354;7874:25;261:22354;;;;;7393:13;261:22354;;;;;;7692:41;-1:-1:-1;;;;;261:22354:5;;-1:-1:-1;;;;;559:8:5;;;;;;;261:22354;;;;;:::i;:::-;;;;7823:43;261:22354;7823:43;;-1:-1:-1;;;;;261:22354:5;;;;;;;7823:43;;7855:10;;261:22354;;;;;;;559:8;261:22354;;;;559:8;;261:22354;;;559:8;;;;-1:-1:-1;;;;;559:8:5;261:22354;;;559:8;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;7874:25;;:::i;:::-;7855:10;7925:9;7855:10;;7925:9;:::i;:::-;261:22354;;7488:15;261:22354;;-1:-1:-1;;;;;261:22354:5;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;-1:-1:-1;;;;;;;;;;;261:22354:5;;;;7949:160;;261:22354;;;;;;8158:10;;8154:56;;7309:3;8265:6;8243:19;8348:14;261:22354;-1:-1:-1;;;;;261:22354:5;;;;8243:19;:::i;:::-;920:51;261:22354;;;;;;;;;;8348:14;:::i;:::-;-1:-1:-1;;;;;261:22354:5;;;;;7192:6;261:22354;;;;;;8421:29;:::i;:::-;8452:14;;:::i;:::-;261:22354;7275:9;;;;;8154:56;-1:-1:-1;445:5:5;8154:56;;920:51;261:22354;;;;;;;;;;;7474:210;261:22354;;;;7631:26;261:22354;;;;-1:-1:-1;;;;;261:22354:5;;;;7631:26;;:::i;:::-;7667:8;;;7487:125;261:22354;-1:-1:-1;;;;;261:22354:5;;;;7596:16;7487:125;;:97;7488:15;;;-1:-1:-1;7541:42:5;7487:97;;;261:22354;;;;;;;;;;;;;1900:37;261:22354;1909:6;261:22354;;;;1908:7;1900:37;:::i;:::-;261:22354;;;1948:13;261:22354;;1909:6;261:22354;;;;1948:41;;261:22354;;-1:-1:-1;;;;;261:22354:5;;;;1948:61;1944:149;;261:22354;2121:36;;;;261:22354;2189:26;;;:::i;:::-;:83;;;;;261:22354;2179:164;;;;261:22354;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;391:9;2467:43;;;:96;391:9;;;725:5;2467:96;;331:6;261:22354;;;;;;;;2599:39;;;:::i;:::-;920:51;2585:9;:60;;:106;;;2467:96;261:22354;;;;2759:20;;261:22354;559:8;;261:22354;2850:28;;;;;:::i;:::-;261:22354;;;2889:21;2885:114;;2467:96;496:10;;;3019:15;3009:25;3019:15;3009:25;;:::i;:::-;:42;3005:115;;2467:96;261:22354;;;559:8;261:22354;;;;;;;:::i;:::-;;;;3158:54;;;2585:9;;261:22354;;;;;3158:54;;3201:10;;261:22354;;;;;;;;;559:8;;261:22354;;;;559:8;;;-1:-1:-1;;;;;559:8:5;261:22354;;;559:8;;;;;;;261:22354;;-1:-1:-1;;;;;261:22354:5;;;3224:164;261:22354;;;3019:15;;3224:164;3019:15;2585:9;3201:10;3224:164;496:10;;;;;;;;261:22354;;;;;;;;;496:10;;;261:22354;496:10;261:22354;496:10;3224:164;;;;3399:16;3395:117;;261:22354;3395:117;3490:14;;;:::i;3005:115::-;3019:15;;;;261:22354;3019:15;;;261:22354;;;3071:42;3061:52;3071:42;559:8;3071:42;;:::i;:::-;3061:52;;:::i;:::-;3005:115;;;;;2885:114;261:22354;;-1:-1:-1;;;;;261:22354:5;;-1:-1:-1;2920:32:5;-1:-1:-1;2885:114:5;;;;261:22354;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;2585:106;2668:23;;;;:::i;:::-;2585:9;2655:36;;2585:106;;2467:96;667:5;2467:96;;;261:22354;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;2179:164;261:22354;;;;1948:13;261:22354;;;;;;;;2284:15;:59;;2179:164;;2189:83;2228:15;;;;-1:-1:-1;2228:15:5;:43;;2189:83;;;;;2228:43;2247:9;;;:24;;2228:43;;;1944:149;2070:15;261:22354;559:8;-1:-1:-1;;;;;559:8:5;;;;;1944:149;;;;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;1031:26;261:22354;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;:::i;:::-;1063:62:2;;;;;;;;;;;:::i;:::-;18921:37:5;;;:86;;;261:22354;18921:153;;;261:22354;18906:205;;;:::i;:::-;261:22354;19132:22;;;;;;261:22354;19156:3;19181:14;19234:23;19181:14;;261:22354;19181:14;;;;:::i;:::-;19197:11;;;;;;:::i;:::-;261:22354;19234:23;19210:22;;;;;;:::i;:::-;261:22354;19234:23;;;:::i;:::-;261:22354;19234:23;;:::i;:::-;261:22354;19121:9;;18921:153;-1:-1:-1;19017:57:5;;;18921:153;;:86;18962:45;;;;18921:86;;261:22354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;8835:13;261:22354;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;8865:60;8873:24;;;:::i;:::-;8865:60;:::i;:::-;261:22354;;;8981:15;;;;261:22354;;9031:9;261:22354;;;;;9031:9;:::i;:::-;261:22354;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;9336:15;261:22354;;;;;;;-1:-1:-1;;;;;;;;;;;9228:148:5;;;;261:22354;;9421:10;;;9417:52;;8977:240;261:22354;;;;-1:-1:-1;;;9508:40:5;;;261:22354;;;;9508:40;;261:22354;9508:40;261:22354;;;833:42;9508:40;;;;;;;261:22354;9508:40;;;8977:240;261:22354;;;;;;;9589:41;;;261:22354;9589:41;;261:22354;9589:41;;261:22354;9589:41;928:42;9589:41;;;;;;;261:22354;9589:41;;;8977:240;9665:50;;;;:::i;:::-;261:22354;;;;9733:31;;;;:56;;;;8977:240;9733:119;;;8977:240;9722:367;;;;8977:240;261:22354;;;10490:14;261:22354;;10388:14;261:22354;10459:29;261:22354;;10307:6;261:22354;;10285:19;261:22354;;;;9336:15;;261:22354;;;;;10104:148;10285:19;;:::i;:::-;920:51;261:22354;;;;;10388:14;:::i;:::-;261:22354;;;10459:29;;:::i;9722:367::-;920:51;;;;;;;;;9899:2;920:51;;;;;9899:2;920:51;;;;;;;9904:3;9929:20;920:51;;9929:20;;;:::i;:::-;261:22354;;;;;;;;;;;;;;;;;;;;;;;;;10490:14;920:51;261:22354;920:51;;;10067:14;10459:29;920:51;;;10388:14;920:51;10285:19;920:51;10307:6;920:51;;261:22354;;10067:14;:::i;:::-;9722:367;;;;;;;;;;;;;;;;;9733:119;261:22354;;;;;;;;;;;;-1:-1:-1;9733:119:5;;;;:56;9768:21;;;;-1:-1:-1;9733:56:5;;9589:41;;;;;;;;;;;;;;;;:::i;:::-;;;825:51;;;;9665:50;825:51;;9589:41;;;;;;;;;261:22354;;825:51;261:22354;825:51;;;;;9508:40;;;;;;;;;;;;;;;;:::i;:::-;;;825:51;;;;;9508:40;;;;;;;;9417:52;445:5;;-1:-1:-1;9417:52:5;;8977:240;9083:23;;9062:83;9083:23;;;:::i;:::-;9070:9;:36;9062:83;:::i;:::-;261:22354;9070:9;261:22354;9200:9;261:22354;;;;;9200:9;:::i;:::-;8977:240;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;1063:62:2;;;;;;:::i;:::-;18487:89:5;18502:37;;;18487:89;:::i;:::-;261:22354;18597:22;;;;;;261:22354;18621:3;18648:14;18664:11;18648:14;;261:22354;18648:14;;;;:::i;:::-;18664:11;;;;;:::i;:::-;261:22354;18664:11;;:::i;:::-;261:22354;18586:9;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;;;:::i;:::-;1063:62:2;;:::i;:::-;20925:26:5;261:22354;;-1:-1:-1;;;;;;261:22354:5;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:2;;;;;;;;:::i;:::-;17098:37:5;;;:74;;;261:22354;17098:115;;;261:22354;17083:167;;;:::i;:::-;261:22354;17271:22;;;;;;261:22354;17295:3;17321:14;17362:9;17321:14;;;17362:9;17321:14;;17350:10;17321:14;;;17337:11;17321:14;;;261:22354;17321:14;;;;17350:10;17321:14;;:::i;:::-;17337:11;;:::i;:::-;261:22354;17350:10;;:::i;:::-;17362:9;;;:::i;:::-;261:22354;17362:9;;:::i;:::-;261:22354;17260:9;;17098:115;-1:-1:-1;17182:31:5;;;17098:115;;:74;17139:33;;;;17098:74;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;1063:62:2;;:::i;:::-;21026:16:5;261:22354;;-1:-1:-1;;;;261:22354:5;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;1372:54;261:22354;;;;;;;;1372:54;;261:22354;1372:54;;261:22354;1372:54;;261:22354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;3639:37;261:22354;3648:6;261:22354;;;;3647:7;3639:37;:::i;:::-;3690:41;;;261:22354;;;3760:21;261:22354;3791:9;261:22354;3802:20;;;;;;5733:9;;;:26;496:10;;5802:15;5798:113;;261:22354;496:10;261:22354;;-1:-1:-1;;;496:10:5;;261:22354;;496:10;;;;;;;261:22354;496:10;261:22354;;;496:10;;;;3824:3;3857:12;;;;;:::i;:::-;261:22354;3901:17;3926:30;3901:17;;;;;:::i;:::-;261:22354;3926:30;;;:::i;:::-;261:22354;;;;3994:13;261:22354;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;3648:6;261:22354;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;4031:43;4027:135;;3824:3;4196:26;;;;;:::i;:::-;:103;;;;3824:3;4183:126;261:22354;;;4183:170;;3824:3;4170:257;;;261:22354;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;391:9;4522:43;;;:98;391:9;;;725:5;4522:98;;331:6;261:22354;;;;;;;;4660:39;;;:::i;:::-;920:51;4642:64;;;:116;;;4522:98;4629:1084;;;261:22354;4807:20;261:22354;559:8;261:22354;559:8;;261:22354;4906:28;;;:::i;:::-;261:22354;-1:-1:-1;;;;;261:22354:5;;;;;4949:21;4945:126;;4629:1084;496:10;;;5095:15;;5085:25;5095:15;5085:25;;:::i;:::-;:42;5081:123;;4629:1084;261:22354;;;;;;;;;;;:::i;:::-;;;;;5246:58;;-1:-1:-1;;;;;261:22354:5;;;;;5246:58;;5293:10;;261:22354;;;;;;;;559:8;261:22354;;;;559:8;;261:22354;;;;559:8;;;-1:-1:-1;;;;;559:8:5;261:22354;;;559:8;;;;;;;261:22354;;;5320:196;-1:-1:-1;;;;;261:22354:5;;;;5320:196;261:22354;;;5095:15;;5293:10;;5320:196;496:10;;;;;;;;261:22354;;;;;;;;;496:10;;;261:22354;496:10;261:22354;496:10;5320:196;;;;5531:16;5527:125;;4629:1084;;;;261:22354;3791:9;;5527:125;5626:14;;;:::i;:::-;5527:125;;;;5081:123;5095:15;;;261:22354;5095:15;261:22354;;;5151:42;5141:52;5095:15;261:22354;5095:15;;261:22354;5151:42;:::i;5141:52::-;5081:123;;;4945:126;261:22354;;;;;-1:-1:-1;;;;;261:22354:5;;-1:-1:-1;4984:32:5;-1:-1:-1;4945:126:5;;;;4629:1084;5676:28;261:22354;5676:28;;;;;;:::i;:::-;4629:1084;;;4642:116;4735:23;;;;:::i;:::-;4718:40;;;4642:116;;4522:98;667:5;4522:98;;;4170:257;261:22354;4372:28;;;;;;:::i;4183:170::-;-1:-1:-1;;;;;261:22354:5;;;;;;4313:15;:40;4183:170;;;4196:103;261:22354;;;;;4237:22;;;:61;;;;4196:103;;;;4237:61;4263:35;;;;;4237:61;;;4027:135;261:22354;;;;;;;;4086:41;-1:-1:-1;;;;;4137:15:5;261:22354;-1:-1:-1;;;;;559:8:5;;;;;;;4027:135;;;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;15993:14;261:22354;;:::i;:::-;1063:62:2;;:::i;:::-;261:22354:5;;;;;;;;;;;15993:14;;:::i;261:22354::-;;;;;;;;;;;;;;;;6015:13;261:22354;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;6091:36;261:22354;;;;;;6099:7;6091:36;:::i;:::-;261:22354;;6141:15;:41;261:22354;;6141:15;;261:22354;;;6221:41;261:22354;;;6305:16;;;:44;;;261:22354;;;;920:51;;6141:15;920:51;6141:15;;920:51;;;;261:22354;7042:29;261:22354;;;6971:14;261:22354;7073:14;261:22354;;;6015:13;261:22354;;;;;;6380:41;261:22354;;-1:-1:-1;;;;;559:8:5;;;;;;;261:22354;;;;;:::i;:::-;;;;6509:41;;;-1:-1:-1;;;;;6527:9:5;261:22354;;;;6509:41;;6539:10;;261:22354;;;;;;;;559:8;261:22354;;;;559:8;;261:22354;;;559:8;;;;-1:-1:-1;;;;;559:8:5;261:22354;;;559:8;;;;;;;6574:9;6539:10;;6574:9;:::i;:::-;261:22354;;;6141:15;;261:22354;;;;;-1:-1:-1;;;;;261:22354:5;;;-1:-1:-1;;;;;;;;;;;261:22354:5;;;;6596:148;;261:22354;;6789:10;;6785:52;;261:22354;6868:19;6890:6;6868:19;;;:::i;6785:52::-;-1:-1:-1;445:5:5;6785:52;;261:22354;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;6305:44;6325:9;;;:24;6305:44;;261:22354;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10631:21;261:22354;10663:9;261:22354;10658:1686;10674:21;;;;;;12494:14;12358:9;12350:73;12358:9;;:26;12350:73;:::i;:::-;261:22354;;-1:-1:-1;;;;;261:22354:5;12494:14;:::i;10697:3::-;10730:13;;;;;;;;;:::i;:::-;261:22354;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;10816:60;10824:24;;;:::i;10816:60::-;261:22354;;;10936:15;;;;261:22354;;10988:9;;261:22354;;-1:-1:-1;;;;;261:22354:5;10988:9;:::i;:::-;261:22354;;11271:15;261:22354;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;-1:-1:-1;;;;;;;;;;;261:22354:5;;;;11155:160;;261:22354;;11354:13;261:22354;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;11386:28;11426:10;11422:56;;10932:210;261:22354;;;;-1:-1:-1;;;11526:40:5;;;261:22354;;;;11526:40;;261:22354;;;;825:51;11526:40;261:22354;;;833:42;11526:40;;;;;;;261:22354;11526:40;;;10932:210;261:22354;;;;;;;11609:41;;;261:22354;11609:41;;261:22354;11609:41;;;;928:42;11609:41;;;;;;;261:22354;11609:41;;;10932:210;11687:50;;;;:::i;:::-;261:22354;;;;11759:31;;;;:56;;;;10932:210;11759:121;;;10932:210;11746:383;;;;10932:210;12162:19;;;;;12267:14;12308:29;12162:19;12184:6;12162:19;12291:46;12162:19;261:22354;12162:19;;;:::i;12267:14::-;12308:29;:::i;12291:46::-;10697:3;261:22354;10663:9;;;;;11746:383;11931:2;;;;920:51;;;;;;;;;;;;;;11936:3;11963:20;920:51;;11963:20;;;:::i;:::-;261:22354;;;;;;;;;;;;;;;;;;;;;;;;920:51;12162:19;920:51;;12105:14;261:22354;920:51;;;12291:46;920:51;12267:14;920:51;12308:29;920:51;;12184:6;920:51;;261:22354;;12105:14;:::i;:::-;11746:383;;;;;;;;;;;;261:22354;-1:-1:-1;;;261:22354:5;;;;;;;;920:51;261:22354;;;;;;;;;;;11759:121;261:22354;;;;;;;;;;;;-1:-1:-1;11759:121:5;;;;:56;11794:21;;;;-1:-1:-1;11759:56:5;;11609:41;;;;;;;;;;;;;;;;:::i;:::-;;;825:51;;;;11687:50;825:51;;11609:41;;;;;;;;11526:40;;;;;;;;;;;;;;;;:::i;:::-;;;825:51;;;;;11526:40;;;;;;;;11422:56;445:5;;-1:-1:-1;11422:56:5;;10932:210;11037:23;;;11070:28;11037:23;;;:::i;:::-;11070:28;;;:::i;:::-;261:22354;11123:9;261:22354;;;;;;;;;11123:9;:::i;:::-;10932:210;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;261:22354:5;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;261:22354:5;;;;;;:::o;:::-;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;-1:-1:-1;;261:22354:5;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;920:51::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;776:6::-;;;;:::o;:::-;261:22354;;-1:-1:-1;;;776:6:5;;;;;;;;;;;261:22354;776:6;261:22354;;;776:6;-1:-1:-1;;;776:6:5;;;;;;;261:22354;;;;:::o;:::-;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;261:22354:5;;;;;;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;:::o;21545:259::-;261:22354;-1:-1:-1;261:22354:5;21648:13;261:22354;;21713:28;-1:-1:-1;;;;;21648:41:5;261:22354;-1:-1:-1;261:22354:5;21648:41;261:22354;;21713:28;;:::i;:::-;21755:13;;;:43;;;;21747:52;21545:259;:::o;21755:43::-;21772:15;;;:26;;21545:259;:::o;21808:213::-;261:22354;-1:-1:-1;261:22354:5;21905:13;261:22354;;-1:-1:-1;;;;;21905:41:5;261:22354;-1:-1:-1;261:22354:5;21905:41;261:22354;;559:8;261:22354;;;;;;;21905:111;261:22354;-1:-1:-1;261:22354:5;21973:18;261:22354;;;;-1:-1:-1;261:22354:5;;;21905:111;;:::i;:::-;21808:213;:::o;22423:190::-;-1:-1:-1;261:22354:5;;;22526:13;261:22354;;;;;22526:37;;261:22354;;;22576:12;;;;22423:190;:::o;22576:32::-;;606:9;22423:190;:::o;21249:292::-;261:22354;-1:-1:-1;261:22354:5;21354:13;261:22354;;21419:28;-1:-1:-1;;;;;21354:41:5;261:22354;-1:-1:-1;261:22354:5;21354:41;261:22354;;21419:28;;:::i;:::-;21461:13;;;:45;;;;21249:292;21461:74;;;;21453:83;21249:292;:::o;21461:74::-;21510:15;;;:25;21249:292;:::o;21461:45::-;21478:15;:28;;;-1:-1:-1;21461:45:5;;;12518:475;-1:-1:-1;;;;;261:22354:5;22290:2;261:22354;;;;;;;;825:51;;;12706:33;;;;;;261:22354;12706:33;;261:22354;12706:33;;;;-1:-1:-1;;12706:33:5;;;12518:475;-1:-1:-1;12702:287:5;;12948:34;;;;;;261:22354;;-1:-1:-1;;;12948:34:5;;-1:-1:-1;;;;;261:22354:5;;;12706:33;12948:34;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;-1:-1:-1;261:22354:5;;;;12948:34;;;;;;;;;;;;;12702:287;;;12518:475::o;12948:34::-;;;;:::i;:::-;;;;;261:22354;825:51;-1:-1:-1;825:51:5;;;;;12702:287;-1:-1:-1;;;;;261:22354:5;;;12777:20;261:22354;;12809:34;;;;;;;261:22354;;-1:-1:-1;;;12809:34:5;;-1:-1:-1;;;;;261:22354:5;;;12706:33;12809:34;;261:22354;;;;;;-1:-1:-1;;261:22354:5;;;-1:-1:-1;261:22354:5;;;;12809:34;261:22354;12773:154;12868:50;;;;;;;;;;-1:-1:-1;261:22354:5;;;;;;825:51;;;;;;;;12868:50;;12706:33;12868:50;;261:22354;;;;;;;;;;12868:50;;;;;;;;;;12773:154;12518:475::o;12706:33::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;261:22354;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;12706:33;;;;;;;-1:-1:-1;12706:33:5;;3371:1204:4;3511:1058;;;;;;;;;;;776:6:5;3511:1058:4;;;;3371:1204;;:::o;3511:1058::-;;;;;;;;;;;;;;;;;3371:1204::o;3511:1058::-;;;;;;;;;;;;;;;;1359:130:2;1273:6;261:22354:5;-1:-1:-1;;;;;261:22354:5;719:10:3;1422:23:2;261:22354:5;;1359:130:2:o;261:22354:5:-;;;;;;;;;;;;;;;;;;;;;;;;;13012:521;21219:2;261:22354;-1:-1:-1;;261:22354:5;-1:-1:-1;;;;;261:22354:5;;;21186:54;-1:-1:-1;261:22354:5;;;13272:13;261:22354;;;;;13272:41;;;261:22354;;13012:521;;261:22354;;-1:-1:-1;;;;;261:22354:5;13316:15;-1:-1:-1;261:22354:5;;;;;-1:-1:-1;;;;261:22354:5;;;;;;-1:-1:-1;;;;;;;261:22354:5;;;;;;;13475:36;;13406:63;;-1:-1:-1;;;;;261:22354:5;;;-1:-1:-1;;;;;261:22354:5;;;;;-1:-1:-1;;;;;;261:22354:5;;;;;13406:63;13475:36;920:51;13012:521::o;13537:348::-;;261:22354;13537:348;-1:-1:-1;;;;;13831:49:5;13537:348;;261:22354;559:8;-1:-1:-1;;;;;559:8:5;261:22354;21219:2;261:22354;;21186:54;261:22354;;;;;;;13749:20;13745:81;;13537:348;-1:-1:-1;;261:22354:5;;;13831:13;261:22354;;;;;;;-1:-1:-1;;;;261:22354:5;;;;;;;-1:-1:-1;;;261:22354:5;;;;;;;;13745:81;261:22354;-1:-1:-1;261:22354:5;13779:13;261:22354;;;-1:-1:-1;261:22354:5;;-1:-1:-1;;;;;261:22354:5;;;;;;;;13745:81;;;13889:552;-1:-1:-1;;;;;13889:552:5;559:8;;261:22354;;;;;21219:2;261:22354;;21186:54;14061:24;;;:::i;:::-;14060:25;14056:250;;13889:552;261:22354;;;;;;:::i;:::-;-1:-1:-1;261:22354:5;;;14338:37;;;;261:22354;;;14338:37;;;261:22354;;;21219:2;14338:37;;261:22354;;;14338:37;;;261:22354;;;14338:37;;;;261:22354;;;14338:37;;;261:22354;;;;;;14311:13;261:22354;;;;;;;;;;;;;;;-1:-1:-1;;;;;;261:22354:5;-1:-1:-1;;;261:22354:5;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;261:22354:5;-1:-1:-1;;;;;261:22354:5;;;;;;;;-1:-1:-1;;;;;;;261:22354:5;;;;;;;;;-1:-1:-1;261:22354:5;;;;;;;;920:51;261:22354;;;;;;:::i;:::-;-1:-1:-1;261:22354:5;;559:8;261:22354;14338:37;14413:23;;261:22354;-1:-1:-1;261:22354:5;;14413:23;;;261:22354;-1:-1:-1;261:22354:5;;-1:-1:-1;261:22354:5;14381:18;14338:37;261:22354;-1:-1:-1;261:22354:5;559:8;;261:22354;;;559:8;;;261:22354;;21219:2;559:8;;;;;;;13889:552::o;14056:250::-;261:22354;-1:-1:-1;261:22354:5;14124:18;261:22354;;;;-1:-1:-1;261:22354:5;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;21219:2;261:22354;;;;;;14165:22;14161:139;;14056:250;;;;;14161:139;14199:92;;;:::i;:::-;14161:139;;;;14445:512;;-1:-1:-1;;;;;14445:512:5;;;;261:22354;559:8;-1:-1:-1;;;;;559:8:5;261:22354;21219:2;261:22354;;21186:54;-1:-1:-1;261:22354:5;14683:13;261:22354;;;-1:-1:-1;261:22354:5;14683:41;;;;261:22354;-1:-1:-1;;;;;261:22354:5;;;;;14727:15;-1:-1:-1;261:22354:5;;;14757:41;;;261:22354;;;;-1:-1:-1;;;;;261:22354:5;;;;;;-1:-1:-1;;;;;;261:22354:5;;;;;;;;-1:-1:-1;;;;;559:8:5;;;;;;;14445:512::o;14961:748::-;;-1:-1:-1;;;;;14961:748:5;;;;;;;;;261:22354;559:8;-1:-1:-1;;;;;559:8:5;261:22354;21219:2;261:22354;;21186:54;261:22354;;-1:-1:-1;261:22354:5;15301:13;261:22354;;-1:-1:-1;;;;;261:22354:5;;15301:41;261:22354;-1:-1:-1;261:22354:5;15301:41;261:22354;;;;15355:42;15407:20;15403:75;;14961:748;261:22354;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;15510:194;261:22354;15510:194;;261:22354;;;;15510:194;261:22354;15510:194;;261:22354;;;;21219:2;15510:194;;261:22354;;;;;;15510:194;;261:22354;;;;15510:194;;;;;261:22354;;;;15510:194;;261:22354;;;-1:-1:-1;261:22354:5;15301:13;261:22354;;;-1:-1:-1;261:22354:5;;;;-1:-1:-1;;;;;261:22354:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:22354:5;;;;;-1:-1:-1;;;;;;261:22354:5;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;261:22354:5;;;;;-1:-1:-1;;;;;261:22354:5;;-1:-1:-1;;;;;;261:22354:5;;;;;;;;-1:-1:-1;261:22354:5;;;;;;;;920:51;14961:748::o;15403:75::-;15437:34;;-1:-1:-1;15437:34:5;;15403:75;
Swarm Source
ipfs://c5260d13e9ea62b2fa727de223ec22263c52626459d96e2cfb51097a16f5875e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BASE | 100.00% | $3,464.52 | 0.55 | $1,905.49 |
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.