Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ArtMarketplace
Compiler Version
v0.8.23+commit.f704f362
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 => uint16) 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 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":"uint16","name":"","type":"uint16"}],"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
6080806040523461005a575f8054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3612a73908161005f8239f35b5f80fdfe6102e0806040526004361015610013575f80fd5b5f3560e01c9081630254837614611ed05750806302ffbaba14611ce857806308a0f32f14611a6d5780630b2a16f114611a345780631033a6631461166b5780631107a8fc146115e857806316c38b3c146115a35780631ae03271146115065780631c31f710146114c357806327327ba0146114675780632c104a92146114495780632e993611146110e757806337fee6251461104e57806338af3eed14611026578063454a2ab314610d20578063469847fd14610a0e57806355808c741461074857806359aab242146107135780635c975abb146106ee5780637100dd87146106aa578063715018a6146106535780638624e7df1461060d5780638c77cc09146105e75780638da5cb5b146105c0578063919e84f51461058a578063930e79f11461056c57806395657db01461054c578063ba6646be14610403578063c62182041461036c578063cc14394c1461031c578063e361c5a8146102f6578063e71f7b15146102ce578063ecee4c9d1461029f578063f2fde38b146101de5763f5d8d7ba1461019e575f80fd5b346101da5760203660031901126101da576001600160a01b036101bf611f47565b165f526001602052602061ffff60405f205416604051908152f35b5f80fd5b346101da5760203660031901126101da576101f7611f47565b6101ff612533565b6001600160a01b0390811690811561024b575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101da5760403660031901126101da576102cc6102bb611f47565b6102c3612533565b602435906126b1565b005b346101da5760203660031901126101da5760206102ec60043561232d565b6040519015158152f35b346101da5760203660031901126101da576020610314600435612303565b604051908152f35b346101da576101203660031901126101da576102cc610339611f47565b610341611f5d565b9061034a612533565b610104359160e4359160c4359160a435916064359060443590602435906128bd565b346101da576101203660031901126101da57610386611f47565b60243567ffffffffffffffff81116101da576103a6903690600401611f16565b91906044356064356103b6611f5d565b60a43560c4359160e4359361010435956103ce612533565b5f5b8a81106103d957005b806103fd8989898f8f8f898c926103f68f959b60019c8f9561203b565b35906128bd565b016103d0565b346101da5760a03660031901126101da5767ffffffffffffffff6004358181116101da57610435903690600401611f16565b6024929192358281116101da57610450903690600401611f16565b6044358481116101da57610468903690600401611f16565b94906064358281116101da57610482903690600401611f16565b9590926084359081116101da5761049d903690600401611f16565b6104a8959195612533565b81831480610543575b8061053a575b80610531575b6104c690612230565b5f5b8381106104d157005b8061052b8989898f8f8f978961051d828f959b8f8f6105249760019f858093610509610504836105169861050f9661203b565b612274565b9f61203b565b359961203b565b359761203b565b359561203b565b359361258a565b016104c8565b508781146104bd565b508789146104b7565b508882146104b1565b346101da5760203660031901126101da57602060405160043560601c8152f35b346101da5760203660031901126101da5760206103146004356122bf565b346101da5760203660031901126101da576004355f52600360205260206001600160501b03600160405f20015416604051908152f35b346101da575f3660031901126101da575f546040516001600160a01b039091168152602090f35b346101da5760203660031901126101da5760206040516001600160601b03600435168152f35b346101da5760803660031901126101da57610626611f47565b604435906001600160a01b03821682036101da576102cc91610646612533565b606435916024359061262d565b346101da575f3660031901126101da5761066b612533565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101da5760403660031901126101da5760206106c5611f47565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101da575f3660031901126101da57602060ff60025460a01c166040519015158152f35b346101da5760803660031901126101da576102cc61072f611f47565b610737612533565b606435906044359060243590612840565b346101da576101203660031901126101da5767ffffffffffffffff6004358181116101da5761077b903690600401611f16565b60c052610140526024358181116101da5761079a903690600401611f16565b61020052610180526044358181116101da576107ba903690600401611f16565b6101e052610100526064358181116101da576107da903690600401611f16565b610240526101a0526084358181116101da576107fa903690600401611f16565b6102c05260a05260a4358181116101da57610819903690600401611f16565b6102605260e05260c4358181116101da57610838903690600401611f16565b610280526101205260e4358181116101da57610858903690600401611f16565b6102a05261016052610104359081116101da57610879903690600401611f16565b610220526101c052610889612533565b6102005160c05114806109ff575b806109f0575b806109e1575b806109d2575b806109c3575b806109b4575b806109a5575b6108c490612230565b5f6080525b60c051608051106108d657005b6109976108ee61050460805160c0516101405161203b565b610901608051610200516101805161203b565b356109156080516101e0516101005161203b565b35610929608051610240516101a05161203b565b3561093f6105046080516102c05160a05161203b565b6109516080516102605160e05161203b565b3591610966608051610280516101205161203b565b359361097b6080516102a0516101605161203b565b3595610990608051610220516101c05161203b565b35976128bd565b6001608051016080526108c9565b50610220516102a051146108bb565b506102a05161028051146108b5565b506102805161026051146108af565b50610260516102c051146108a9565b506102c05161024051146108a3565b50610240516101e0511461089d565b506101e0516102005114610897565b60203660031901126101da5760043567ffffffffffffffff81116101da57610a3a903690600401611f16565b90610a4d60ff60025460a01c16156121b1565b5f9182918291426201517f1901905b808410610ac15785853403610a7c5780610a7257005b6102cc90336124e5565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610ad085838661203b565b3594855f52600360205260405f2060405190610aeb8261208f565b805460018060a01b038116835261ffff8160a01c16602084015260b01c9081604084015260018101549160026001600160501b038416928360608701526001600160581b038560501c1660808701528460a81c60a0870152015460c08501524210908115610d15575b508015610d01575b610cdc57428611610cc857610cb0610cb692610c136001968b5f5260036020528760405f20016001600160501b038b166001600160501b0319825416179055604051610ba78161205f565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c169061212d565b99610c1e8133612375565b6040514281526001600160581b038560501c1660208201526001600160601b038216915f80516020612a1e83398151915260408260601c93a461ffff6020820151168015610cbf575b612710610c83610c94926001600160581b038760501c1661213a565b048092888060a01b039051166124e5565b6001600160581b03868060a01b03600254169360501c1661214d565b906124e5565b01929190610a5c565b50611d4c610c67565b634e487b7160e01b5f52601160045260245ffd5b6001939750610cfb929891506001600160581b039060501c169061212d565b95610cb6565b506001600160581b038160501c1615610b5c565b90504210158a610b54565b6020806003193601126101da5760043590610d4360ff60025460a01c16156121f0565b815f5260038152600260405f206001810180546001600160501b03808083161461100e575b5050500154610d768361232d565b908115610ff1575b5080610fd9575b15610fa257815f526004815260405f209160405192610da38461205f565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610f99576103e8905b612710918201808311610cc857610dfb9161213a565b0434101580610f87575b15610f4c575f95815f9851169483610e1c886122bf565b92511680610f36575b505061025880610e35428461214d565b10610f01575b5050806bffffffffffffffffff0000009160405195610e598761205f565b168552838501923416835260046040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610eee42343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610ef857005b6102cc916124e5565b949194420191824211610cc857610f28610f2e926bffffffffffffffffff0000009461214d565b9061212d565b939088610e3b565b90516001600160a01b0316985096508880610e25565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610f9185612303565b341015610e05565b6107d090610de5565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526003815260405f205460b01c421015610d85565b801515915081611003575b5083610d7e565b905034101583610ffc565b4216906001600160501b031916179055848080610d68565b346101da575f3660031901126101da576002546040516001600160a01b039091168152602090f35b346101da5761105c36611fbe565b959661106d95949593929193612533565b858814806110de575b806110d5575b61108590612230565b5f5b88811061109057005b806110cf6110a46105046001948d8761203b565b8a6110b0848c8c61203b565b356110c8856110c0818b8d61203b565b35938c61203b565b3592612840565b01611087565b5081871461107c565b50818614611076565b6020806003193601126101da5760043590815f526004815260405f20604051906111108261205f565b5462ffffff811682526001600160481b03604084840193828460181c168552019160601c8252845f526003845260405f206040519561114e8761208f565b81549260018060a01b03958685168952600261ffff94898b0196868160a01c16885260b01c60408c015260018101546001600160501b03811660608d01526001600160581b038160501c1660808d015260a81c60a08c0152015460c08a01526111be6111b984612288565b6120e1565b511695861561141e576040906111d78388885116612375565b8260601c93806001600160601b038516968787878d885190428252888201525f80516020612a1e833981519152988991a45116968715611414575b80516040516370a0823160e01b808252918b1660048201528481602481739cf0ab1cc434db83097b7e9c831a764481dec7475afa9081156113dc575f916113e7575b508a8351166040519283526004830152848260248173a8a425864db32fcbb459bf527bdbb8128e6abf215afa9081156113dc575f916113ab575b611298925061212d565b898251169081151591826113a1575b82611388575b50506112f6575b50508695610cb097956112ec956102cc9b956127109560406112e1968e825191428352820152a48861213a565b0493849151166124e5565b600254169261214d565b92919993949897969095600a8902898104600a148a151715610cc85760646113209104809a61214d565b99888551165f5260018c5260405f209687549460018a87160199808b11610cc8576102cc9e8e611373610cb09f8f9e8f909c6112ec9f6112e19d6127109f98604099169061ffff191617905551166124e5565b509650509550959b50955095978197506112b4565b9091505f52600184528260405f20541611158c806112ad565b81151592506112a7565b90508482813d83116113d5575b6113c281836120bf565b810103126101da5761129891519061128e565b503d6113b8565b6040513d5f823e3d90fd5b90508481813d831161140d575b6113fe81836120bf565b810103126101da57518d611254565b503d6113f4565b611d4c9750611212565b955061143361142c82612303565b341461215a565b6040349661144483885f5416612375565b6111d7565b346101da5760203660031901126101da5760206102ec600435612288565b346101da5761147536611f73565b90611481939293612533565b61148c828514612230565b5f5b84811061149757005b806114bd6114ab610504600194898961203b565b6114b683878761203b565b35906126b1565b0161148e565b346101da5760203660031901126101da576114dc611f47565b6114e4612533565b600280546001600160a01b0319166001600160a01b0392909216919091179055005b346101da5761151436611fbe565b959493909291611522612533565b8186148061159a575b80611591575b61153a90612230565b5f5b86811061154557005b8061158b878a87611584858f6105048f998b611576828f61157060019f836105049161157d9a61203b565b9b61203b565b359661203b565b938c61203b565b359261262d565b0161153c565b50808714611531565b5080821461152b565b346101da5760203660031901126101da576004358015158091036101da576115c9612533565b6002805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101da5760203660031901126101da576004355f52600360205260e060405f2080549060026001820154910154906040519260018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b03811660608401526001600160581b038160501c16608084015260a81c60a083015260c0820152f35b61167436611f73565b92919061168960ff60025460a01c16156121f0565b8382036101da575f935f925f5b8181106116f157868534036116ac5780610a7257005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6116fc81838861203b565b359061171461170c82868861203b565b35809761212d565b95825f5260038060205260405f206040519161172f8361208f565b815460018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b0360019260028482015491838316928360608901526001600160581b038160501c16608089015260a81c60a0880152015460c086015214611a09575b505061179f8461232d565b80156119e8575b159081156119d1575b506119c357825f52600460205260405f2092604051936117ce8561205f565b5462ffffff811685526001600160481b038160181c169081602087015260601c60408601526702c68af0bb1400008110155f146119ba576103e8905b612710918201808311610cc8576118209161213a565b04821015806119a8575b15611993575f905f9262ffffff865116611843836122bf565b966001600160481b0360208201511680611979575b50506102589687611869428361214d565b10611958575b506001965062ffffff604051916118858361205f565b168152602081016001600160481b03831681526040820190338252845f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b03821693806119368460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a480611948575b50505b01611696565b611951916124e5565b888061193f565b908742014211610cc857610f2861197392600199420161214d565b8d61186f565b6040909101516001600160a01b0316955093508d80611858565b50600192506119a2919861212d565b96611942565b506119b281612303565b82101561182a565b6107d09061180a565b600192506119a2919861212d565b6001600160501b039150604001511642108a6117af565b5060c081015180151590816119fe575b506117a6565b90508210158b6119f8565b855f5260205260405f20016001600160501b0342166001600160501b03198254161790558a80611794565b346101da5760a03660031901126101da576102cc611a50611f47565b611a58612533565b6084359060643590604435906024359061258a565b6020806003193601126101da5760043590815f526003815260405f2090604051611a968161208f565b82549060018060a01b0391828116825261ffff9184810192808360a01c168452604082019260b01c83526001870154966001600160501b03809460026060860193838c1685526001600160581b038c60501c169b8c608089015260a81c60a0880152015460c0860152611b1160ff60025460a01c16156121b1565b51164210611cac5783429151161115611c675786151580611c5e575b15611c23576201517f19420193428511610cc85788610cb09787966112ec966102cc9c5f5260038352600160405f200191166001600160501b0319825416179055604051611b7a8161205f565b5f81528181016001600160481b03341681526040820190338252845f52600484526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055611bd88233612375565b89604051914283528201526001600160601b038216915f80516020612a1e83398151915260408260601c93a451168015611c1a575b6112e1612710918861213a565b50611d4c611c0d565b60405162461bcd60e51b815260048101879052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b50863414611b2d565b60405162461bcd60e51b815260048101879052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b815260048101889052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b6020806003193601126101da5760043567ffffffffffffffff81116101da57611d15903690600401611f16565b5f92915f925f925b808410611d44576102cc85611d3388341461215a565b6002546001600160a01b03166124e5565b90919293611d5385838661203b565b35805f526004845260405f209060405191611d6d8361205f565b549062ffffff821683526001600160481b03868401818460181c16815260406060950193851c8452611da16111b984612288565b5116918215611e9657926001949282611dc9610f2894611e8397898060a01b03905116612375565b604051428152828a8201526001600160601b03821690825f80516020612a1e833981519152604082881c93a45f5260038852611e7e60405f2089600260405192611e128461208f565b80548b8060a01b0397888216865260a09161ffff81841c16809688015260b01c60408701528c830154906001600160501b038216908701526001600160581b038160501c16608087015260a81c90850152015460c08301528015611e8d575b6112e1612710918561213a565b61214d565b9401929190611d1d565b50611d4c611e71565b50976001939150611e8392610f2891611eb8611eb18c612303565b809261212d565b9a611ecb81888060a01b035f5416612375565b611dc9565b346101da5760203660031901126101da576060906004355f52600460205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101da5782359167ffffffffffffffff83116101da576020808501948460051b0101116101da57565b600435906001600160a01b03821682036101da57565b608435906001600160a01b03821682036101da57565b60406003198201126101da5767ffffffffffffffff916004358381116101da5782611fa091600401611f16565b939093926024359182116101da57611fba91600401611f16565b9091565b60806003198201126101da5767ffffffffffffffff906004358281116101da5781611feb91600401611f16565b939093926024358181116101da578361200691600401611f16565b939093926044358381116101da578261202191600401611f16565b939093926064359182116101da57611fba91600401611f16565b919081101561204b5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b6060810190811067ffffffffffffffff82111761207b57604052565b634e487b7160e01b5f52604160045260245ffd5b60e0810190811067ffffffffffffffff82111761207b57604052565b67ffffffffffffffff811161207b57604052565b90601f8019910116810190811067ffffffffffffffff82111761207b57604052565b156120e857565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b91908201809211610cc857565b81810292918115918404141715610cc857565b91908203918211610cc857565b1561216157565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b156121b857565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b156121f757565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b1561223757565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101da5790565b805f5260036020526122aa6001600160501b03600160405f20015416916122bf565b90151590816122b7575090565b905042101590565b805f5260036020526001600160501b03600160405f20015416620151808101809111610cc857612300915f52600460205262ffffff60405f2054169061212d565b90565b5f9081526003602052604090206001015460a81c80156123205790565b5067016345785d8a000090565b805f52600360205261234f6001600160501b03600160405f20015416916122bf565b811515918261236a575b5081612363575090565b9050421090565b42101591505f612359565b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa5f91816124a1575b506124125750833b156101da5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af190811561240957506123fa575b505b565b612403906120ab565b5f6123f6565b513d5f823e3d90fd5b6001600160a01b039081168061245d575050833b156101da5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481016123e5565b8591959392933b156101da575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af190811561240957506123fa5750565b9091506020813d6020116124dd575b816124bd602093836120bf565b810103126101da57516001600160a01b03811681036101da57905f6123aa565b3d91506124b0565b814710612526575f8080808585617530f1156124ff575050565b601691600b915f526073825360ff602053f01561251857565b620f42405a116123f8575f80fd5b63b12d13eb5f526004601cfd5b5f546001600160a01b0316330361254657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f908152600360205260409020600181018054929391926001600160501b03164210156101da5780546affffffffffffffffffffff60501b191660509490941b600160501b600160a81b0316939093178355600292612629916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b0155565b9161ffff926001600160601b036123f8959316906001600160601b03199060601b16179060018060a01b03168061268d575b505f908152600360205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600360205260405f20906001600160601b0360a01b8254161790555f61265f565b6001600160601b03918219928391169160601b16176126cf81612288565b156127e4575b604080516126e28161208f565b5f8082526020808301828152848401838152606085018481526080860185815260a080880187815260c089018881528b895260039097529689902097519451935160b01b6001600160b01b03191661ffff60a01b9490911b939093166001600160a01b0390941693909317919091178555519051925160a81b6001600160a81b0319166001600160501b0390911660509390931b600160501b600160a81b031692909217919091176001830155600290519101558051926127a28461205f565b5f84526bffffffffffffffffff00000062ffffff60208601935f8552808701955f87525f5260046020525f20955116925160181b16925160601b169117179055565b805f5260046020526040805f208151906127fd8261205f565b549062ffffff821681526001600160481b038260181c169182602083015260601c928391015280612830575b50506126d5565b612839916124e5565b5f80612829565b906001600160601b039093929316906001600160601b03199060601b16175f52600360205260405f209060018201926001600160501b0392838554164210156101da578282116101da5780546001600160b01b031691841660b01b6001600160b01b031916919091179055166001600160501b0319825416179055565b906001600160601b0390989794959692939816906001600160601b03199060601b161791825f5260036020526001600160501b039586600160405f200154166101da578815612a13575b8691829161ffff906001600160581b03988997886040519e8f9061292a8261208f565b600160a01b600190038095168252866020830196168652886040830198168852606082019e8f91169052608001981688528d8960a082019b168b5260c0019c8d525f52600360205260405f209c51166001600160601b0360a01b8d5416178c5551166129ae908b9081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5189546001600160b01b0316911660b01b6001600160b01b0319161788559451905192519190921660501b600160501b600160a81b0316919093166001600160501b0316176001600160a81b03199190921660a81b1617600183015551600290910155565b959750879561290756feb2790cfbb501cb5d139a6d2e6b8157f1e9fc7043f1354b6645d9accfa9d95582a26469706673582212207b568fd88a52efd91227c1a1c0a23b2d7b5c65bc48a8a165e2895d1b65529a5264736f6c63430008170033
Deployed Bytecode
0x6102e0806040526004361015610013575f80fd5b5f3560e01c9081630254837614611ed05750806302ffbaba14611ce857806308a0f32f14611a6d5780630b2a16f114611a345780631033a6631461166b5780631107a8fc146115e857806316c38b3c146115a35780631ae03271146115065780631c31f710146114c357806327327ba0146114675780632c104a92146114495780632e993611146110e757806337fee6251461104e57806338af3eed14611026578063454a2ab314610d20578063469847fd14610a0e57806355808c741461074857806359aab242146107135780635c975abb146106ee5780637100dd87146106aa578063715018a6146106535780638624e7df1461060d5780638c77cc09146105e75780638da5cb5b146105c0578063919e84f51461058a578063930e79f11461056c57806395657db01461054c578063ba6646be14610403578063c62182041461036c578063cc14394c1461031c578063e361c5a8146102f6578063e71f7b15146102ce578063ecee4c9d1461029f578063f2fde38b146101de5763f5d8d7ba1461019e575f80fd5b346101da5760203660031901126101da576001600160a01b036101bf611f47565b165f526001602052602061ffff60405f205416604051908152f35b5f80fd5b346101da5760203660031901126101da576101f7611f47565b6101ff612533565b6001600160a01b0390811690811561024b575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101da5760403660031901126101da576102cc6102bb611f47565b6102c3612533565b602435906126b1565b005b346101da5760203660031901126101da5760206102ec60043561232d565b6040519015158152f35b346101da5760203660031901126101da576020610314600435612303565b604051908152f35b346101da576101203660031901126101da576102cc610339611f47565b610341611f5d565b9061034a612533565b610104359160e4359160c4359160a435916064359060443590602435906128bd565b346101da576101203660031901126101da57610386611f47565b60243567ffffffffffffffff81116101da576103a6903690600401611f16565b91906044356064356103b6611f5d565b60a43560c4359160e4359361010435956103ce612533565b5f5b8a81106103d957005b806103fd8989898f8f8f898c926103f68f959b60019c8f9561203b565b35906128bd565b016103d0565b346101da5760a03660031901126101da5767ffffffffffffffff6004358181116101da57610435903690600401611f16565b6024929192358281116101da57610450903690600401611f16565b6044358481116101da57610468903690600401611f16565b94906064358281116101da57610482903690600401611f16565b9590926084359081116101da5761049d903690600401611f16565b6104a8959195612533565b81831480610543575b8061053a575b80610531575b6104c690612230565b5f5b8381106104d157005b8061052b8989898f8f8f978961051d828f959b8f8f6105249760019f858093610509610504836105169861050f9661203b565b612274565b9f61203b565b359961203b565b359761203b565b359561203b565b359361258a565b016104c8565b508781146104bd565b508789146104b7565b508882146104b1565b346101da5760203660031901126101da57602060405160043560601c8152f35b346101da5760203660031901126101da5760206103146004356122bf565b346101da5760203660031901126101da576004355f52600360205260206001600160501b03600160405f20015416604051908152f35b346101da575f3660031901126101da575f546040516001600160a01b039091168152602090f35b346101da5760203660031901126101da5760206040516001600160601b03600435168152f35b346101da5760803660031901126101da57610626611f47565b604435906001600160a01b03821682036101da576102cc91610646612533565b606435916024359061262d565b346101da575f3660031901126101da5761066b612533565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101da5760403660031901126101da5760206106c5611f47565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101da575f3660031901126101da57602060ff60025460a01c166040519015158152f35b346101da5760803660031901126101da576102cc61072f611f47565b610737612533565b606435906044359060243590612840565b346101da576101203660031901126101da5767ffffffffffffffff6004358181116101da5761077b903690600401611f16565b60c052610140526024358181116101da5761079a903690600401611f16565b61020052610180526044358181116101da576107ba903690600401611f16565b6101e052610100526064358181116101da576107da903690600401611f16565b610240526101a0526084358181116101da576107fa903690600401611f16565b6102c05260a05260a4358181116101da57610819903690600401611f16565b6102605260e05260c4358181116101da57610838903690600401611f16565b610280526101205260e4358181116101da57610858903690600401611f16565b6102a05261016052610104359081116101da57610879903690600401611f16565b610220526101c052610889612533565b6102005160c05114806109ff575b806109f0575b806109e1575b806109d2575b806109c3575b806109b4575b806109a5575b6108c490612230565b5f6080525b60c051608051106108d657005b6109976108ee61050460805160c0516101405161203b565b610901608051610200516101805161203b565b356109156080516101e0516101005161203b565b35610929608051610240516101a05161203b565b3561093f6105046080516102c05160a05161203b565b6109516080516102605160e05161203b565b3591610966608051610280516101205161203b565b359361097b6080516102a0516101605161203b565b3595610990608051610220516101c05161203b565b35976128bd565b6001608051016080526108c9565b50610220516102a051146108bb565b506102a05161028051146108b5565b506102805161026051146108af565b50610260516102c051146108a9565b506102c05161024051146108a3565b50610240516101e0511461089d565b506101e0516102005114610897565b60203660031901126101da5760043567ffffffffffffffff81116101da57610a3a903690600401611f16565b90610a4d60ff60025460a01c16156121b1565b5f9182918291426201517f1901905b808410610ac15785853403610a7c5780610a7257005b6102cc90336124e5565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610ad085838661203b565b3594855f52600360205260405f2060405190610aeb8261208f565b805460018060a01b038116835261ffff8160a01c16602084015260b01c9081604084015260018101549160026001600160501b038416928360608701526001600160581b038560501c1660808701528460a81c60a0870152015460c08501524210908115610d15575b508015610d01575b610cdc57428611610cc857610cb0610cb692610c136001968b5f5260036020528760405f20016001600160501b038b166001600160501b0319825416179055604051610ba78161205f565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c169061212d565b99610c1e8133612375565b6040514281526001600160581b038560501c1660208201526001600160601b038216915f80516020612a1e83398151915260408260601c93a461ffff6020820151168015610cbf575b612710610c83610c94926001600160581b038760501c1661213a565b048092888060a01b039051166124e5565b6001600160581b03868060a01b03600254169360501c1661214d565b906124e5565b01929190610a5c565b50611d4c610c67565b634e487b7160e01b5f52601160045260245ffd5b6001939750610cfb929891506001600160581b039060501c169061212d565b95610cb6565b506001600160581b038160501c1615610b5c565b90504210158a610b54565b6020806003193601126101da5760043590610d4360ff60025460a01c16156121f0565b815f5260038152600260405f206001810180546001600160501b03808083161461100e575b5050500154610d768361232d565b908115610ff1575b5080610fd9575b15610fa257815f526004815260405f209160405192610da38461205f565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610f99576103e8905b612710918201808311610cc857610dfb9161213a565b0434101580610f87575b15610f4c575f95815f9851169483610e1c886122bf565b92511680610f36575b505061025880610e35428461214d565b10610f01575b5050806bffffffffffffffffff0000009160405195610e598761205f565b168552838501923416835260046040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610eee42343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610ef857005b6102cc916124e5565b949194420191824211610cc857610f28610f2e926bffffffffffffffffff0000009461214d565b9061212d565b939088610e3b565b90516001600160a01b0316985096508880610e25565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610f9185612303565b341015610e05565b6107d090610de5565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526003815260405f205460b01c421015610d85565b801515915081611003575b5083610d7e565b905034101583610ffc565b4216906001600160501b031916179055848080610d68565b346101da575f3660031901126101da576002546040516001600160a01b039091168152602090f35b346101da5761105c36611fbe565b959661106d95949593929193612533565b858814806110de575b806110d5575b61108590612230565b5f5b88811061109057005b806110cf6110a46105046001948d8761203b565b8a6110b0848c8c61203b565b356110c8856110c0818b8d61203b565b35938c61203b565b3592612840565b01611087565b5081871461107c565b50818614611076565b6020806003193601126101da5760043590815f526004815260405f20604051906111108261205f565b5462ffffff811682526001600160481b03604084840193828460181c168552019160601c8252845f526003845260405f206040519561114e8761208f565b81549260018060a01b03958685168952600261ffff94898b0196868160a01c16885260b01c60408c015260018101546001600160501b03811660608d01526001600160581b038160501c1660808d015260a81c60a08c0152015460c08a01526111be6111b984612288565b6120e1565b511695861561141e576040906111d78388885116612375565b8260601c93806001600160601b038516968787878d885190428252888201525f80516020612a1e833981519152988991a45116968715611414575b80516040516370a0823160e01b808252918b1660048201528481602481739cf0ab1cc434db83097b7e9c831a764481dec7475afa9081156113dc575f916113e7575b508a8351166040519283526004830152848260248173a8a425864db32fcbb459bf527bdbb8128e6abf215afa9081156113dc575f916113ab575b611298925061212d565b898251169081151591826113a1575b82611388575b50506112f6575b50508695610cb097956112ec956102cc9b956127109560406112e1968e825191428352820152a48861213a565b0493849151166124e5565b600254169261214d565b92919993949897969095600a8902898104600a148a151715610cc85760646113209104809a61214d565b99888551165f5260018c5260405f209687549460018a87160199808b11610cc8576102cc9e8e611373610cb09f8f9e8f909c6112ec9f6112e19d6127109f98604099169061ffff191617905551166124e5565b509650509550959b50955095978197506112b4565b9091505f52600184528260405f20541611158c806112ad565b81151592506112a7565b90508482813d83116113d5575b6113c281836120bf565b810103126101da5761129891519061128e565b503d6113b8565b6040513d5f823e3d90fd5b90508481813d831161140d575b6113fe81836120bf565b810103126101da57518d611254565b503d6113f4565b611d4c9750611212565b955061143361142c82612303565b341461215a565b6040349661144483885f5416612375565b6111d7565b346101da5760203660031901126101da5760206102ec600435612288565b346101da5761147536611f73565b90611481939293612533565b61148c828514612230565b5f5b84811061149757005b806114bd6114ab610504600194898961203b565b6114b683878761203b565b35906126b1565b0161148e565b346101da5760203660031901126101da576114dc611f47565b6114e4612533565b600280546001600160a01b0319166001600160a01b0392909216919091179055005b346101da5761151436611fbe565b959493909291611522612533565b8186148061159a575b80611591575b61153a90612230565b5f5b86811061154557005b8061158b878a87611584858f6105048f998b611576828f61157060019f836105049161157d9a61203b565b9b61203b565b359661203b565b938c61203b565b359261262d565b0161153c565b50808714611531565b5080821461152b565b346101da5760203660031901126101da576004358015158091036101da576115c9612533565b6002805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101da5760203660031901126101da576004355f52600360205260e060405f2080549060026001820154910154906040519260018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b03811660608401526001600160581b038160501c16608084015260a81c60a083015260c0820152f35b61167436611f73565b92919061168960ff60025460a01c16156121f0565b8382036101da575f935f925f5b8181106116f157868534036116ac5780610a7257005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6116fc81838861203b565b359061171461170c82868861203b565b35809761212d565b95825f5260038060205260405f206040519161172f8361208f565b815460018060a01b038116845261ffff8160a01c16602085015260b01c60408401526001600160501b0360019260028482015491838316928360608901526001600160581b038160501c16608089015260a81c60a0880152015460c086015214611a09575b505061179f8461232d565b80156119e8575b159081156119d1575b506119c357825f52600460205260405f2092604051936117ce8561205f565b5462ffffff811685526001600160481b038160181c169081602087015260601c60408601526702c68af0bb1400008110155f146119ba576103e8905b612710918201808311610cc8576118209161213a565b04821015806119a8575b15611993575f905f9262ffffff865116611843836122bf565b966001600160481b0360208201511680611979575b50506102589687611869428361214d565b10611958575b506001965062ffffff604051916118858361205f565b168152602081016001600160481b03831681526040820190338252845f5260046020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b03821693806119368460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a480611948575b50505b01611696565b611951916124e5565b888061193f565b908742014211610cc857610f2861197392600199420161214d565b8d61186f565b6040909101516001600160a01b0316955093508d80611858565b50600192506119a2919861212d565b96611942565b506119b281612303565b82101561182a565b6107d09061180a565b600192506119a2919861212d565b6001600160501b039150604001511642108a6117af565b5060c081015180151590816119fe575b506117a6565b90508210158b6119f8565b855f5260205260405f20016001600160501b0342166001600160501b03198254161790558a80611794565b346101da5760a03660031901126101da576102cc611a50611f47565b611a58612533565b6084359060643590604435906024359061258a565b6020806003193601126101da5760043590815f526003815260405f2090604051611a968161208f565b82549060018060a01b0391828116825261ffff9184810192808360a01c168452604082019260b01c83526001870154966001600160501b03809460026060860193838c1685526001600160581b038c60501c169b8c608089015260a81c60a0880152015460c0860152611b1160ff60025460a01c16156121b1565b51164210611cac5783429151161115611c675786151580611c5e575b15611c23576201517f19420193428511610cc85788610cb09787966112ec966102cc9c5f5260038352600160405f200191166001600160501b0319825416179055604051611b7a8161205f565b5f81528181016001600160481b03341681526040820190338252845f52600484526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055611bd88233612375565b89604051914283528201526001600160601b038216915f80516020612a1e83398151915260408260601c93a451168015611c1a575b6112e1612710918861213a565b50611d4c611c0d565b60405162461bcd60e51b815260048101879052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b50863414611b2d565b60405162461bcd60e51b815260048101879052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b815260048101889052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b6020806003193601126101da5760043567ffffffffffffffff81116101da57611d15903690600401611f16565b5f92915f925f925b808410611d44576102cc85611d3388341461215a565b6002546001600160a01b03166124e5565b90919293611d5385838661203b565b35805f526004845260405f209060405191611d6d8361205f565b549062ffffff821683526001600160481b03868401818460181c16815260406060950193851c8452611da16111b984612288565b5116918215611e9657926001949282611dc9610f2894611e8397898060a01b03905116612375565b604051428152828a8201526001600160601b03821690825f80516020612a1e833981519152604082881c93a45f5260038852611e7e60405f2089600260405192611e128461208f565b80548b8060a01b0397888216865260a09161ffff81841c16809688015260b01c60408701528c830154906001600160501b038216908701526001600160581b038160501c16608087015260a81c90850152015460c08301528015611e8d575b6112e1612710918561213a565b61214d565b9401929190611d1d565b50611d4c611e71565b50976001939150611e8392610f2891611eb8611eb18c612303565b809261212d565b9a611ecb81888060a01b035f5416612375565b611dc9565b346101da5760203660031901126101da576060906004355f52600460205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101da5782359167ffffffffffffffff83116101da576020808501948460051b0101116101da57565b600435906001600160a01b03821682036101da57565b608435906001600160a01b03821682036101da57565b60406003198201126101da5767ffffffffffffffff916004358381116101da5782611fa091600401611f16565b939093926024359182116101da57611fba91600401611f16565b9091565b60806003198201126101da5767ffffffffffffffff906004358281116101da5781611feb91600401611f16565b939093926024358181116101da578361200691600401611f16565b939093926044358381116101da578261202191600401611f16565b939093926064359182116101da57611fba91600401611f16565b919081101561204b5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b6060810190811067ffffffffffffffff82111761207b57604052565b634e487b7160e01b5f52604160045260245ffd5b60e0810190811067ffffffffffffffff82111761207b57604052565b67ffffffffffffffff811161207b57604052565b90601f8019910116810190811067ffffffffffffffff82111761207b57604052565b156120e857565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b91908201809211610cc857565b81810292918115918404141715610cc857565b91908203918211610cc857565b1561216157565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b156121b857565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b156121f757565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b1561223757565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101da5790565b805f5260036020526122aa6001600160501b03600160405f20015416916122bf565b90151590816122b7575090565b905042101590565b805f5260036020526001600160501b03600160405f20015416620151808101809111610cc857612300915f52600460205262ffffff60405f2054169061212d565b90565b5f9081526003602052604090206001015460a81c80156123205790565b5067016345785d8a000090565b805f52600360205261234f6001600160501b03600160405f20015416916122bf565b811515918261236a575b5081612363575090565b9050421090565b42101591505f612359565b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa5f91816124a1575b506124125750833b156101da5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af190811561240957506123fa575b505b565b612403906120ab565b5f6123f6565b513d5f823e3d90fd5b6001600160a01b039081168061245d575050833b156101da5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481016123e5565b8591959392933b156101da575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af190811561240957506123fa5750565b9091506020813d6020116124dd575b816124bd602093836120bf565b810103126101da57516001600160a01b03811681036101da57905f6123aa565b3d91506124b0565b814710612526575f8080808585617530f1156124ff575050565b601691600b915f526073825360ff602053f01561251857565b620f42405a116123f8575f80fd5b63b12d13eb5f526004601cfd5b5f546001600160a01b0316330361254657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f908152600360205260409020600181018054929391926001600160501b03164210156101da5780546affffffffffffffffffffff60501b191660509490941b600160501b600160a81b0316939093178355600292612629916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b0155565b9161ffff926001600160601b036123f8959316906001600160601b03199060601b16179060018060a01b03168061268d575b505f908152600360205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600360205260405f20906001600160601b0360a01b8254161790555f61265f565b6001600160601b03918219928391169160601b16176126cf81612288565b156127e4575b604080516126e28161208f565b5f8082526020808301828152848401838152606085018481526080860185815260a080880187815260c089018881528b895260039097529689902097519451935160b01b6001600160b01b03191661ffff60a01b9490911b939093166001600160a01b0390941693909317919091178555519051925160a81b6001600160a81b0319166001600160501b0390911660509390931b600160501b600160a81b031692909217919091176001830155600290519101558051926127a28461205f565b5f84526bffffffffffffffffff00000062ffffff60208601935f8552808701955f87525f5260046020525f20955116925160181b16925160601b169117179055565b805f5260046020526040805f208151906127fd8261205f565b549062ffffff821681526001600160481b038260181c169182602083015260601c928391015280612830575b50506126d5565b612839916124e5565b5f80612829565b906001600160601b039093929316906001600160601b03199060601b16175f52600360205260405f209060018201926001600160501b0392838554164210156101da578282116101da5780546001600160b01b031691841660b01b6001600160b01b031916919091179055166001600160501b0319825416179055565b906001600160601b0390989794959692939816906001600160601b03199060601b161791825f5260036020526001600160501b039586600160405f200154166101da578815612a13575b8691829161ffff906001600160581b03988997886040519e8f9061292a8261208f565b600160a01b600190038095168252866020830196168652886040830198168852606082019e8f91169052608001981688528d8960a082019b168b5260c0019c8d525f52600360205260405f209c51166001600160601b0360a01b8d5416178c5551166129ae908b9081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5189546001600160b01b0316911660b01b6001600160b01b0319161788559451905192519190921660501b600160501b600160a81b0316919093166001600160501b0316176001600160a81b03199190921660a81b1617600183015551600290910155565b959750879561290756feb2790cfbb501cb5d139a6d2e6b8157f1e9fc7043f1354b6645d9accfa9d95582a26469706673582212207b568fd88a52efd91227c1a1c0a23b2d7b5c65bc48a8a165e2895d1b65529a5264736f6c63430008170033
Deployed Bytecode Sourcemap
261:21703:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;-1:-1:-1;;;;;261:21703:5;;:::i;:::-;;;;975:48;261:21703;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;:::i;:::-;1063:62:2;;:::i;:::-;-1:-1:-1;;;;;261:21703:5;;;;2162:22:2;;261:21703:5;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;2566:40:2;261:21703:5;2566:40:2;;261:21703:5;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;17698:7;261:21703;;:::i;:::-;1063:62:2;;:::i;:::-;261:21703:5;;17698:7;;:::i;:::-;261:21703;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;19055:11;261:21703;;:::i;:::-;;;:::i;:::-;1063:62:2;;;:::i;:::-;261:21703:5;;;;;;;;;;;;;;;;;;;;19055:11;;:::i;261:21703::-;;;;;;-1:-1:-1;;261:21703:5;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;1063:62:2;;;:::i;:::-;261:21703:5;17048:19;;;;;;261:21703;17069:3;17122:11;17272:12;17122:11;;;;;;;;;;;;;261:21703;17122:11;;;;:::i;:::-;261:21703;17272:12;;:::i;:::-;261:21703;17037:9;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:2;;;;;:::i;:::-;15630:37:5;;;:82;;;261:21703;15630:141;;;261:21703;15630:194;;;261:21703;15615:246;;;:::i;:::-;261:21703;15882:22;;;;;;261:21703;15906:3;15933:14;16003:18;15933:14;;;;;;;;15982:19;15933:14;;;;;;16003:18;15933:14;261:21703;15933:14;;;;;;;15962:18;15933:14;15949:11;15933:14;;:::i;:::-;;:::i;:::-;15949:11;;:::i;:::-;261:21703;15962:18;;:::i;:::-;261:21703;15982:19;;:::i;:::-;261:21703;16003:18;;:::i;:::-;261:21703;16003:18;;:::i;:::-;261:21703;15871:9;;15630:194;-1:-1:-1;15775:49:5;;;15630:194;;:141;15722:49;;;;15630:141;;:82;15671:41;;;;15630:82;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;21639:2;261:21703;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;21475:13;261:21703;;;-1:-1:-1;;;;;261:21703:5;;;;21475:41;261:21703;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;261:21703:5;;;;;;16227:5;1063:62:2;;;:::i;:::-;261:21703:5;;;;;16227:5;;:::i;261:21703::-;;;;;;-1:-1:-1;;261:21703:5;;;;1063:62:2;;:::i;:::-;261:21703:5;;;-1:-1:-1;;;;;;261:21703:5;;;;-1:-1:-1;;;;;261:21703:5;2566:40:2;261:21703:5;;2566:40:2;261:21703:5;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;:::i;:::-;;;20568:2;261:21703;;;;-1:-1:-1;;261:21703:5;;;-1:-1:-1;;;;;261:21703:5;20535:54;261:21703;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;1060:18;261:21703;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;17533:19;261:21703;;:::i;:::-;1063:62:2;;:::i;:::-;261:21703:5;;;;;;;;17533:19;;:::i;261:21703::-;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;1063:62:2;;:::i;:::-;19478:37:5;;;;;:83;;;261:21703;19478:144;;;261:21703;19478:190;;;261:21703;19478:231;;;261:21703;19478:271;;;261:21703;19478:324;;;261:21703;19478:371;;;261:21703;19463:423;;;:::i;:::-;261:21703;19896:9;;19907:22;;;;;;;;261:21703;19931:3;20157:15;19963:14;;;;;;;;;:::i;:::-;19987:11;;;;;;;;:::i;:::-;261:21703;20008:19;;;;;;;;:::i;:::-;261:21703;20037:20;;;;;;;;:::i;:::-;261:21703;20067:10;;;;;;;;;:::i;:::-;20087:9;;;;;;;;:::i;:::-;261:21703;20106:15;;;;;;;;;:::i;:::-;261:21703;20131:16;;;;;;;;;:::i;:::-;261:21703;20157:15;;;;;;;;;:::i;:::-;261:21703;20157:15;;:::i;:::-;261:21703;19931:3;;261:21703;19931:3;;19896:9;;19478:371;-1:-1:-1;19830:19:5;;19806:43;;;19478:371;;:324;19782:20;;;19759:43;;;19478:324;;:271;19730:19;;;19713:36;;;19478:271;;:231;19696:13;;;19678:31;;;19478:231;;:190;19654:14;;;19626:42;;;19478:190;;:144;19598:24;;;19571:51;;;19478:144;;:83;19538:23;;;19519:42;;;19478:83;;261:21703;;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;;;;;:::i;:::-;;7182:36;261:21703;7191:6;261:21703;;;;7190:7;7182:36;:::i;:::-;261:21703;;;;;;7487:15;-1:-1:-1;;776:6:5;;7285:21;;;;;;8501:9;;;8487:23;261:21703;;8551:15;8547:113;;261:21703;8547:113;8638:14;7854:10;;8638:14;:::i;261:21703::-;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;;;;;;;;7308:3;7341:13;;;;;;;;;:::i;:::-;261:21703;;;;;7392:13;261:21703;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7191:6;-1:-1:-1;;;;;261:21703:5;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;7487:15;:40;7486:97;;;;;7308:3;7486:125;;;;;7308:3;7473:210;;7487:15;776:6;;;;8420:29;8451:14;261:21703;7873:25;261:21703;;;;;7392:13;261:21703;;;;;;7691:41;-1:-1:-1;;;;;261:21703:5;;-1:-1:-1;;;;;559:8:5;;;;;;;261:21703;;;;;:::i;:::-;;;;7822:43;261:21703;7822:43;;-1:-1:-1;;;;;261:21703:5;;;;;;;7822:43;;7854:10;;261:21703;;;;;;;559:8;261:21703;;;;559:8;;261:21703;;;559:8;;;;-1:-1:-1;;;;;559:8:5;261:21703;;;559:8;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;7873:25;;:::i;:::-;7854:10;7924:9;7854:10;;7924:9;:::i;:::-;261:21703;;7487:15;261:21703;;-1:-1:-1;;;;;261:21703:5;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;-1:-1:-1;;;;;;;;;;;261:21703:5;;;;7948:160;;261:21703;;;;;;8157:10;;8153:56;;7308:3;8264:6;8242:19;8347:14;261:21703;-1:-1:-1;;;;;261:21703:5;;;;8242:19;:::i;:::-;445:5;261:21703;;;;;;;;;;8347:14;:::i;:::-;-1:-1:-1;;;;;261:21703:5;;;;;7191:6;261:21703;;;;;;8420:29;:::i;:::-;8451:14;;:::i;:::-;261:21703;7274:9;;;;;8153:56;-1:-1:-1;445:5:5;8153:56;;776:6;261:21703;;;;;;;;;;;7473:210;261:21703;;;;7630:26;261:21703;;;;-1:-1:-1;;;;;261:21703:5;;;;7630:26;;:::i;:::-;7666:8;;;7486:125;261:21703;-1:-1:-1;;;;;261:21703:5;;;;7595:16;7486:125;;:97;7487:15;;;-1:-1:-1;7540:42:5;7486:97;;;261:21703;;;;;;;;;;;;;1899:37;261:21703;1908:6;261:21703;;;;1907:7;1899:37;:::i;:::-;261:21703;;;1947:13;261:21703;;1908:6;261:21703;;;;1947:41;;261:21703;;-1:-1:-1;;;;;261:21703:5;;;;1947:61;1943:149;;261:21703;2120:36;;;;261:21703;2188:26;;;:::i;:::-;:83;;;;;261:21703;2178:164;;;;261:21703;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;391:9;2466:43;;;:96;391:9;;;725:5;2466:96;;331:6;261:21703;;;;;;;;2598:39;;;:::i;:::-;445:5;2584:9;:60;;:106;;;2466:96;261:21703;;;;2758:20;;261:21703;559:8;;261:21703;2849:28;;;;;:::i;:::-;261:21703;;;2888:21;2884:114;;2466:96;496:10;;;3018:15;3008:25;3018:15;3008:25;;:::i;:::-;:42;3004:115;;2466:96;261:21703;;;559:8;261:21703;;;;;;;:::i;:::-;;;;3157:54;;;2584:9;;261:21703;;;;;3157:54;;3200:10;;261:21703;;;;;;;;;559:8;;261:21703;;;;559:8;;;-1:-1:-1;;;;;559:8:5;261:21703;;;559:8;;;;;;;261:21703;;-1:-1:-1;;;;;261:21703:5;;;3223:164;261:21703;;;3018:15;;3223:164;3018:15;2584:9;3200:10;3223:164;496:10;;;;;;;;261:21703;;;;;;;;;496:10;;;261:21703;496:10;261:21703;496:10;3223:164;;;;3398:16;3394:117;;261:21703;3394:117;3489:14;;;:::i;3004:115::-;3018:15;;;;261:21703;3018:15;;;261:21703;;;3070:42;3060:52;3070:42;559:8;3070:42;;:::i;:::-;3060:52;;:::i;:::-;3004:115;;;;;2884:114;261:21703;;-1:-1:-1;;;;;261:21703:5;;-1:-1:-1;2919:32:5;-1:-1:-1;2884:114:5;;;;261:21703;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;2584:106;2667:23;;;;:::i;:::-;2584:9;2654:36;;2584:106;;2466:96;667:5;2466:96;;;261:21703;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;2178:164;261:21703;;;;1947:13;261:21703;;;;;;;;2283:15;:59;;2178:164;;2188:83;2227:15;;;;-1:-1:-1;2227:15:5;:43;;2188:83;;;;;2227:43;2246:9;;;:24;;2227:43;;;1943:149;2069:15;261:21703;559:8;-1:-1:-1;;;;;559:8:5;;;;;1943:149;;;;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;1030:26;261:21703;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;:::i;:::-;1063:62:2;;;;;;;;;;;:::i;:::-;18270:37:5;;;:86;;;261:21703;18270:153;;;261:21703;18255:205;;;:::i;:::-;261:21703;18481:22;;;;;;261:21703;18505:3;18530:14;18583:23;18530:14;;261:21703;18530:14;;;;:::i;:::-;18546:11;;;;;;:::i;:::-;261:21703;18583:23;18559:22;;;;;;:::i;:::-;261:21703;18583:23;;;:::i;:::-;261:21703;18583:23;;:::i;:::-;261:21703;18470:9;;18270:153;-1:-1:-1;18366:57:5;;;18270:153;;:86;18311:45;;;;18270:86;;261:21703;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;8834:13;261:21703;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;8864:60;8872:24;;;:::i;:::-;8864:60;:::i;:::-;261:21703;;;8980:15;;;;261:21703;;9030:9;261:21703;;;;;9030:9;:::i;:::-;261:21703;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;9335:15;;261:21703;;;;;;-1:-1:-1;;;;;;;;;;;9227:148:5;;;;261:21703;;9420:10;;;9416:52;;8976:240;261:21703;;;;-1:-1:-1;;;9507:40:5;;;261:21703;;;;9507:40;;261:21703;9507:40;261:21703;;;833:42;9507:40;;;;;;;261:21703;9507:40;;;8976:240;261:21703;;;;;;;9588:41;;;261:21703;9588:41;;261:21703;9588:41;;261:21703;9588:41;928:42;9588:41;;;;;;;261:21703;9588:41;;;8976:240;9664:50;;;;:::i;:::-;261:21703;;;;9732:31;;;;:56;;;;8976:240;9732:120;;;8976:240;9721:368;;;;8976:240;261:21703;;;;10459:29;261:21703;;10388:14;261:21703;10490:14;261:21703;;10307:6;261:21703;;10285:19;261:21703;;;;9335:15;;261:21703;;;;;10104:148;10285:19;;:::i;:::-;445:5;261:21703;;;;;10388:14;:::i;:::-;261:21703;;;10459:29;;:::i;9721:368::-;445:5;;;;;;;;;;9899:2;445:5;;;;;9899:2;445:5;;;;;;;9904:3;9929:20;445:5;;9929:20;;;:::i;:::-;261:21703;;;;;;;;;;;;;920:51;;;261:21703;;;;;920:51;;;;;;;10490:14;261:21703;;10067:14;10459:29;261:21703;;;;;;10388:14;261:21703;10285:19;261:21703;10307:6;261:21703;;;;;920:51;;;;;;;261:21703;;10067:14;:::i;:::-;9721:368;;;;;;;;;;;;;;;;;;9732:120;261:21703;;;;;;;;;;;;920:51;261:21703;-1:-1:-1;9798:54:5;9732:120;;;;:56;9767:21;;;;-1:-1:-1;9732:56:5;;9588:41;;;;;;;;;;;;;;;;:::i;:::-;;;825:51;;;;9664:50;825:51;;9588:41;;;;;;;;;261:21703;;825:51;261:21703;825:51;;;;;9507:40;;;;;;;;;;;;;;;;:::i;:::-;;;825:51;;;;;9507:40;;;;;;;;9416:52;445:5;;-1:-1:-1;9416:52:5;;8976:240;9082:23;;9061:83;9082:23;;;:::i;:::-;9069:9;:36;9061:83;:::i;:::-;261:21703;9069:9;261:21703;9199:9;261:21703;;;;;9199:9;:::i;:::-;8976:240;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;1063:62:2;;;;;;:::i;:::-;17836:89:5;17851:37;;;17836:89;:::i;:::-;261:21703;17946:22;;;;;;261:21703;17970:3;17997:14;18013:11;17997:14;;261:21703;17997:14;;;;:::i;:::-;18013:11;;;;;:::i;:::-;261:21703;18013:11;;:::i;:::-;261:21703;17935:9;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;;;:::i;:::-;1063:62:2;;:::i;:::-;20274:26:5;261:21703;;-1:-1:-1;;;;;;261:21703:5;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:2;;;;;;;;:::i;:::-;16447:37:5;;;:74;;;261:21703;16447:115;;;261:21703;16432:167;;;:::i;:::-;261:21703;16620:22;;;;;;261:21703;16644:3;16670:14;16711:9;16670:14;;;16711:9;16670:14;;16699:10;16670:14;;;16686:11;16670:14;;;261:21703;16670:14;;;;16699:10;16670:14;;:::i;:::-;16686:11;;:::i;:::-;261:21703;16699:10;;:::i;:::-;16711:9;;;:::i;:::-;261:21703;16711:9;;:::i;:::-;261:21703;16609:9;;16447:115;-1:-1:-1;16531:31:5;;;16447:115;;:74;16488:33;;;;16447:74;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;1063:62:2;;:::i;:::-;20375:16:5;261:21703;;-1:-1:-1;;;;261:21703:5;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;1371:54;261:21703;;;;;;;;1371:54;;261:21703;1371:54;;261:21703;1371:54;;261:21703;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;3638:37;261:21703;3647:6;261:21703;;;;3646:7;3638:37;:::i;:::-;3689:41;;;261:21703;;;3759:21;261:21703;3790:9;261:21703;3801:20;;;;;;5732:9;;;:26;496:10;;5801:15;5797:113;;261:21703;496:10;261:21703;;-1:-1:-1;;;496:10:5;;261:21703;;496:10;;;;;;;261:21703;496:10;261:21703;;;496:10;;;;3823:3;3856:12;;;;;:::i;:::-;261:21703;3900:17;3925:30;3900:17;;;;;:::i;:::-;261:21703;3925:30;;;:::i;:::-;261:21703;;;;3993:13;261:21703;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;3647:6;261:21703;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;4030:43;4026:135;;3823:3;4195:26;;;;;:::i;:::-;:103;;;;3823:3;4182:126;261:21703;;;4182:170;;3823:3;4169:257;;;261:21703;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;391:9;4521:43;;;:98;391:9;;;725:5;4521:98;;331:6;261:21703;;;;;;;;4659:39;;;:::i;:::-;445:5;4641:64;;;:116;;;4521:98;4628:1084;;;261:21703;4806:20;261:21703;559:8;261:21703;559:8;;261:21703;4905:28;;;:::i;:::-;261:21703;-1:-1:-1;;;;;261:21703:5;;;;;4948:21;4944:126;;4628:1084;496:10;;;5094:15;;5084:25;5094:15;5084:25;;:::i;:::-;:42;5080:123;;4628:1084;261:21703;;;;;;;;;;;:::i;:::-;;;;;5245:58;;-1:-1:-1;;;;;261:21703:5;;;;;5245:58;;5292:10;;261:21703;;;;;;;;559:8;261:21703;;;;559:8;;261:21703;;;;559:8;;;-1:-1:-1;;;;;559:8:5;261:21703;;;559:8;;;;;;;261:21703;;;5319:196;-1:-1:-1;;;;;261:21703:5;;;;5319:196;261:21703;;;5094:15;;5292:10;;5319:196;496:10;;;;;;;;261:21703;;;;;;;;;496:10;;;261:21703;496:10;261:21703;496:10;5319:196;;;;5530:16;5526:125;;4628:1084;;;;261:21703;3790:9;;5526:125;5625:14;;;:::i;:::-;5526:125;;;;5080:123;5094:15;;;261:21703;5094:15;261:21703;;;5150:42;5140:52;5094:15;261:21703;5094:15;;261:21703;5150:42;:::i;5140:52::-;5080:123;;;4944:126;261:21703;;;;;-1:-1:-1;;;;;261:21703:5;;-1:-1:-1;4983:32:5;-1:-1:-1;4944:126:5;;;;4628:1084;5675:28;261:21703;5675:28;;;;;;:::i;:::-;4628:1084;;;4641:116;4734:23;;;;:::i;:::-;4717:40;;;4641:116;;4521:98;667:5;4521:98;;;4169:257;261:21703;4371:28;;;;;;:::i;4182:170::-;-1:-1:-1;;;;;261:21703:5;;;;;;4312:15;:40;4182:170;;;4195:103;261:21703;;;;;4236:22;;;:61;;;;4195:103;;;;4236:61;4262:35;;;;;4236:61;;;4026:135;261:21703;;;;;;;;4085:41;-1:-1:-1;;;;;4136:15:5;261:21703;-1:-1:-1;;;;;559:8:5;;;;;;;4026:135;;;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;15342:14;261:21703;;:::i;:::-;1063:62:2;;:::i;:::-;261:21703:5;;;;;;;;;;;15342:14;;:::i;261:21703::-;;;;;;;;;;;;;;;;6014:13;261:21703;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;6090:36;261:21703;;;;;;6098:7;6090:36;:::i;:::-;261:21703;;6140:15;:41;261:21703;;6140:15;;261:21703;;;6220:41;261:21703;;;6304:16;;;:44;;;261:21703;;;;776:6;;6140:15;776:6;6140:15;;776:6;;;;261:21703;7041:29;261:21703;;;6970:14;261:21703;7072:14;261:21703;;;6014:13;261:21703;;;;;;6379:41;261:21703;;-1:-1:-1;;;;;559:8:5;;;;;;;261:21703;;;;;:::i;:::-;;;;6508:41;;;-1:-1:-1;;;;;6526:9:5;261:21703;;;;6508:41;;6538:10;;261:21703;;;;;;;;559:8;261:21703;;;;559:8;;261:21703;;;559:8;;;;-1:-1:-1;;;;;559:8:5;261:21703;;;559:8;;;;;;;6573:9;6538:10;;6573:9;:::i;:::-;261:21703;;;6140:15;;261:21703;;;;;-1:-1:-1;;;;;261:21703:5;;;-1:-1:-1;;;;;;;;;;;261:21703:5;;;;6595:148;;261:21703;;6788:10;;6784:52;;261:21703;6867:19;6889:6;6867:19;;;:::i;6784:52::-;-1:-1:-1;445:5:5;6784:52;;261:21703;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;6304:44;6324:9;;;:24;6304:44;;261:21703;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10608:21;;261:21703;10663:9;261:21703;10658:1035;10674:21;;;;;;11843:14;11707:9;11699:73;11707:9;;:26;11699:73;:::i;:::-;261:21703;;-1:-1:-1;;;;;261:21703:5;11843:14;:::i;10697:3::-;10730:13;;;;;;;;;:::i;:::-;261:21703;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;10816:60;10824:24;;;:::i;10816:60::-;261:21703;;;10936:15;;;;261:21703;;;;;10988:9;11657:29;261:21703;11640:46;261:21703;;;;;;;;;10988:9;:::i;:::-;261:21703;;11271:15;261:21703;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;-1:-1:-1;;;;;;;;;;;261:21703:5;;;;11155:160;;261:21703;;11354:13;261:21703;;11616:14;261:21703;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;11386:28;11426:10;11422:56;;10932:210;11511:19;11533:6;11511:19;;;:::i;11616:14::-;11657:29;:::i;11640:46::-;10697:3;261:21703;10663:9;;;;;11422:56;-1:-1:-1;445:5:5;11422:56;;10932:210;11037:23;;261:21703;11037:23;;;11640:46;11037:23;11657:29;11037:23;11070:28;11037:23;;;:::i;:::-;11070:28;;;:::i;:::-;261:21703;11123:9;261:21703;;;;;;;;;11123:9;:::i;:::-;10932:210;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;261:21703:5;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;261:21703:5;;;;;;:::o;:::-;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;-1:-1:-1;;261:21703:5;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;445:5::-;;;;;;;;;;;;;;;;:::o;776:6::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;261:21703;;-1:-1:-1;;;776:6:5;;;;;;;;;;;261:21703;776:6;261:21703;;;776:6;-1:-1:-1;;;776:6:5;;;;;;;261:21703;;;;:::o;:::-;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;261:21703:5;;;;;;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;:::o;20894:259::-;261:21703;-1:-1:-1;261:21703:5;20997:13;261:21703;;21062:28;-1:-1:-1;;;;;20997:41:5;261:21703;-1:-1:-1;261:21703:5;20997:41;261:21703;;21062:28;;:::i;:::-;21104:13;;;:43;;;;21096:52;20894:259;:::o;21104:43::-;21121:15;;;:26;;20894:259;:::o;21157:213::-;261:21703;-1:-1:-1;261:21703:5;21254:13;261:21703;;-1:-1:-1;;;;;21254:41:5;261:21703;-1:-1:-1;261:21703:5;21254:41;261:21703;;559:8;261:21703;;;;;;;21254:111;261:21703;-1:-1:-1;261:21703:5;21322:18;261:21703;;;;-1:-1:-1;261:21703:5;;;21254:111;;:::i;:::-;21157:213;:::o;21772:190::-;-1:-1:-1;261:21703:5;;;21875:13;261:21703;;;;;21875:37;;261:21703;;;21925:12;;;;21772:190;:::o;21925:32::-;;606:9;21772:190;:::o;20598:292::-;261:21703;-1:-1:-1;261:21703:5;20703:13;261:21703;;20768:28;-1:-1:-1;;;;;20703:41:5;261:21703;-1:-1:-1;261:21703:5;20703:41;261:21703;;20768:28;;:::i;:::-;20810:13;;;:45;;;;20598:292;20810:74;;;;20802:83;20598:292;:::o;20810:74::-;20859:15;;;:25;20598:292;:::o;20810:45::-;20827:15;:28;;;-1:-1:-1;20810:45:5;;;11867:475;-1:-1:-1;;;;;261:21703:5;21639:2;261:21703;;;;;;;;825:51;;;12055:33;;;;;;261:21703;12055:33;;261:21703;12055:33;;;;-1:-1:-1;;12055:33:5;;;11867:475;-1:-1:-1;12051:287:5;;12297:34;;;;;;261:21703;;-1:-1:-1;;;12297:34:5;;-1:-1:-1;;;;;261:21703:5;;;12055:33;12297:34;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;-1:-1:-1;261:21703:5;;;;12297:34;;;;;;;;;;;;;12051:287;;;11867:475::o;12297:34::-;;;;:::i;:::-;;;;;261:21703;825:51;-1:-1:-1;825:51:5;;;;;12051:287;-1:-1:-1;;;;;261:21703:5;;;12126:20;261:21703;;12158:34;;;;;;;261:21703;;-1:-1:-1;;;12158:34:5;;-1:-1:-1;;;;;261:21703:5;;;12055:33;12158:34;;261:21703;;;;;;-1:-1:-1;;261:21703:5;;;-1:-1:-1;261:21703:5;;;;12158:34;261:21703;12122:154;12217:50;;;;;;;;;;-1:-1:-1;261:21703:5;;;;;;825:51;;;;;;;;12217:50;;12055:33;12217:50;;261:21703;;;;;;;;;;12217:50;;;;;;;;;;12122:154;11867:475::o;12055:33::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;261:21703;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;12055:33;;;;;;;-1:-1:-1;12055: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:21703:5;-1:-1:-1;;;;;261:21703:5;719:10:3;1422:23:2;261:21703:5;;1359:130:2:o;261:21703:5:-;;;;;;;;;;;;;;;;;;;;;;;;;12361:521;20568:2;261:21703;-1:-1:-1;;261:21703:5;-1:-1:-1;;;;;261:21703:5;;;20535:54;-1:-1:-1;261:21703:5;;;12621:13;261:21703;;;;;12621:41;;;261:21703;;12361:521;;261:21703;;-1:-1:-1;;;;;261:21703:5;12665:15;-1:-1:-1;261:21703:5;;;;;-1:-1:-1;;;;261:21703:5;;;;;;-1:-1:-1;;;;;;;261:21703:5;;;;;;;12824:36;;12755:63;;-1:-1:-1;;;;;261:21703:5;;;-1:-1:-1;;;;;261:21703:5;;;;;-1:-1:-1;;;;;;261:21703:5;;;;;12755:63;12824:36;261:21703;12361:521::o;12886:348::-;;261:21703;12886:348;-1:-1:-1;;;;;13180:49:5;12886:348;;261:21703;559:8;-1:-1:-1;;;;;559:8:5;261:21703;20568:2;261:21703;;20535:54;261:21703;;;;;;;13098:20;13094:81;;12886:348;-1:-1:-1;;261:21703:5;;;13180:13;261:21703;;;;;;;-1:-1:-1;;;;261:21703:5;;;;;;;-1:-1:-1;;;261:21703:5;;;;;;;;13094:81;261:21703;-1:-1:-1;261:21703:5;13128:13;261:21703;;;-1:-1:-1;261:21703:5;;-1:-1:-1;;;;;261:21703:5;;;;;;;;13094:81;;;13238:552;-1:-1:-1;;;;;13238:552:5;559:8;;261:21703;;;;;20568:2;261:21703;;20535:54;13410:24;;;:::i;:::-;13409:25;13405:250;;13238:552;261:21703;;;;;;:::i;:::-;-1:-1:-1;261:21703:5;;;13687:37;;;;261:21703;;;13687:37;;;261:21703;;;20568:2;13687:37;;261:21703;;;13687:37;;;261:21703;;;13687:37;;;;261:21703;;;13687:37;;;261:21703;;;;;;13660:13;261:21703;;;;;;;;;;;;;;;-1:-1:-1;;;;;;261:21703:5;-1:-1:-1;;;261:21703:5;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;261:21703:5;-1:-1:-1;;;;;261:21703:5;;;;;;;;-1:-1:-1;;;;;;;261:21703:5;;;;;;;;;-1:-1:-1;261:21703:5;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;261:21703:5;;559:8;261:21703;13687:37;13762:23;;261:21703;-1:-1:-1;261:21703:5;;13762:23;;;261:21703;-1:-1:-1;261:21703:5;;-1:-1:-1;261:21703:5;13730:18;13687:37;261:21703;-1:-1:-1;261:21703:5;559:8;;261:21703;;;559:8;;;261:21703;;20568:2;559:8;;;;;;;13238:552::o;13405:250::-;261:21703;-1:-1:-1;261:21703:5;13473:18;261:21703;;;;-1:-1:-1;261:21703:5;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;20568:2;261:21703;;;;;;13514:22;13510:139;;13405:250;;;;;13510:139;13548:92;;;:::i;:::-;13510:139;;;;13794:512;;-1:-1:-1;;;;;13794:512:5;;;;261:21703;559:8;-1:-1:-1;;;;;559:8:5;261:21703;20568:2;261:21703;;20535:54;-1:-1:-1;261:21703:5;14032:13;261:21703;;;-1:-1:-1;261:21703:5;14032:41;;;;261:21703;-1:-1:-1;;;;;261:21703:5;;;;;14076:15;-1:-1:-1;261:21703:5;;;14106:41;;;261:21703;;;;-1:-1:-1;;;;;261:21703:5;;;;;;-1:-1:-1;;;;;;261:21703:5;;;;;;;;-1:-1:-1;;;;;559:8:5;;;;;;;13794:512::o;14310:748::-;;-1:-1:-1;;;;;14310:748:5;;;;;;;;;261:21703;559:8;-1:-1:-1;;;;;559:8:5;261:21703;20568:2;261:21703;;20535:54;261:21703;;-1:-1:-1;261:21703:5;14650:13;261:21703;;-1:-1:-1;;;;;261:21703:5;;14650:41;261:21703;-1:-1:-1;261:21703:5;14650:41;261:21703;;;;14704:42;14756:20;14752:75;;14310:748;261:21703;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;14859:194;261:21703;14859:194;;261:21703;;;;14859:194;261:21703;14859:194;;261:21703;;;;20568:2;14859:194;;261:21703;;;;;;14859:194;;261:21703;;;;14859:194;;;;;261:21703;;;;14859:194;;261:21703;;;-1:-1:-1;261:21703:5;14650:13;261:21703;;;-1:-1:-1;261:21703:5;;;;-1:-1:-1;;;;;261:21703:5;;;;;;;;;;;;;;;;;920:51;261:21703;;;;;;;920:51;261:21703;;;;;;;;;;;;-1:-1:-1;;;;;261:21703:5;;;;;-1:-1:-1;;;;;;261:21703:5;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;261:21703:5;;;;;-1:-1:-1;;;;;261:21703:5;;-1:-1:-1;;;;;;261:21703:5;;;;;;;;-1:-1:-1;261:21703:5;;;;;;;;;14310:748::o;14752:75::-;14786:34;;-1:-1:-1;14786:34:5;;14752:75;
Swarm Source
ipfs://7b568fd88a52efd91227c1a1c0a23b2d7b5c65bc48a8a165e2895d1b65529a52
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.