ETH Price: $3,135.49 (+3.59%)

Contract

0x74a165e5c6548a0aCdaF41cB14b87F8873767724
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Close Auction145424192022-04-08 2:13:12953 days ago1649383992IN
0x74a165e5...873767724
0 ETH0.0270467789.25563614
Place Bid143146162022-03-03 14:50:43988 days ago1646319043IN
0x74a165e5...873767724
1 ETH0.0107929279.8081018
Set Extended Tim...142782552022-02-25 23:30:18994 days ago1645831818IN
0x74a165e5...873767724
0 ETH0.0022781579.58330105
Place Bid142782522022-02-25 23:29:11994 days ago1645831751IN
0x74a165e5...873767724
0.3 ETH0.0096731969.97492202
Set Extended Tim...142782442022-02-25 23:27:53994 days ago1645831673IN
0x74a165e5...873767724
0 ETH0.0022379578.14644709
Set Extended Tim...142782402022-02-25 23:27:05994 days ago1645831625IN
0x74a165e5...873767724
0 ETH0.002309780.68573993
Set Extended Tim...142782382022-02-25 23:26:13994 days ago1645831573IN
0x74a165e5...873767724
0 ETH0.0020115570.24075785
Place Bid142562762022-02-22 14:01:50997 days ago1645538510IN
0x74a165e5...873767724
0.25 ETH0.0071968453.21691417
Place Bid142336022022-02-19 1:36:581001 days ago1645234618IN
0x74a165e5...873767724
0.2 ETH0.0079104558.49369458
Place Bid142331292022-02-18 23:53:341001 days ago1645228414IN
0x74a165e5...873767724
0.1 ETH0.0114604872.57608293
List Item On Auc...142330922022-02-18 23:45:091001 days ago1645227909IN
0x74a165e5...873767724
0 ETH0.0169635681.27931783
0x60806040142330462022-02-18 23:33:481001 days ago1645227228IN
 Create: DreamMarketplace
0 ETH0.2627348479.52201346

Latest 7 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
145424192022-04-08 2:13:12953 days ago1649383992
0x74a165e5...873767724
0.8 ETH
145424192022-04-08 2:13:12953 days ago1649383992
0x74a165e5...873767724
0.1 ETH
145424192022-04-08 2:13:12953 days ago1649383992
0x74a165e5...873767724
0.1 ETH
143146162022-03-03 14:50:43988 days ago1646319043
0x74a165e5...873767724
0.3 ETH
142782522022-02-25 23:29:11994 days ago1645831751
0x74a165e5...873767724
0.25 ETH
142562762022-02-22 14:01:50997 days ago1645538510
0x74a165e5...873767724
0.2 ETH
142336022022-02-19 1:36:581001 days ago1645234618
0x74a165e5...873767724
0.1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DreamMarketplace

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : dreamMarketplace.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

interface IDreamNFT {
    function minter(uint256 id) external returns (address);
}

// Not to be confused with the actual WETH contract. This is a simple
// contract to keep track of ETH/BNB the user is owned by the contract.
// The user can withdraw it at any moment, it's not a token, hence it's not
// transferable. The marketplace will automatically try to refund the ETH to
// the user (e.g outbid, NFT sold) with a gas limit. This is simply backup
// when the ETH/BNB could not be sent to the user/address. For example, if
// the user is a smart contract that uses a lot of gas on it's payable.
contract WrappedETH is ReentrancyGuard {
    mapping(address => uint256) public wethBalance;
    function claimETH() external {
        uint256 refund = wethBalance[msg.sender];
        wethBalance[msg.sender] = 0;
        (bool success,) = msg.sender.call{value: refund}("");
        // If the tx failed, restore back their balance.
        if(!success) {
            wethBalance[msg.sender] = refund;
        }
    }

    // claimETHForUser tries to payout the user's owned balance with
    // a gas limit. Does not throw if it failed to send.
    function claimETHForUser(address user) public {
        uint256 refund = wethBalance[user];
        wethBalance[user] = 0;
        (bool success,) = user.call{value: refund, gas: 3500}("");
        // If the tx failed, restore back their balance.
        if(!success) {
            wethBalance[user] = refund;
        }
    }

    // rewardETHToUser tries to send specified amount of ETH to the user.
    // If it cannot, it will add it to their balance. It will NOT throw.
    // Used for paying out other users safely, e.g when outbidding someone.
    function rewardETHToUser(address user, uint256 amount) internal {
        (bool success,) = user.call{value: amount, gas: 3500}("");
        if(!success) {
            wethBalance[user] += amount;
        }
    }
}

contract Buyback {
    // Uniswap V2 Router address for buyback functionality.
    IUniswapV2Router02 public uniswapV2Router;
    // Keep store of the WETH address to save on gas.
    address WETH;

    // devWalletAddress is the Dream development address for 10% fees, and buyback.
    address internal devWalletAddress;
    address public dreamTokenAddress;

    uint256 ethToBuybackWith = 0;

    event UniswapRouterUpdated(
        address newAddress
    );

    event DreamBuyback(
        uint256 ethSpent
    );

    function updateBuybackUniswapRouter(address newRouterAddress) internal {
        uniswapV2Router = IUniswapV2Router02(newRouterAddress);
        WETH = uniswapV2Router.WETH();
        emit UniswapRouterUpdated(newRouterAddress);
    }

    function buybackDream() external {
        require(msg.sender == address(this), "can only be called by the contract");
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = dreamTokenAddress;
        uint256 amount = ethToBuybackWith;
        ethToBuybackWith = 0;
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0, // accept any amount of Tokens
            path,
            devWalletAddress,
            block.timestamp
        );
        emit DreamBuyback(amount);
    }

    function swapETHForTokens(uint256 amount) internal {
        ethToBuybackWith += amount;
        // 500k gas is more than enough.
        try this.buybackDream{gas: 500000}() {} catch {}
    }
}

