ETH Price: $3,397.66 (+2.53%)

Contract

0x26B59b50b565805D409911E059f191B0E59b1f32
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Reschedule Multi...190919382024-01-26 16:22:11332 days ago1706286131IN
0x26B59b50...0E59b1f32
0 ETH0.0126041926.81732659
Schedule Multipl...190918072024-01-26 15:55:23332 days ago1706284523IN
0x26B59b50...0E59b1f32
0 ETH0.0588841824.22930315
Schedule Multipl...190764822024-01-24 12:25:35335 days ago1706099135IN
0x26B59b50...0E59b1f32
0 ETH0.0338848613.94273689

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ArtMarketplace

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 6 : marketplace.sol
// 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;
}

File 2 of 6 : SafeTransferLib.sol
// 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)
                    )
                )
        }
    }
}

File 3 of 6 : IERC721.sol
// 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);
}

File 4 of 6 : Ownable.sol
// 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);
    }
}

File 5 of 6 : Context.sol
// 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;
    }
}

File 6 of 6 : IERC165.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.