contract DreamMarketplace is ReentrancyGuard, Ownable, WrappedETH, Buyback {
    // MarketItem consists of buy-now and bid items.
    // Auction refers to items that can be bid on.
    // An item can either be buy-now or bid, or both.
    struct MarketItem {
        uint256 tokenId;

        address payable seller;

        // If purchasePrice is non-0, item can be bought out-right for that price
        // if bidPrice is non-0, item can be bid upon.
        uint256 purchasePrice;
        uint256 bidPrice;

        uint8 state;
        uint64 listingCreationTime;
        uint64 auctionStartTime; // Set when first bid is received. 0 until then.
        uint64 auctionEndTime; // Initially it is the DURATION of the auction.
                               // After the first bid, it is set to the END time
                               // of the auction.
        // Defaults to 0. When 0, no bid has been placed yet.
        address payable highestBidder;
    }

    struct BidHistory {       
        address bidder;
        uint256 bidAmount;
        uint64 bidTime;
    }

    uint8 constant ON_MARKET = 0;
    uint8 constant SOLD = 1;
    uint8 constant CANCELLED = 2;

    uint256 buybackResaleFeePercentage = 5;
    uint256 buybackMinterFeePercentage = 10;
    uint256 artistFeePercentage = 5;
    uint256 devFeePercentage = 10;
    uint256 nextBidPricePercentage = 105;


    uint256 delistCooldown = 600;
    uint256 extendedTime = 300;

    // itemsOnMarket is a list of all items, historic and current, on the marketplace.
    // This includes items all of states, i.e items are never removed from this list.
    MarketItem[] public itemsOnMarket;
    
    mapping(uint256 => BidHistory[]) public itemsOnMarketBidHistories;

    // dreamNFTAddress is the address for the Dream NFT address.
    address public dreamNFTAddress;

    event AuctionItemAdded(
        uint256 marketId,
        uint256 tokenId,
        address tokenAddress,
        uint256 bidPrice,
        uint256 auctionDuration
    );

    event FixedPriceItemAdded(
        uint256 marketId,
        uint256 tokenId,
        address tokenAddress,
        uint256 purchasePrice
    );

    event ItemSold(
        uint256 marketId,
        uint256 tokenId,
        address buyer,
        uint256 purchasePrice,
        uint256 bidPrice
    );

    event HighestBidIncrease(
        uint256 marketId,
        address bidder,
        uint256 amount,
        uint256 auctionEndTime
    );

    event PriceReduction(
        uint256 marketId,
        uint256 newPurchasePrice,
        uint256 newBidPrice
    );

    event ItemPulledFromMarket(uint256 id);

    constructor(address _dreamNFTAddress, address _uniswapRouterAddress, address _dreamTokenAddress, address _devWallet) {
        dreamNFTAddress = _dreamNFTAddress;        
        updateBuybackUniswapRouter(_uniswapRouterAddress);
        dreamTokenAddress = _dreamTokenAddress;
        devWalletAddress = _devWallet;
    }

    function updateUniswapRouter(address newRouterAddress) external onlyOwner {
        updateBuybackUniswapRouter(newRouterAddress);
    }

    function updateDreamNFTAddress(address newAddress) external onlyOwner {
        dreamNFTAddress = newAddress;
    }

    function updateDreamTokenAddress(address newAddress) external onlyOwner {
        dreamTokenAddress = newAddress;
    }

    function isMinter(uint256 id, address target) internal returns (bool) {
        IDreamNFT sNFT = IDreamNFT(dreamNFTAddress);
        return sNFT.minter(id) == target;
    }

    function minter(uint256 id) internal returns (address) {
        IDreamNFT sNFT = IDreamNFT(dreamNFTAddress);
        return sNFT.minter(id);
    }

    function setFees(uint256 _buybackResaleFeePercentage, 
        uint256 _buybackMinterFeePercentage,
        uint256 _artistFeePercentage,
        uint256 _devFeePercentage,
        uint256 _nextBidPricePercentage ) external onlyOwner {
        buybackResaleFeePercentage = _buybackResaleFeePercentage;
        buybackMinterFeePercentage = _buybackMinterFeePercentage;
        artistFeePercentage = _artistFeePercentage;
        devFeePercentage = _devFeePercentage;
        nextBidPricePercentage = _nextBidPricePercentage;
    }

    function changeDevWalletAddress(address newAddress) external onlyOwner{
        devWalletAddress = newAddress;
    }

    function setDelistCooldown(uint256 cooldown) external onlyOwner {
        delistCooldown = cooldown;
    }

    function setExtendedTime(uint256 time) external onlyOwner {
        extendedTime = time;
    }

    function handleFees(uint256 tokenId, uint256 amount, bool isMinterSale) internal returns (uint256) {
        uint256 buybackFee;
        if(!isMinterSale) {
            // In resale, 5% buyback and 5% to artist.
            // 90% to seller.
            buybackFee = amount * buybackResaleFeePercentage / 100;
            uint256 artistFee = amount * artistFeePercentage / 100;
            rewardETHToUser(minter(tokenId), artistFee);
            amount = amount - artistFee;
        } else {
            // When it's the minter selling, they get 80%
            // 10% to buyback
            // 10% to Dream dev wallet.
            buybackFee = amount * buybackMinterFeePercentage / 100;
            uint256 devFee = amount * devFeePercentage / 100;
            rewardETHToUser(devWalletAddress, devFee);
            amount = amount - devFee;
        }
        swapETHForTokens(buybackFee);
        return amount - buybackFee;
    }
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

   function withdrawStuckNFT(address nftAddress, uint256 tokenId) public onlyOwner{
        IERC721(nftAddress).safeTransferFrom(address(this), msg.sender, tokenId);
    }

    function createAuctionItem(
        uint256 tokenId,
        address seller,
        uint256 purchasePrice,
        uint256 startingBidPrice,
        uint256 biddingTime
    ) internal {
        itemsOnMarket.push(
            MarketItem(
                tokenId,
                payable(seller),
                purchasePrice,
                startingBidPrice,
                ON_MARKET,
                uint64(block.timestamp),
                uint64(0),
                uint64(biddingTime),
                payable(address(0))
            )
        );
    }
    
    // purchasePrice is the direct purchasing price. Starting bid price
    // is the starting price for bids. If purchase price is 0, item cannot
    // be bought directly. Similarly for startingBidPrice, if it's 0, item
    // cannot be bid upon. One of them must be non-zero.
    function listItemOnAuction(
        address tokenAddress,
        uint256 tokenId,
        uint256 purchasePrice,
        uint256 startingBidPrice,
        uint256 biddingTime
    )
        external
        returns (uint256)
    {
        IERC721 tokenContract = IERC721(tokenAddress);
        require(tokenContract.ownerOf(tokenId) == msg.sender, "Missing Item Ownership");
        require(tokenContract.getApproved(tokenId) == address(this), "Missing transfer approval");

        require(purchasePrice > 0 || startingBidPrice > 0, "Item must have a price");
        require(startingBidPrice == 0 || biddingTime > 60, "Bidding time must be above one minute");

        uint256 newItemId = itemsOnMarket.length;
        createAuctionItem(
            tokenId,
            msg.sender,
            purchasePrice,
            startingBidPrice,
            biddingTime
        );
 
        IERC721(dreamNFTAddress).transferFrom(
            msg.sender,
            address(this),
            tokenId
        );
        if(purchasePrice > 0) {            
            emit FixedPriceItemAdded(newItemId, tokenId, tokenAddress, purchasePrice);
        }

        if(startingBidPrice > 0) {
            emit AuctionItemAdded(
                newItemId,
                tokenId,
                dreamNFTAddress,
                startingBidPrice,
                biddingTime
            );
        }
        return newItemId;
    }

    function buyFixedPriceItem(uint256 id)
        external
        payable
        nonReentrant
    {
        require(id < itemsOnMarket.length, "Invalid id");
        MarketItem memory item = itemsOnMarket[id];
        require(item.state == ON_MARKET, "Item not for sale");
        require(msg.value >= item.purchasePrice, "Not enough funds sent");
        require(item.purchasePrice > 0, "Item does not have a purchase price.");
        require(msg.sender != item.seller, "Seller can't buy");
        item.state = SOLD;
        IERC721(dreamNFTAddress).safeTransferFrom(
            address(this),
            msg.sender,
            item.tokenId
        ); 
        uint256 netPrice = handleFees(item.tokenId, item.purchasePrice, isMinter(item.tokenId, item.seller));
        rewardETHToUser(item.seller, netPrice);
        emit ItemSold(id, item.tokenId, msg.sender, item.purchasePrice, item.bidPrice);
        itemsOnMarket[id] = item;

        // If the user sent excess ETH/BNB, send any extra back to the user.
        uint256 refundableEther = msg.value - item.purchasePrice;
        if(refundableEther > 0) {
            rewardETHToUser(msg.sender, refundableEther);
        }
    }

    function placeBid(uint256 id)
        external
        payable
        nonReentrant
    {
        require(id < itemsOnMarket.length, "Invalid id");
        MarketItem memory item = itemsOnMarket[id];

        require(item.state == ON_MARKET, "Item not for sale");
        
        require(block.timestamp < item.auctionEndTime || item.highestBidder == address(0), "Auction has ended");
        
        if (item.highestBidder != address(0)) {
            require(msg.value >= item.bidPrice * nextBidPricePercentage / 100, "Bid must be 5% higher than previous bid");
        } else {
            require(msg.value >= item.bidPrice, "Too low bid");

            // First bid!
            item.auctionStartTime = uint64(block.timestamp);
            // item.auctionEnd is the auction duration. Add current time to it
            // to set it to the end time.
            item.auctionEndTime += uint64(block.timestamp);
        }

        address previousBidder = item.highestBidder;
        // Return ETH to previous highest bidder.
        if (previousBidder != address(0)) {
            rewardETHToUser(previousBidder, item.bidPrice);
        }

        item.highestBidder = payable(msg.sender);
        item.bidPrice = msg.value;
        // Extend the auction time by 5 minutes if there is less than 5 minutes remaining.
        // This is to prevent snipers sniping in the last block, and give everyone a chance
        // to bid.
        if ((item.auctionEndTime - block.timestamp) < extendedTime){
            item.auctionEndTime = uint64(block.timestamp + extendedTime);
        }

        emit HighestBidIncrease(id, msg.sender, msg.value, item.auctionEndTime);

        itemsOnMarket[id] = item;

        itemsOnMarketBidHistories[id].push(                
                BidHistory(
                    msg.sender,
                    msg.value,
                    uint64(block.timestamp)                   
                )
            );
    }

    function closeAuction(uint256 id)
        external
        nonReentrant
    {
        require(id < itemsOnMarket.length, "Invalid id");
        MarketItem memory item = itemsOnMarket[id];

        require(item.state == ON_MARKET, "Item not for sale");
        require(item.bidPrice > 0, "Item is not on auction.");
        require(item.highestBidder != address(0), "No bids placed");
        require(block.timestamp > item.auctionEndTime, "Auction is still on going");
        
        item.state = SOLD;
        
        IERC721(dreamNFTAddress).transferFrom(
            address(this),
            item.highestBidder,
            item.tokenId
        );
        
        uint256 netPrice = handleFees(item.tokenId, item.bidPrice, isMinter(item.tokenId, item.seller));
        rewardETHToUser(item.seller, netPrice);
        
        emit ItemSold(id, item.tokenId, item.highestBidder, item.purchasePrice, item.bidPrice);
        itemsOnMarket[id] = item;
    }

    function reducePrice(
        uint256 id,
        uint256 reducedPrice,
        uint256 reducedBidPrice
    )
        external
        nonReentrant
    {
        require(id < itemsOnMarket.length, "Invalid id");
        MarketItem memory item = itemsOnMarket[id];
        require(item.state == ON_MARKET, "Item not for sale");
        require(msg.sender == item.seller, "Only the item seller can trigger a price reduction");
        require(block.timestamp >= item.listingCreationTime + delistCooldown, "Must wait after listing before lowering the listing price");
        require(item.highestBidder == address(0), "Cannot reduce price once a bid has been placed");
        require(reducedBidPrice > 0 || reducedPrice > 0, "Must reduce price");

        if (reducedPrice > 0) {
            require(
                item.purchasePrice > 0 && reducedPrice <= item.purchasePrice * 95 / 100,
                "Reduced price must be at least 5% less than the current price"
            );
            item.purchasePrice = reducedPrice;
        }

        if (reducedBidPrice > 0) {
            require(
                item.bidPrice > 0 && reducedBidPrice <= item.bidPrice * 95 / 100,
                "Reduced price must be at least 5% less than the current price"
            );
            item.bidPrice = reducedPrice;
        }

        itemsOnMarket[id] = item;
        emit PriceReduction(
            id,
            item.purchasePrice,
            item.bidPrice
        );
    }

    function pullFromMarket(uint256 id)
        external
        nonReentrant
    {
        require(id < itemsOnMarket.length, "Invalid id");
        MarketItem memory item = itemsOnMarket[id];

        require(item.state == ON_MARKET, "Item not for sale");
        require(msg.sender == item.seller, "Only the item seller can pull an item from the marketplace");

        // Up for debate: Currently we don't allow items to be pulled if it's been bid on
        require(item.highestBidder == address(0), "Cannot pull from market once a bid has been placed");
        require(block.timestamp >= item.listingCreationTime + 600, "Must wait ten minutes after listing before pulling from the market");
        item.state = CANCELLED;

        IERC721(dreamNFTAddress).transferFrom(
            address(this),
            item.seller,
            item.tokenId
        );
        itemsOnMarket[id] = item;

        emit ItemPulledFromMarket(id);
    }

    // A method for retrieve a NftMarketplaceId, given a NFTID
    function getMarketplaceId(uint256 tokenId)
        external
        view returns (uint256 marketplaceID)
    {
        bool result = false;
        for(uint256 idx = 0; idx < itemsOnMarket.length; idx++) {
            MarketItem memory item = itemsOnMarket[idx];
            if (item.tokenId == tokenId) {
                result = true;
                marketplaceID = idx;
                return marketplaceID;
            }            
        }
        require(result, "Item not found");
    }

    function getBidHistories(uint256 id)
        external
        view
        returns (
            BidHistory[] memory bidHistories
        )
    {
        uint bidHistoryLength = itemsOnMarketBidHistories[id].length;
        require(0 < bidHistoryLength, "not auction item");
        bidHistories = itemsOnMarketBidHistories[id];
        return bidHistories;
    }
    
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 6 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../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`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns 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);

    /**
     * @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;
}

File 5 of 6 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 6 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_dreamNFTAddress","type":"address"},{"internalType":"address","name":"_uniswapRouterAddress","type":"address"},{"internalType":"address","name":"_dreamTokenAddress","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"auctionDuration","type":"uint256"}],"name":"AuctionItemAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"}],"name":"DreamBuyback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchasePrice","type":"uint256"}],"name":"FixedPriceItemAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"auctionEndTime","type":"uint256"}],"name":"HighestBidIncrease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ItemPulledFromMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"}],"name":"ItemSold","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":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPurchasePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBidPrice","type":"uint256"}],"name":"PriceReduction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"UniswapRouterUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"buyFixedPriceItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buybackDream","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeDevWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimETHForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"closeAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dreamNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dreamTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getBidHistories","outputs":[{"components":[{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"uint64","name":"bidTime","type":"uint64"}],"internalType":"struct DreamMarketplace.BidHistory[]","name":"bidHistories","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMarketplaceId","outputs":[{"internalType":"uint256","name":"marketplaceID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemsOnMarket","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"bidPrice","type":"uint256"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"uint64","name":"listingCreationTime","type":"uint64"},{"internalType":"uint64","name":"auctionStartTime","type":"uint64"},{"internalType":"uint64","name":"auctionEndTime","type":"uint64"},{"internalType":"address payable","name":"highestBidder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemsOnMarketBidHistories","outputs":[{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"uint64","name":"bidTime","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"startingBidPrice","type":"uint256"},{"internalType":"uint256","name":"biddingTime","type":"uint256"}],"name":"listItemOnAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"placeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"pullFromMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"reducedPrice","type":"uint256"},{"internalType":"uint256","name":"reducedBidPrice","type":"uint256"}],"name":"reducePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cooldown","type":"uint256"}],"name":"setDelistCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setExtendedTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buybackResaleFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_buybackMinterFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_artistFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_devFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_nextBidPricePercentage","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDreamNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDreamTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"updateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wethBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawStuckNFT","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006007556005600855600a6009556005600a55600a600b556069600c55610258600d5561012c600e553480156200003b57600080fd5b5060405162003781380380620037818339810160408190526200005e9162000240565b60016000556200006e33620000c9565b601180546001600160a01b0319166001600160a01b03861617905562000094836200011b565b600680546001600160a01b039384166001600160a01b03199182161790915560058054929093169116179055506200029c9050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600380546001600160a01b0319166001600160a01b038316908117909155604080516315ab88c960e31b8152905163ad5c464891600480820192602092909190829003018186803b1580156200017057600080fd5b505afa15801562000185573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ab91906200021c565b600480546001600160a01b0319166001600160a01b0392831617905560405190821681527f455a5e52b7c01aa52d717db42e17b6610b0c2c96560c85b7e5adcdd254bfc17c9060200160405180910390a150565b80516001600160a01b03811681146200021757600080fd5b919050565b6000602082840312156200022e578081fd5b6200023982620001ff565b9392505050565b6000806000806080858703121562000256578283fd5b6200026185620001ff565b93506200027160208601620001ff565b92506200028160408601620001ff565b91506200029160608601620001ff565b905092959194509250565b6134d580620002ac6000396000f3fe6080604052600436106101c25760003560e01c80637d4626c5116100f7578063ae0e70ac11610095578063e2a5a3d511610064578063e2a5a3d51461056f578063f2fde38b1461058f578063f5648a4f146105af578063f9f18464146105c457600080fd5b8063ae0e70ac146104fa578063b989d6cd1461051a578063c9921f501461053a578063e122173c1461055a57600080fd5b80638da5cb5b116100d15780638da5cb5b1461047c578063908bb2ae1461049a5780639979ef45146104ba578063a5e0c44b146104cd57600080fd5b80637d4626c5146103ee5780638661edcb1461040e5780638b0619021461042e57600080fd5b80634a2a593611610164578063672729991161013e57806367272999146103915780636fbabe21146103a6578063715018a6146103b957806377666290146103ce57600080fd5b80634a2a5936146103315780634ca38c7b14610351578063574e27a61461037157600080fd5b80631fc9d27d116101a05780631fc9d27d146102a3578063236ed8f3146102c35780632e550144146102e35780633fcaeb741461031157600080fd5b806304a66b48146101c757806316756348146101e95780631694505e1461026b575b600080fd5b3480156101d357600080fd5b506101e76101e236600461314a565b6105f1565b005b3480156101f557600080fd5b506102096102043660046130e6565b61063b565b60408051998a526001600160a01b0398891660208b0152890196909652606088019490945260ff90921660808701526001600160401b0390811660a087015290811660c08601521660e084015216610100820152610120015b60405180910390f35b34801561027757600080fd5b5060035461028b906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b3480156102af57600080fd5b506101e76102be366004613040565b6106b9565b3480156102cf57600080fd5b506101e76102de3660046130e6565b61074b565b3480156102ef57600080fd5b506103036102fe3660046130a3565b610b73565b604051908152602001610262565b34801561031d57600080fd5b506101e761032c366004613040565b6110c2565b34801561033d57600080fd5b506101e761034c366004613040565b61110e565b34801561035d57600080fd5b5061030361036c3660046130e6565b61115a565b34801561037d57600080fd5b506101e761038c366004613078565b611294565b34801561039d57600080fd5b506101e7611324565b6101e76103b43660046130e6565b61139e565b3480156103c557600080fd5b506101e76117e4565b3480156103da57600080fd5b506101e76103e93660046130e6565b61181a565b3480156103fa57600080fd5b506101e76104093660046130e6565b611849565b34801561041a57600080fd5b506101e7610429366004613040565b611878565b34801561043a57600080fd5b5061044e6104493660046130fe565b6118c4565b604080516001600160a01b03909416845260208401929092526001600160401b031690820152606001610262565b34801561048857600080fd5b506001546001600160a01b031661028b565b3480156104a657600080fd5b506101e76104b5366004613040565b611919565b6101e76104c83660046130e6565b61194f565b3480156104d957600080fd5b506104ed6104e83660046130e6565b611ed7565b60405161026291906131a8565b34801561050657600080fd5b506101e76105153660046130e6565b611fbc565b34801561052657600080fd5b506101e761053536600461311f565b61243b565b34801561054657600080fd5b5060115461028b906001600160a01b031681565b34801561056657600080fd5b506101e761294f565b34801561057b57600080fd5b5060065461028b906001600160a01b031681565b34801561059b57600080fd5b506101e76105aa366004613040565b612afa565b3480156105bb57600080fd5b506101e7612b92565b3480156105d057600080fd5b506103036105df366004613040565b60026020526000908152604090205481565b6001546001600160a01b031633146106245760405162461bcd60e51b815260040161061b906132fd565b60405180910390fd5b600894909455600992909255600a55600b55600c55565b600f818154811061064b57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501549395506001600160a01b03928316949193909260ff8316926001600160401b036101008204811693600160481b8304821693600160881b909304909116911689565b6001600160a01b0381166000818152600260205260408082208054908390559051909290610dac90849084818181858888f193505050503d806000811461071c576040519150601f19603f3d011682016040523d82523d6000602084013e610721565b606091505b5050905080610746576001600160a01b03831660009081526002602052604090208290555b505050565b6002600054141561076e5760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106107945760405162461bcd60e51b815260040161061b906132d9565b6000600f82815481106107b757634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156108765760405162461bcd60e51b815260040161061b90613332565b60008160600151116108ca5760405162461bcd60e51b815260206004820152601760248201527f4974656d206973206e6f74206f6e2061756374696f6e2e000000000000000000604482015260640161061b565b6101008101516001600160a01b03166109165760405162461bcd60e51b815260206004820152600e60248201526d139bc8189a591cc81c1b1858d95960921b604482015260640161061b565b8060e001516001600160401b031642116109725760405162461bcd60e51b815260206004820152601960248201527f41756374696f6e206973207374696c6c206f6e20676f696e6700000000000000604482015260640161061b565b6001608082015260115461010082015182516040516323b872dd60e01b81526001600160a01b03909316926323b872dd926109b1923092600401613184565b600060405180830381600087803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b505082516060840151602085015160009450610a069350610a01908390612c09565b612ca2565b9050610a16826020015182612d83565b7f2b035c354919347304dfdb0a8c6847f3604bbe5cd76dd4056b4ae9b99ead1d1a83836000015184610100015185604001518660600151604051610a5e959493929190613394565b60405180910390a181600f8481548110610a8857634e487b7160e01b600052603260045260246000fd5b600091825260208083208451600690930201918255830151600180830180546001600160a01b039384166001600160a01b0319918216179091556040860151600285015560608601516003850155608086015160048501805460a089015160c08a015160e08b01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff909716969096179390931792909216171790559095015160059093018054939092169290941691909117905555505050565b6040516331a9108f60e11b815260048101859052600090869033906001600160a01b03831690636352211e9060240160206040518083038186803b158015610bba57600080fd5b505afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061305c565b6001600160a01b031614610c415760405162461bcd60e51b815260206004820152601660248201527504d697373696e67204974656d204f776e6572736869760541b604482015260640161061b565b60405163020604bf60e21b81526004810187905230906001600160a01b0383169063081812fc9060240160206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb919061305c565b6001600160a01b031614610d115760405162461bcd60e51b815260206004820152601960248201527f4d697373696e67207472616e7366657220617070726f76616c00000000000000604482015260640161061b565b6000851180610d205750600084115b610d655760405162461bcd60e51b81526020600482015260166024820152754974656d206d7573742068617665206120707269636560501b604482015260640161061b565b831580610d725750603c83115b610dcc5760405162461bcd60e51b815260206004820152602560248201527f42696464696e672074696d65206d7573742062652061626f7665206f6e65206d604482015264696e75746560d81b606482015260840161061b565b600f805460408051610120810182528981523360208201908152918101898152606082018981526000608084018181526001600160401b0342811660a0870190815260c087018481528d831660e08901908152610100808a0187815260018d018e559c909652975160068b027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281019190915598517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8038a0180546001600160a01b039283166001600160a01b03199182161790915597517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8048b015595517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8058a015592517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac806890180549251945198518416600160881b0267ffffffffffffffff60881b19998516600160481b0299909916600160481b600160c81b03199590941690950268ffffffffffffffffff1990921660ff909116171791909116179390931790925593517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80790920180549290911691909316179091556011546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610fd890339030908c90600401613184565b600060405180830381600087803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b5050505060008611156110635760408051828152602081018990526001600160a01b038a16818301526060810188905290517faf185d475a485625e530f117810a6d9caf5c576634b20d4027901e5b12a47ae69181900360800190a15b84156110b7576011546040517f03fd1147a0d6ef670720403a08b582ea554c37e9e66ce27d2a59240d567b144d916110ae9184918b916001600160a01b03909116908a908a90613394565b60405180910390a15b979650505050505050565b6001546001600160a01b031633146110ec5760405162461bcd60e51b815260040161061b906132fd565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146111385760405162461bcd60e51b815260040161061b906132fd565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b600f5481101561124f576000600f828154811061118c57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051610120810182526006909302909101805480845260018201546001600160a01b039081169585019590955260028201549284019290925260038101546060840152600481015460ff811660808501526001600160401b03610100808304821660a0870152600160481b8304821660c0870152600160881b9092041660e085015260059091015490931692820192909252915085141561123c57509392505050565b508061124781613459565b91505061115f565b508061128e5760405162461bcd60e51b815260206004820152600e60248201526d125d195b481b9bdd08199bdd5b9960921b604482015260640161061b565b50919050565b6001546001600160a01b031633146112be5760405162461bcd60e51b815260040161061b906132fd565b604051632142170760e11b81526001600160a01b038316906342842e0e906112ee90309033908690600401613184565b600060405180830381600087803b15801561130857600080fd5b505af115801561131c573d6000803e3d6000fd5b505050505050565b33600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114611379576040519150601f19603f3d011682016040523d82523d6000602084013e61137e565b606091505b505090508061139a573360009081526002602052604090208290555b5050565b600260005414156113c15760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106113e75760405162461bcd60e51b815260040161061b906132d9565b6000600f828154811061140a57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156114c95760405162461bcd60e51b815260040161061b90613332565b80604001513410156115155760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08199d5b991cc81cd95b9d605a1b604482015260640161061b565b60008160400151116115755760405162461bcd60e51b8152602060048201526024808201527f4974656d20646f6573206e6f742068617665206120707572636861736520707260448201526334b1b29760e11b606482015260840161061b565b80602001516001600160a01b0316336001600160a01b031614156115ce5760405162461bcd60e51b815260206004820152601060248201526f53656c6c65722063616e27742062757960801b604482015260640161061b565b600160808201526011548151604051632142170760e11b81526001600160a01b03909216916342842e0e916116099130913391600401613184565b600060405180830381600087803b15801561162357600080fd5b505af1158015611637573d6000803e3d6000fd5b5050825160408401516020850151600094506116599350610a01908390612c09565b9050611669826020015182612d83565b7f2b035c354919347304dfdb0a8c6847f3604bbe5cd76dd4056b4ae9b99ead1d1a83836000015133856040015186606001516040516116ac959493929190613394565b60405180910390a181600f84815481106116d657634e487b7160e01b600052603260045260246000fd5b6000918252602080832084516006909302019182558301516001820180546001600160a01b039283166001600160a01b031991821617909155604080860151600285015560608601516003850155608086015160048501805460a089015160c08a015160e08b01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff909716969096179390931792909216171790559095015160059093018054939092169216919091179055908301516117c79034613442565b905080156117d9576117d93382612d83565b505060016000555050565b6001546001600160a01b0316331461180e5760405162461bcd60e51b815260040161061b906132fd565b6118186000612e15565b565b6001546001600160a01b031633146118445760405162461bcd60e51b815260040161061b906132fd565b600d55565b6001546001600160a01b031633146118735760405162461bcd60e51b815260040161061b906132fd565b600e55565b6001546001600160a01b031633146118a25760405162461bcd60e51b815260040161061b906132fd565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b601060205281600052604060002081815481106118e057600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b0390911693509091506001600160401b031683565b6001546001600160a01b031633146119435760405162461bcd60e51b815260040161061b906132fd565b61194c81612e67565b50565b600260005414156119725760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106119985760405162461bcd60e51b815260040161061b906132d9565b6000600f82815481106119bb57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e085015260059092015490931692820192909252915015611a7a5760405162461bcd60e51b815260040161061b90613332565b8060e001516001600160401b0316421080611aa157506101008101516001600160a01b0316155b611ae15760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b604482015260640161061b565b6101008101516001600160a01b031615611b77576064600c548260600151611b099190613423565b611b139190613403565b341015611b725760405162461bcd60e51b815260206004820152602760248201527f426964206d75737420626520352520686967686572207468616e2070726576696044820152661bdd5cc8189a5960ca1b606482015260840161061b565b611be7565b8060600151341015611bb95760405162461bcd60e51b815260206004820152600b60248201526a151bdbc81b1bddc8189a5960aa1b604482015260640161061b565b426001600160401b03811660c083015260e082018051611bda9083906133d8565b6001600160401b03169052505b6101008101516001600160a01b03811615611c0a57611c0a818360600151612d83565b33610100830152346060830152600e5460e0830151611c339042906001600160401b0316613442565b1015611c5557600e54611c4690426133c0565b6001600160401b031660e08301525b60e08201516040805185815233602082015234818301526001600160401b039092166060830152517fec2561ca82ba6573021727f38daf8f99f0bc9b709f9eddd09d91b056f01277e39181900360800190a181600f8481548110611cc957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600602016000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360ff16021790555060a08201518160040160016101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160040160096101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160040160116101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160050160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050601060008481526020019081526020016000206040518060600160405280336001600160a01b03168152602001348152602001426001600160401b0316815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160401b0302191690836001600160401b0316021790555050505050600160008190555050565b60008181526010602052604090205460609080611f295760405162461bcd60e51b815260206004820152601060248201526f6e6f742061756374696f6e206974656d60801b604482015260640161061b565b600083815260106020908152604080832080548251818502810185019093528083529193909284015b82821015611fb0576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101546001600160401b0316918301919091529083529092019101611f52565b50505050915050919050565b60026000541415611fdf5760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106120055760405162461bcd60e51b815260040161061b906132d9565b6000600f828154811061202857634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156120e75760405162461bcd60e51b815260040161061b90613332565b80602001516001600160a01b0316336001600160a01b0316146121725760405162461bcd60e51b815260206004820152603a60248201527f4f6e6c7920746865206974656d2073656c6c65722063616e2070756c6c20616e60448201527f206974656d2066726f6d20746865206d61726b6574706c616365000000000000606482015260840161061b565b6101008101516001600160a01b0316156121e95760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742070756c6c2066726f6d206d61726b6574206f6e6365206120626044820152711a59081a185cc81899595b881c1b1858d95960721b606482015260840161061b565b60a08101516121fa906102586133d8565b6001600160401b03164210156122835760405162461bcd60e51b815260206004820152604260248201527f4d75737420776169742074656e206d696e75746573206166746572206c69737460448201527f696e67206265666f72652070756c6c696e672066726f6d20746865206d61726b606482015261195d60f21b608482015260a40161061b565b60026080820152601154602082015182516040516323b872dd60e01b81526001600160a01b03909316926323b872dd926122c1923092600401613184565b600060405180830381600087803b1580156122db57600080fd5b505af11580156122ef573d6000803e3d6000fd5b5050505080600f838154811061231557634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600690920201908155908201516001820180546001600160a01b039283166001600160a01b031991821617909155604080850151600285015560608501516003850155608085015160048501805460a088015160c089015160e08a01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff909716969096179390931792909216171790559094015160059093018054939092169216919091179055517f3668304292598552a17f3dc2c36115c2df53ebf377a85a5f14ad1595cfb5a6739061242a9084815260200190565b60405180910390a150506001600055565b6002600054141561245e5760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5483106124845760405162461bcd60e51b815260040161061b906132d9565b6000600f84815481106124a757634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156125665760405162461bcd60e51b815260040161061b90613332565b80602001516001600160a01b0316336001600160a01b0316146125e65760405162461bcd60e51b815260206004820152603260248201527f4f6e6c7920746865206974656d2073656c6c65722063616e2074726967676572604482015271103090383934b1b2903932b23ab1ba34b7b760711b606482015260840161061b565b600d548160a001516001600160401b031661260191906133c0565b4210156126765760405162461bcd60e51b815260206004820152603960248201527f4d7573742077616974206166746572206c697374696e67206265666f7265206c60448201527f6f776572696e6720746865206c697374696e6720707269636500000000000000606482015260840161061b565b6101008101516001600160a01b0316156126e95760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f7420726564756365207072696365206f6e6365206120626964206860448201526d185cc81899595b881c1b1858d95960921b606482015260840161061b565b60008211806126f85750600083115b6127385760405162461bcd60e51b81526020600482015260116024820152704d7573742072656475636520707269636560781b604482015260640161061b565b8215612792576000816040015111801561276e575060648160400151605f6127609190613423565b61276a9190613403565b8311155b61278a5760405162461bcd60e51b815260040161061b9061327c565b604081018390525b81156127ec57600081606001511180156127c8575060648160600151605f6127ba9190613423565b6127c49190613403565b8211155b6127e45760405162461bcd60e51b815260040161061b9061327c565b606081018390525b80600f858154811061280e57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600690920201908155908201516001820180546001600160a01b039283166001600160a01b03199182161790915560408085015160028501556060808601516003860155608086015160048601805460a089015160c08a015160e08b01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff9097169690961793909317929092161717905590950151600590940180549490931693909116929092179055828101519183015190517fc6890297f86f07076395471a4ac2be4ba632cb7ac8ac34ad5174b77438260ac89261293c928883526020830191909152604082015260600190565b60405180910390a1505060016000555050565b3330146129a95760405162461bcd60e51b815260206004820152602260248201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160448201526118dd60f21b606482015260840161061b565b604080516002808252606082018352600092602083019080368337505060045482519293506001600160a01b0316918391506000906129f857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654825191169082906001908110612a3757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526007805460009182905560035460055460405163b6f9de9560e01b815292949182169363b6f9de95938693612a8b9389929116904290600401613213565b6000604051808303818588803b158015612aa457600080fd5b505af1158015612ab8573d6000803e3d6000fd5b50505050507f9e3a2277f2d2efc712cc3df1192378e0dac5a7a1049ec04a31c87b0bd989cc0381604051612aee91815260200190565b60405180910390a15050565b6001546001600160a01b03163314612b245760405162461bcd60e51b815260040161061b906132fd565b6001600160a01b038116612b895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161061b565b61194c81612e15565b6001546001600160a01b03163314612bbc5760405162461bcd60e51b815260040161061b906132fd565b604051600090339047908381818185875af1925050503d8060008114612bfe576040519150601f19603f3d011682016040523d82523d6000602084013e612c03565b606091505b50505050565b601154604051632b23615b60e21b8152600481018490526000916001600160a01b039081169190841690829063ac8d856c90602401602060405180830381600087803b158015612c5857600080fd5b505af1158015612c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c90919061305c565b6001600160a01b031614949350505050565b60008082612d0857606460085485612cba9190613423565b612cc49190613403565b905060006064600a5486612cd89190613423565b612ce29190613403565b9050612cf6612cf087612f47565b82612d83565b612d008186613442565b945050612d67565b606460095485612d189190613423565b612d229190613403565b905060006064600b5486612d369190613423565b612d409190613403565b600554909150612d59906001600160a01b031682612d83565b612d638186613442565b9450505b612d7081612fcf565b612d7a8185613442565b95945050505050565b6000826001600160a01b031682610dac90604051600060405180830381858888f193505050503d8060008114612dd5576040519150601f19603f3d011682016040523d82523d6000602084013e612dda565b606091505b5050905080610746576001600160a01b03831660009081526002602052604081208054849290612e0b9084906133c0565b9091555050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600380546001600160a01b0319166001600160a01b038316908117909155604080516315ab88c960e31b8152905163ad5c464891600480820192602092909190829003018186803b158015612ebb57600080fd5b505afa158015612ecf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef3919061305c565b600480546001600160a01b0319166001600160a01b0392831617905560405190821681527f455a5e52b7c01aa52d717db42e17b6610b0c2c96560c85b7e5adcdd254bfc17c9060200160405180910390a150565b601154604051632b23615b60e21b8152600481018390526000916001600160a01b031690819063ac8d856c90602401602060405180830381600087803b158015612f9057600080fd5b505af1158015612fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc8919061305c565b9392505050565b8060076000828254612fe191906133c0565b92505081905550306001600160a01b031663e122173c6207a1206040518263ffffffff1660e01b8152600401600060405180830381600088803b15801561302757600080fd5b5087f193505050508015613039575060015b61194c5750565b600060208284031215613051578081fd5b8135612fc88161348a565b60006020828403121561306d578081fd5b8151612fc88161348a565b6000806040838503121561308a578081fd5b82356130958161348a565b946020939093013593505050565b600080600080600060a086880312156130ba578081fd5b85356130c58161348a565b97602087013597506040870135966060810135965060800135945092505050565b6000602082840312156130f7578081fd5b5035919050565b60008060408385031215613110578182fd5b50508035926020909101359150565b600080600060608486031215613133578283fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215613161578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b8281101561320657815180516001600160a01b0316855286810151878601528501516001600160401b031685850152606090930192908501906001016131c5565b5091979650505050505050565b600060808201868352602060808185015281875180845260a0860191508289019350845b8181101561325c5784516001600160a01b031683529383019391830191600101613237565b50506001600160a01b039690961660408501525050506060015292915050565b6020808252603d908201527f52656475636564207072696365206d757374206265206174206c65617374203560408201527f25206c657373207468616e207468652063757272656e74207072696365000000606082015260800190565b6020808252600a9082015269125b9d985b1a59081a5960b21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152704974656d206e6f7420666f722073616c6560781b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b94855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b600082198211156133d3576133d3613474565b500190565b60006001600160401b038083168185168083038211156133fa576133fa613474565b01949350505050565b60008261341e57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561343d5761343d613474565b500290565b60008282101561345457613454613474565b500390565b600060001982141561346d5761346d613474565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461194c57600080fdfea264697066735822122047efd1da175f9a099495bd12f1e2ada3846adb95a24fc735ba73a6ca23bee8c064736f6c6343000804003300000000000000000000000021684c6b32665922755b5d5677c2df71cd0c64dd0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000008b17fea54d85f61e71bdf161e920762898ac53da000000000000000000000000cd11d4f84e6dd5cf256e595557ebd482399087ec

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80637d4626c5116100f7578063ae0e70ac11610095578063e2a5a3d511610064578063e2a5a3d51461056f578063f2fde38b1461058f578063f5648a4f146105af578063f9f18464146105c457600080fd5b8063ae0e70ac146104fa578063b989d6cd1461051a578063c9921f501461053a578063e122173c1461055a57600080fd5b80638da5cb5b116100d15780638da5cb5b1461047c578063908bb2ae1461049a5780639979ef45146104ba578063a5e0c44b146104cd57600080fd5b80637d4626c5146103ee5780638661edcb1461040e5780638b0619021461042e57600080fd5b80634a2a593611610164578063672729991161013e57806367272999146103915780636fbabe21146103a6578063715018a6146103b957806377666290146103ce57600080fd5b80634a2a5936146103315780634ca38c7b14610351578063574e27a61461037157600080fd5b80631fc9d27d116101a05780631fc9d27d146102a3578063236ed8f3146102c35780632e550144146102e35780633fcaeb741461031157600080fd5b806304a66b48146101c757806316756348146101e95780631694505e1461026b575b600080fd5b3480156101d357600080fd5b506101e76101e236600461314a565b6105f1565b005b3480156101f557600080fd5b506102096102043660046130e6565b61063b565b60408051998a526001600160a01b0398891660208b0152890196909652606088019490945260ff90921660808701526001600160401b0390811660a087015290811660c08601521660e084015216610100820152610120015b60405180910390f35b34801561027757600080fd5b5060035461028b906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b3480156102af57600080fd5b506101e76102be366004613040565b6106b9565b3480156102cf57600080fd5b506101e76102de3660046130e6565b61074b565b3480156102ef57600080fd5b506103036102fe3660046130a3565b610b73565b604051908152602001610262565b34801561031d57600080fd5b506101e761032c366004613040565b6110c2565b34801561033d57600080fd5b506101e761034c366004613040565b61110e565b34801561035d57600080fd5b5061030361036c3660046130e6565b61115a565b34801561037d57600080fd5b506101e761038c366004613078565b611294565b34801561039d57600080fd5b506101e7611324565b6101e76103b43660046130e6565b61139e565b3480156103c557600080fd5b506101e76117e4565b3480156103da57600080fd5b506101e76103e93660046130e6565b61181a565b3480156103fa57600080fd5b506101e76104093660046130e6565b611849565b34801561041a57600080fd5b506101e7610429366004613040565b611878565b34801561043a57600080fd5b5061044e6104493660046130fe565b6118c4565b604080516001600160a01b03909416845260208401929092526001600160401b031690820152606001610262565b34801561048857600080fd5b506001546001600160a01b031661028b565b3480156104a657600080fd5b506101e76104b5366004613040565b611919565b6101e76104c83660046130e6565b61194f565b3480156104d957600080fd5b506104ed6104e83660046130e6565b611ed7565b60405161026291906131a8565b34801561050657600080fd5b506101e76105153660046130e6565b611fbc565b34801561052657600080fd5b506101e761053536600461311f565b61243b565b34801561054657600080fd5b5060115461028b906001600160a01b031681565b34801561056657600080fd5b506101e761294f565b34801561057b57600080fd5b5060065461028b906001600160a01b031681565b34801561059b57600080fd5b506101e76105aa366004613040565b612afa565b3480156105bb57600080fd5b506101e7612b92565b3480156105d057600080fd5b506103036105df366004613040565b60026020526000908152604090205481565b6001546001600160a01b031633146106245760405162461bcd60e51b815260040161061b906132fd565b60405180910390fd5b600894909455600992909255600a55600b55600c55565b600f818154811061064b57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501549395506001600160a01b03928316949193909260ff8316926001600160401b036101008204811693600160481b8304821693600160881b909304909116911689565b6001600160a01b0381166000818152600260205260408082208054908390559051909290610dac90849084818181858888f193505050503d806000811461071c576040519150601f19603f3d011682016040523d82523d6000602084013e610721565b606091505b5050905080610746576001600160a01b03831660009081526002602052604090208290555b505050565b6002600054141561076e5760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106107945760405162461bcd60e51b815260040161061b906132d9565b6000600f82815481106107b757634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156108765760405162461bcd60e51b815260040161061b90613332565b60008160600151116108ca5760405162461bcd60e51b815260206004820152601760248201527f4974656d206973206e6f74206f6e2061756374696f6e2e000000000000000000604482015260640161061b565b6101008101516001600160a01b03166109165760405162461bcd60e51b815260206004820152600e60248201526d139bc8189a591cc81c1b1858d95960921b604482015260640161061b565b8060e001516001600160401b031642116109725760405162461bcd60e51b815260206004820152601960248201527f41756374696f6e206973207374696c6c206f6e20676f696e6700000000000000604482015260640161061b565b6001608082015260115461010082015182516040516323b872dd60e01b81526001600160a01b03909316926323b872dd926109b1923092600401613184565b600060405180830381600087803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b505082516060840151602085015160009450610a069350610a01908390612c09565b612ca2565b9050610a16826020015182612d83565b7f2b035c354919347304dfdb0a8c6847f3604bbe5cd76dd4056b4ae9b99ead1d1a83836000015184610100015185604001518660600151604051610a5e959493929190613394565b60405180910390a181600f8481548110610a8857634e487b7160e01b600052603260045260246000fd5b600091825260208083208451600690930201918255830151600180830180546001600160a01b039384166001600160a01b0319918216179091556040860151600285015560608601516003850155608086015160048501805460a089015160c08a015160e08b01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff909716969096179390931792909216171790559095015160059093018054939092169290941691909117905555505050565b6040516331a9108f60e11b815260048101859052600090869033906001600160a01b03831690636352211e9060240160206040518083038186803b158015610bba57600080fd5b505afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061305c565b6001600160a01b031614610c415760405162461bcd60e51b815260206004820152601660248201527504d697373696e67204974656d204f776e6572736869760541b604482015260640161061b565b60405163020604bf60e21b81526004810187905230906001600160a01b0383169063081812fc9060240160206040518083038186803b158015610c8357600080fd5b505afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb919061305c565b6001600160a01b031614610d115760405162461bcd60e51b815260206004820152601960248201527f4d697373696e67207472616e7366657220617070726f76616c00000000000000604482015260640161061b565b6000851180610d205750600084115b610d655760405162461bcd60e51b81526020600482015260166024820152754974656d206d7573742068617665206120707269636560501b604482015260640161061b565b831580610d725750603c83115b610dcc5760405162461bcd60e51b815260206004820152602560248201527f42696464696e672074696d65206d7573742062652061626f7665206f6e65206d604482015264696e75746560d81b606482015260840161061b565b600f805460408051610120810182528981523360208201908152918101898152606082018981526000608084018181526001600160401b0342811660a0870190815260c087018481528d831660e08901908152610100808a0187815260018d018e559c909652975160068b027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281019190915598517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8038a0180546001600160a01b039283166001600160a01b03199182161790915597517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8048b015595517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8058a015592517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac806890180549251945198518416600160881b0267ffffffffffffffff60881b19998516600160481b0299909916600160481b600160c81b03199590941690950268ffffffffffffffffff1990921660ff909116171791909116179390931790925593517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80790920180549290911691909316179091556011546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610fd890339030908c90600401613184565b600060405180830381600087803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b5050505060008611156110635760408051828152602081018990526001600160a01b038a16818301526060810188905290517faf185d475a485625e530f117810a6d9caf5c576634b20d4027901e5b12a47ae69181900360800190a15b84156110b7576011546040517f03fd1147a0d6ef670720403a08b582ea554c37e9e66ce27d2a59240d567b144d916110ae9184918b916001600160a01b03909116908a908a90613394565b60405180910390a15b979650505050505050565b6001546001600160a01b031633146110ec5760405162461bcd60e51b815260040161061b906132fd565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146111385760405162461bcd60e51b815260040161061b906132fd565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b600f5481101561124f576000600f828154811061118c57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051610120810182526006909302909101805480845260018201546001600160a01b039081169585019590955260028201549284019290925260038101546060840152600481015460ff811660808501526001600160401b03610100808304821660a0870152600160481b8304821660c0870152600160881b9092041660e085015260059091015490931692820192909252915085141561123c57509392505050565b508061124781613459565b91505061115f565b508061128e5760405162461bcd60e51b815260206004820152600e60248201526d125d195b481b9bdd08199bdd5b9960921b604482015260640161061b565b50919050565b6001546001600160a01b031633146112be5760405162461bcd60e51b815260040161061b906132fd565b604051632142170760e11b81526001600160a01b038316906342842e0e906112ee90309033908690600401613184565b600060405180830381600087803b15801561130857600080fd5b505af115801561131c573d6000803e3d6000fd5b505050505050565b33600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114611379576040519150601f19603f3d011682016040523d82523d6000602084013e61137e565b606091505b505090508061139a573360009081526002602052604090208290555b5050565b600260005414156113c15760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106113e75760405162461bcd60e51b815260040161061b906132d9565b6000600f828154811061140a57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156114c95760405162461bcd60e51b815260040161061b90613332565b80604001513410156115155760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08199d5b991cc81cd95b9d605a1b604482015260640161061b565b60008160400151116115755760405162461bcd60e51b8152602060048201526024808201527f4974656d20646f6573206e6f742068617665206120707572636861736520707260448201526334b1b29760e11b606482015260840161061b565b80602001516001600160a01b0316336001600160a01b031614156115ce5760405162461bcd60e51b815260206004820152601060248201526f53656c6c65722063616e27742062757960801b604482015260640161061b565b600160808201526011548151604051632142170760e11b81526001600160a01b03909216916342842e0e916116099130913391600401613184565b600060405180830381600087803b15801561162357600080fd5b505af1158015611637573d6000803e3d6000fd5b5050825160408401516020850151600094506116599350610a01908390612c09565b9050611669826020015182612d83565b7f2b035c354919347304dfdb0a8c6847f3604bbe5cd76dd4056b4ae9b99ead1d1a83836000015133856040015186606001516040516116ac959493929190613394565b60405180910390a181600f84815481106116d657634e487b7160e01b600052603260045260246000fd5b6000918252602080832084516006909302019182558301516001820180546001600160a01b039283166001600160a01b031991821617909155604080860151600285015560608601516003850155608086015160048501805460a089015160c08a015160e08b01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff909716969096179390931792909216171790559095015160059093018054939092169216919091179055908301516117c79034613442565b905080156117d9576117d93382612d83565b505060016000555050565b6001546001600160a01b0316331461180e5760405162461bcd60e51b815260040161061b906132fd565b6118186000612e15565b565b6001546001600160a01b031633146118445760405162461bcd60e51b815260040161061b906132fd565b600d55565b6001546001600160a01b031633146118735760405162461bcd60e51b815260040161061b906132fd565b600e55565b6001546001600160a01b031633146118a25760405162461bcd60e51b815260040161061b906132fd565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b601060205281600052604060002081815481106118e057600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b0390911693509091506001600160401b031683565b6001546001600160a01b031633146119435760405162461bcd60e51b815260040161061b906132fd565b61194c81612e67565b50565b600260005414156119725760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106119985760405162461bcd60e51b815260040161061b906132d9565b6000600f82815481106119bb57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e085015260059092015490931692820192909252915015611a7a5760405162461bcd60e51b815260040161061b90613332565b8060e001516001600160401b0316421080611aa157506101008101516001600160a01b0316155b611ae15760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b604482015260640161061b565b6101008101516001600160a01b031615611b77576064600c548260600151611b099190613423565b611b139190613403565b341015611b725760405162461bcd60e51b815260206004820152602760248201527f426964206d75737420626520352520686967686572207468616e2070726576696044820152661bdd5cc8189a5960ca1b606482015260840161061b565b611be7565b8060600151341015611bb95760405162461bcd60e51b815260206004820152600b60248201526a151bdbc81b1bddc8189a5960aa1b604482015260640161061b565b426001600160401b03811660c083015260e082018051611bda9083906133d8565b6001600160401b03169052505b6101008101516001600160a01b03811615611c0a57611c0a818360600151612d83565b33610100830152346060830152600e5460e0830151611c339042906001600160401b0316613442565b1015611c5557600e54611c4690426133c0565b6001600160401b031660e08301525b60e08201516040805185815233602082015234818301526001600160401b039092166060830152517fec2561ca82ba6573021727f38daf8f99f0bc9b709f9eddd09d91b056f01277e39181900360800190a181600f8481548110611cc957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600602016000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360ff16021790555060a08201518160040160016101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160040160096101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160040160116101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160050160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050601060008481526020019081526020016000206040518060600160405280336001600160a01b03168152602001348152602001426001600160401b0316815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160401b0302191690836001600160401b0316021790555050505050600160008190555050565b60008181526010602052604090205460609080611f295760405162461bcd60e51b815260206004820152601060248201526f6e6f742061756374696f6e206974656d60801b604482015260640161061b565b600083815260106020908152604080832080548251818502810185019093528083529193909284015b82821015611fb0576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101546001600160401b0316918301919091529083529092019101611f52565b50505050915050919050565b60026000541415611fdf5760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5481106120055760405162461bcd60e51b815260040161061b906132d9565b6000600f828154811061202857634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156120e75760405162461bcd60e51b815260040161061b90613332565b80602001516001600160a01b0316336001600160a01b0316146121725760405162461bcd60e51b815260206004820152603a60248201527f4f6e6c7920746865206974656d2073656c6c65722063616e2070756c6c20616e60448201527f206974656d2066726f6d20746865206d61726b6574706c616365000000000000606482015260840161061b565b6101008101516001600160a01b0316156121e95760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742070756c6c2066726f6d206d61726b6574206f6e6365206120626044820152711a59081a185cc81899595b881c1b1858d95960721b606482015260840161061b565b60a08101516121fa906102586133d8565b6001600160401b03164210156122835760405162461bcd60e51b815260206004820152604260248201527f4d75737420776169742074656e206d696e75746573206166746572206c69737460448201527f696e67206265666f72652070756c6c696e672066726f6d20746865206d61726b606482015261195d60f21b608482015260a40161061b565b60026080820152601154602082015182516040516323b872dd60e01b81526001600160a01b03909316926323b872dd926122c1923092600401613184565b600060405180830381600087803b1580156122db57600080fd5b505af11580156122ef573d6000803e3d6000fd5b5050505080600f838154811061231557634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600690920201908155908201516001820180546001600160a01b039283166001600160a01b031991821617909155604080850151600285015560608501516003850155608085015160048501805460a088015160c089015160e08a01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff909716969096179390931792909216171790559094015160059093018054939092169216919091179055517f3668304292598552a17f3dc2c36115c2df53ebf377a85a5f14ad1595cfb5a6739061242a9084815260200190565b60405180910390a150506001600055565b6002600054141561245e5760405162461bcd60e51b815260040161061b9061335d565b6002600055600f5483106124845760405162461bcd60e51b815260040161061b906132d9565b6000600f84815481106124a757634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015460ff8116608084018190526001600160401b03610100808404821660a0870152600160481b8404821660c0870152600160881b9093041660e0850152600590920154909316928201929092529150156125665760405162461bcd60e51b815260040161061b90613332565b80602001516001600160a01b0316336001600160a01b0316146125e65760405162461bcd60e51b815260206004820152603260248201527f4f6e6c7920746865206974656d2073656c6c65722063616e2074726967676572604482015271103090383934b1b2903932b23ab1ba34b7b760711b606482015260840161061b565b600d548160a001516001600160401b031661260191906133c0565b4210156126765760405162461bcd60e51b815260206004820152603960248201527f4d7573742077616974206166746572206c697374696e67206265666f7265206c60448201527f6f776572696e6720746865206c697374696e6720707269636500000000000000606482015260840161061b565b6101008101516001600160a01b0316156126e95760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f7420726564756365207072696365206f6e6365206120626964206860448201526d185cc81899595b881c1b1858d95960921b606482015260840161061b565b60008211806126f85750600083115b6127385760405162461bcd60e51b81526020600482015260116024820152704d7573742072656475636520707269636560781b604482015260640161061b565b8215612792576000816040015111801561276e575060648160400151605f6127609190613423565b61276a9190613403565b8311155b61278a5760405162461bcd60e51b815260040161061b9061327c565b604081018390525b81156127ec57600081606001511180156127c8575060648160600151605f6127ba9190613423565b6127c49190613403565b8211155b6127e45760405162461bcd60e51b815260040161061b9061327c565b606081018390525b80600f858154811061280e57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600690920201908155908201516001820180546001600160a01b039283166001600160a01b03199182161790915560408085015160028501556060808601516003860155608086015160048601805460a089015160c08a015160e08b01516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0292909216600160481b600160c81b03199190931661010090810268ffffffffffffffffff1990951660ff9097169690961793909317929092161717905590950151600590940180549490931693909116929092179055828101519183015190517fc6890297f86f07076395471a4ac2be4ba632cb7ac8ac34ad5174b77438260ac89261293c928883526020830191909152604082015260600190565b60405180910390a1505060016000555050565b3330146129a95760405162461bcd60e51b815260206004820152602260248201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160448201526118dd60f21b606482015260840161061b565b604080516002808252606082018352600092602083019080368337505060045482519293506001600160a01b0316918391506000906129f857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654825191169082906001908110612a3757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526007805460009182905560035460055460405163b6f9de9560e01b815292949182169363b6f9de95938693612a8b9389929116904290600401613213565b6000604051808303818588803b158015612aa457600080fd5b505af1158015612ab8573d6000803e3d6000fd5b50505050507f9e3a2277f2d2efc712cc3df1192378e0dac5a7a1049ec04a31c87b0bd989cc0381604051612aee91815260200190565b60405180910390a15050565b6001546001600160a01b03163314612b245760405162461bcd60e51b815260040161061b906132fd565b6001600160a01b038116612b895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161061b565b61194c81612e15565b6001546001600160a01b03163314612bbc5760405162461bcd60e51b815260040161061b906132fd565b604051600090339047908381818185875af1925050503d8060008114612bfe576040519150601f19603f3d011682016040523d82523d6000602084013e612c03565b606091505b50505050565b601154604051632b23615b60e21b8152600481018490526000916001600160a01b039081169190841690829063ac8d856c90602401602060405180830381600087803b158015612c5857600080fd5b505af1158015612c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c90919061305c565b6001600160a01b031614949350505050565b60008082612d0857606460085485612cba9190613423565b612cc49190613403565b905060006064600a5486612cd89190613423565b612ce29190613403565b9050612cf6612cf087612f47565b82612d83565b612d008186613442565b945050612d67565b606460095485612d189190613423565b612d229190613403565b905060006064600b5486612d369190613423565b612d409190613403565b600554909150612d59906001600160a01b031682612d83565b612d638186613442565b9450505b612d7081612fcf565b612d7a8185613442565b95945050505050565b6000826001600160a01b031682610dac90604051600060405180830381858888f193505050503d8060008114612dd5576040519150601f19603f3d011682016040523d82523d6000602084013e612dda565b606091505b5050905080610746576001600160a01b03831660009081526002602052604081208054849290612e0b9084906133c0565b9091555050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600380546001600160a01b0319166001600160a01b038316908117909155604080516315ab88c960e31b8152905163ad5c464891600480820192602092909190829003018186803b158015612ebb57600080fd5b505afa158015612ecf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef3919061305c565b600480546001600160a01b0319166001600160a01b0392831617905560405190821681527f455a5e52b7c01aa52d717db42e17b6610b0c2c96560c85b7e5adcdd254bfc17c9060200160405180910390a150565b601154604051632b23615b60e21b8152600481018390526000916001600160a01b031690819063ac8d856c90602401602060405180830381600087803b158015612f9057600080fd5b505af1158015612fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc8919061305c565b9392505050565b8060076000828254612fe191906133c0565b92505081905550306001600160a01b031663e122173c6207a1206040518263ffffffff1660e01b8152600401600060405180830381600088803b15801561302757600080fd5b5087f193505050508015613039575060015b61194c5750565b600060208284031215613051578081fd5b8135612fc88161348a565b60006020828403121561306d578081fd5b8151612fc88161348a565b6000806040838503121561308a578081fd5b82356130958161348a565b946020939093013593505050565b600080600080600060a086880312156130ba578081fd5b85356130c58161348a565b97602087013597506040870135966060810135965060800135945092505050565b6000602082840312156130f7578081fd5b5035919050565b60008060408385031215613110578182fd5b50508035926020909101359150565b600080600060608486031215613133578283fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215613161578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b8281101561320657815180516001600160a01b0316855286810151878601528501516001600160401b031685850152606090930192908501906001016131c5565b5091979650505050505050565b600060808201868352602060808185015281875180845260a0860191508289019350845b8181101561325c5784516001600160a01b031683529383019391830191600101613237565b50506001600160a01b039690961660408501525050506060015292915050565b6020808252603d908201527f52656475636564207072696365206d757374206265206174206c65617374203560408201527f25206c657373207468616e207468652063757272656e74207072696365000000606082015260800190565b6020808252600a9082015269125b9d985b1a59081a5960b21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152704974656d206e6f7420666f722073616c6560781b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b94855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b600082198211156133d3576133d3613474565b500190565b60006001600160401b038083168185168083038211156133fa576133fa613474565b01949350505050565b60008261341e57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561343d5761343d613474565b500290565b60008282101561345457613454613474565b500390565b600060001982141561346d5761346d613474565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461194c57600080fdfea264697066735822122047efd1da175f9a099495bd12f1e2ada3846adb95a24fc735ba73a6ca23bee8c064736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000021684c6b32665922755b5d5677c2df71cd0c64dd0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000008b17fea54d85f61e71bdf161e920762898ac53da000000000000000000000000cd11d4f84e6dd5cf256e595557ebd482399087ec

-----Decoded View---------------
Arg [0] : _dreamNFTAddress (address): 0x21684c6b32665922755b5D5677c2Df71cD0c64dD
Arg [1] : _uniswapRouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _dreamTokenAddress (address): 0x8b17feA54d85F61E71BdF161e920762898AC53da
Arg [3] : _devWallet (address): 0xcD11d4f84E6dD5CF256e595557Ebd482399087ec

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000021684c6b32665922755b5d5677c2df71cd0c64dd
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 0000000000000000000000008b17fea54d85f61e71bdf161e920762898ac53da
Arg [3] : 000000000000000000000000cd11d4f84e6dd5cf256e595557ebd482399087ec


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  ]
[ 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.