Address Details
contract

0xe2e7BaB350B294d9AB65542dd7274A9Ba5311Fb0

Contract Name
AuctionSPU
Creator
0x1cc0fa–12a071 at 0xee8c12–87cab5
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
20 Transactions
Transfers
14 Transfers
Gas Used
965,051
Last Balance Update
15015242
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
AuctionSPU




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
200
EVM Version
london




Verified at
2023-02-05T19:57:35.857130Z

Contracts/AuctionSPU.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/*
    Creatd by : Gustavo Henrique
    Email : gustavo@useinsignia.com
    This auction is created to perform a NFT sell, correspondig to a government property. This code
    is a small part of an entire project. Any questions could be redirect to my email 
*/

// TODO
/*
 1 - Criar NFT teste (+30min) ok
 2 - Inserir documentação (IPFS) Leilão (+45min)
 3 - Criar mintador de leilão (+2hr)
 4 - Criar mintador de NFT (+1hr) ok
 5 - Criar contrato de documentação (+1Dia)
 6 - Criar mintador de documentação (+2hr)
*/

/*
    ERC-721 interface to acess usable functions as safeTransferFrom
*/



interface IERC721 {
    function safeTransferFrom(address from, address to, uint tokenId) external;

    function transferFrom(address, address, uint) external;
}

/*
    Auction contract 
*/

contract AuctionSPU {


    /*
        Events for external reading
    */
    event StartAuction();
    event Bid(address indexed sender, uint amount);
    event Withdraw(address indexed bidder, uint amount);
    event EndAuction(address winner, uint amount);
    event PauseAuction(address pauser);
    event UnpauseAuction(address pauser);
    event Cashback(address indexed bidder, uint amount);
    event SetWhitelistByAddress(address indexed account, bool enable);
    event FeePayment(address indexed feeAddress ,uint totalFee);
    event BidPayment(address indexed seller , uint highestBid);

    /*
        ERC-721 Variables
    */
    IERC721 public nft;
    uint public nftId;

    /*
        Auction parameters
    */

    address payable public seller;
    address payable public feeAddress;
    uint public endAt;
    bool public started;
    bool public ended;
    bool public paused;
    uint public numberOfBids;
    uint private transactionFee;
    uint public constant FEE_BASE = 10000;
    uint public totalFee;

    /*
        Bids parameters
    */
    address public highestBidder;
    uint public highestBid;

    struct Bidders {
        uint totalValue;        
        uint portion;
        uint clientScore;
        uint downpay;
    }    

    mapping(address => Bidders) public receivedBids;

    mapping(address => bool) private _whitelist;

    /*
        Constructor
        _nft -> Address of the nft
        _nftID -> If the nft is part of a collection, default value 0
        _startingBid -> The start value of the auction
        _period -> Duration of the auction , timestampvalue
        seller -> Address of the seller, by default SPU
    */
    constructor(
        address _nft,
        address _feeAddres,
        uint _nftId,
        uint _startingBid,
        uint _period,
        uint _transactionFee
        
    ) {
        nft = IERC721(_nft);
        nftId = _nftId;

        seller = payable(msg.sender);
        feeAddress = payable(_feeAddres);
        highestBid = _startingBid;
        endAt = _period; //timestamp
        transactionFee = _transactionFee; // 10 -> 0.1%
    }

    modifier onlyOwner() {
        require(msg.sender == seller, "Sender is not owner");
        _;
    }

    modifier auctionPaused() {
        require(!paused, "Auction Paused");
        _;
    }

    modifier auctionStarted() {
        require(started, "Not Started Yet");
        _;
    }    


    // Function to receive Ether. msg.data must be empty
    receive() external payable onlyOwner{}

    // Fallback function is called when msg.data is not empty
    fallback() external payable onlyOwner{}

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    /*
        Start the auction
    */

    function startAuction() external onlyOwner {
        require(!started, "Already Started");

        nft.transferFrom(msg.sender, address(this), nftId);
        started = true;

        emit StartAuction();
    }

    /*
        End the auction
    */
    function endAuction() external onlyOwner auctionStarted {
        require(block.timestamp >= endAt, "Not Ended");
        require(!ended, "Already Ended");

        ended = true;        

        emit EndAuction(highestBidder, highestBid);
    }

    /*
        Pause the auction
    */

    function pauseAuction() external onlyOwner {
        require(!paused, "Already Paused");

        paused = true;

        emit PauseAuction(msg.sender);
    }

    /*
        Unpause the auction
    */

    function unpauseAuction() external onlyOwner {
        require(paused, "Already Running");

        paused = false;

        emit UnpauseAuction(msg.sender);
    }

    /*
        Method to receive bids
    */



    // bid -> _realvalue usar esse valor
    // descontar taxa é do msg.value
    // cashback  

    // Adicionar whitelist pra bid
    function newBid(
        uint _totalValue,        
        uint _portion,
        uint _clientScore    
    ) external payable auctionStarted auctionPaused {
        require(block.timestamp < endAt, "Already ended");        
        require(msg.sender != seller, "Seller not allowed");
        require(_isWhitelist(msg.sender), "Permission denied");  

        uint fee = ( msg.value / FEE_BASE) * transactionFee;
        totalFee += fee;  

        require(msg.value - fee > highestBid, "Lower Bid");

        cashback(highestBidder, receivedBids[highestBidder].downpay); 


        if (receivedBids[msg.sender].totalValue != 0) {             
            
            receivedBids[msg.sender].totalValue = _totalValue;
            receivedBids[msg.sender].downpay = msg.value - fee;
            receivedBids[msg.sender].portion = _portion;
            receivedBids[msg.sender].clientScore = _clientScore;

        } else {           

            Bidders memory b;
            b.downpay = msg.value - fee;
            b.totalValue = _totalValue;      
            b.portion = _portion;
            b.clientScore = _clientScore;
            receivedBids[msg.sender] = b;
        }

        highestBidder = msg.sender;
        highestBid = msg.value - fee;
        numberOfBids += 1;

        emit Bid(msg.sender, msg.value - fee);
    }

    function withdraw() external {
        require(!(msg.sender == highestBidder), "Your Bid is the higher");
        require(receivedBids[msg.sender].downpay != 0, "No bids founded");

        cashback(msg.sender, receivedBids[msg.sender].downpay);

        receivedBids[msg.sender].downpay = 0;
        receivedBids[msg.sender].totalValue = 0;
        receivedBids[msg.sender].portion = 0;
        receivedBids[msg.sender].clientScore = 0;

        emit Withdraw(msg.sender, receivedBids[msg.sender].downpay);
    }

    function cashback(address _receiver, uint _amount) internal{
        (bool callSuccess, ) = payable(_receiver).call{value: _amount}("");
        require(callSuccess, "Return funds failed");

        receivedBids[msg.sender].downpay = 0;
        receivedBids[msg.sender].totalValue = 0;
        receivedBids[msg.sender].portion = 0;
        receivedBids[msg.sender].clientScore = 0;

        emit Cashback(_receiver, _amount);
    }    

    function closeAuction () external onlyOwner{
        require(block.timestamp >= endAt, "Not Ended");
        if (highestBidder != address(0)) {
            nft.safeTransferFrom(address(this), highestBidder, nftId);
            
            (bool callSuccessFee, ) = payable(feeAddress).call{value: totalFee}("");
            require(callSuccessFee, "Return fee funds failed");
            
            emit FeePayment(feeAddress , totalFee);
            
            (bool callSuccess, ) = payable(seller).call{value: highestBid}("");
            require(callSuccess, "Return funds failed");

            emit BidPayment(seller , highestBid);
            
        } else {
            nft.safeTransferFrom(address(this), seller, nftId);
            
            (bool callSuccessFee, ) = payable(feeAddress).call{value: totalFee}("");
            require(callSuccessFee, "Return fee funds failed");

            emit FeePayment(feeAddress , totalFee);
            
            (bool callSuccess, ) = payable(seller).call{value: highestBid}("");
            require(callSuccess, "Return funds failed");

            emit BidPayment(seller , highestBid);
        }
    } 

    function setWhitelist(address _account, bool enable) external  onlyOwner{
        _whitelist[_account] = enable;
        emit SetWhitelistByAddress(_account, enable);
    }

    
    function _isWhitelist(address _account) private view returns (bool) {
        return _whitelist[_account];
    }

    
    function isWhitelist(address _account) public view returns (bool) {
        return _isWhitelist(_account);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_nft","internalType":"address"},{"type":"address","name":"_feeAddres","internalType":"address"},{"type":"uint256","name":"_nftId","internalType":"uint256"},{"type":"uint256","name":"_startingBid","internalType":"uint256"},{"type":"uint256","name":"_period","internalType":"uint256"},{"type":"uint256","name":"_transactionFee","internalType":"uint256"}]},{"type":"event","name":"Bid","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BidPayment","inputs":[{"type":"address","name":"seller","internalType":"address","indexed":true},{"type":"uint256","name":"highestBid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Cashback","inputs":[{"type":"address","name":"bidder","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"EndAuction","inputs":[{"type":"address","name":"winner","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeePayment","inputs":[{"type":"address","name":"feeAddress","internalType":"address","indexed":true},{"type":"uint256","name":"totalFee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"PauseAuction","inputs":[{"type":"address","name":"pauser","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetWhitelistByAddress","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"enable","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"StartAuction","inputs":[],"anonymous":false},{"type":"event","name":"UnpauseAuction","inputs":[{"type":"address","name":"pauser","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"bidder","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FEE_BASE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"endAt","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"endAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"ended","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"feeAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"highestBid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"highestBidder","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWhitelist","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"newBid","inputs":[{"type":"uint256","name":"_totalValue","internalType":"uint256"},{"type":"uint256","name":"_portion","internalType":"uint256"},{"type":"uint256","name":"_clientScore","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC721"}],"name":"nft","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nftId","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"numberOfBids","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pauseAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalValue","internalType":"uint256"},{"type":"uint256","name":"portion","internalType":"uint256"},{"type":"uint256","name":"clientScore","internalType":"uint256"},{"type":"uint256","name":"downpay","internalType":"uint256"}],"name":"receivedBids","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"seller","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhitelist","inputs":[{"type":"address","name":"_account","internalType":"address"},{"type":"bool","name":"enable","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"started","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpauseAuction","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b5060405161140338038061140383398101604081905261002f9161009b565b600080546001600160a01b03199081166001600160a01b03988916179091556001949094556002805433908616179055600380549094169490951693909317909155600a556004556007556100f3565b80516001600160a01b038116811461009657600080fd5b919050565b60008060008060008060c087890312156100b457600080fd5b6100bd8761007f565b95506100cb6020880161007f565b945060408701519350606087015192506080870151915060a087015190509295509295509295565b611301806101026000396000f3fe60806040526004361061014f5760003560e01c80636b64c769116100b6578063c6bc51821161006f578063c6bc51821461040e578063ceb1641914610424578063d57bde7914610439578063db15c4371461044f578063ecefc70514610462578063fe67a54b1461047857610189565b80636b64c7691461032c5780637cc3ae8c1461034157806391f901571461035757806395ecc5cc14610377578063b9ae7364146103d9578063c683630d146103ee57610189565b8063378252f211610108578063378252f2146102825780633ccfd60b1461029757806341275358146102ac57806347ccca02146102cc57806353d6fd59146102ec5780635c975abb1461030c57610189565b806308551a53146101b357806312065fe0146101f057806312fa6feb1461020d57806317d531fc1461023c5780631df4ccfc146102525780631f2698ab1461026857610189565b36610189576002546001600160a01b031633146101875760405162461bcd60e51b815260040161017e90611183565b60405180910390fd5b005b6002546001600160a01b031633146101875760405162461bcd60e51b815260040161017e90611183565b3480156101bf57600080fd5b506002546101d3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101fc57600080fd5b50475b6040519081526020016101e7565b34801561021957600080fd5b5060055461022c90610100900460ff1681565b60405190151581526020016101e7565b34801561024857600080fd5b506101ff60065481565b34801561025e57600080fd5b506101ff60085481565b34801561027457600080fd5b5060055461022c9060ff1681565b34801561028e57600080fd5b5061018761048d565b3480156102a357600080fd5b5061018761078e565b3480156102b857600080fd5b506003546101d3906001600160a01b031681565b3480156102d857600080fd5b506000546101d3906001600160a01b031681565b3480156102f857600080fd5b506101876103073660046111cc565b6108ab565b34801561031857600080fd5b5060055461022c9062010000900460ff1681565b34801561033857600080fd5b5061018761092d565b34801561034d57600080fd5b506101ff60045481565b34801561036357600080fd5b506009546101d3906001600160a01b031681565b34801561038357600080fd5b506103b9610392366004611208565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016101e7565b3480156103e557600080fd5b50610187610a42565b3480156103fa57600080fd5b5061022c610409366004611208565b610afd565b34801561041a57600080fd5b506101ff60015481565b34801561043057600080fd5b50610187610b20565b34801561044557600080fd5b506101ff600a5481565b61018761045d36600461122a565b610bd0565b34801561046e57600080fd5b506101ff61271081565b34801561048457600080fd5b50610187610f30565b6002546001600160a01b031633146104b75760405162461bcd60e51b815260040161017e90611183565b6004544210156104f55760405162461bcd60e51b8152602060048201526009602482015268139bdd08115b99195960ba1b604482015260640161017e565b6009546001600160a01b03161561074957600054600954600154604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e906064015b600060405180830381600087803b15801561056157600080fd5b505af1158015610575573d6000803e3d6000fd5b5050600354600854604051600094506001600160a01b039092169250908381818185875af1925050503d80600081146105ca576040519150601f19603f3d011682016040523d82523d6000602084013e6105cf565b606091505b50509050806106205760405162461bcd60e51b815260206004820152601760248201527f52657475726e206665652066756e6473206661696c6564000000000000000000604482015260640161017e565b6003546008546040519081526001600160a01b03909116907e57d762ad8f1734de771f2b521b2668347c0cee2d709a12254662cd5a7d41809060200160405180910390a2600254600a546040516000926001600160a01b031691908381818185875af1925050503d80600081146106b3576040519150601f19603f3d011682016040523d82523d6000602084013e6106b8565b606091505b50509050806106ff5760405162461bcd60e51b815260206004820152601360248201527214995d1d5c9b88199d5b991cc819985a5b1959606a1b604482015260640161017e565b600254600a546040519081526001600160a01b03909116907f1c1b1a7e52e22e996a7b9c93efbf98eeb6171f5ecaa8f5c1c792427b53d29e84906020015b60405180910390a25050565b600054600254600154604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e90606401610547565b6009546001600160a01b031633036107e15760405162461bcd60e51b81526020600482015260166024820152752cb7bab9102134b21034b9903a3432903434b3b432b960511b604482015260640161017e565b336000908152600b602052604081206003015490036108345760405162461bcd60e51b815260206004820152600f60248201526e139bc8189a591cc8199bdd5b991959608a1b604482015260640161017e565b336000818152600b6020526040902060030154610851919061107a565b336000818152600b602090815260408083206003810184905583815560018101849055600201839055519182527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a2565b6002546001600160a01b031633146108d55760405162461bcd60e51b815260040161017e90611183565b6001600160a01b0382166000818152600c6020908152604091829020805460ff191685151590811790915591519182527fc2c8beffdf047b9e6c79b0e9dcd0bd71d174d84f52e013102fcc0e200dd58ee0910161073d565b6002546001600160a01b031633146109575760405162461bcd60e51b815260040161017e90611183565b60055460ff161561099c5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4814dd185c9d1959608a1b604482015260640161017e565b6000546001546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd90606401600060405180830381600087803b1580156109f257600080fd5b505af1158015610a06573d6000803e3d6000fd5b50506005805460ff1916600117905550506040517fd295ebf0a48a9a43d600a6ecb8626baa711d5750dec13a08145013aa30cb92ea90600090a1565b6002546001600160a01b03163314610a6c5760405162461bcd60e51b815260040161017e90611183565b60055462010000900460ff1615610ab65760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4814185d5cd95960921b604482015260640161017e565b6005805462ff00001916620100001790556040513381527fdee06086e53b718fd5176fdaa88a207819a06a56b42087ac2cab84d32a335654906020015b60405180910390a1565b6001600160a01b0381166000908152600c602052604081205460ff165b92915050565b6002546001600160a01b03163314610b4a5760405162461bcd60e51b815260040161017e90611183565b60055462010000900460ff16610b945760405162461bcd60e51b815260206004820152600f60248201526e416c72656164792052756e6e696e6760881b604482015260640161017e565b6005805462ff0000191690556040513381527fc1a02e947cf77134ed09ac0692636f0553306db51ffe4a1d9e7b51b4dcd9c76290602001610af3565b60055460ff16610c145760405162461bcd60e51b815260206004820152600f60248201526e139bdd0814dd185c9d19590816595d608a1b604482015260640161017e565b60055462010000900460ff1615610c5e5760405162461bcd60e51b815260206004820152600e60248201526d105d58dd1a5bdb8814185d5cd95960921b604482015260640161017e565b6004544210610c9f5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e48195b991959609a1b604482015260640161017e565b6002546001600160a01b03163303610cee5760405162461bcd60e51b815260206004820152601260248201527114d95b1b195c881b9bdd08185b1b1bddd95960721b604482015260640161017e565b336000908152600c602052604090205460ff16610d415760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015260640161017e565b600754600090610d536127103461126c565b610d5d919061128e565b90508060086000828254610d7191906112a5565b9091555050600a54610d8382346112b8565b11610dbc5760405162461bcd60e51b8152602060048201526009602482015268131bddd95c88109a5960ba1b604482015260640161017e565b6009546001600160a01b03166000818152600b6020526040902060030154610de4919061107a565b336000908152600b602052604090205415610e3e57336000908152600b60205260409020849055610e1581346112b8565b336000908152600b60205260409020600381019190915560018101849055600201829055610eb2565b610e696040518060800160405280600081526020016000815260200160008152602001600081525090565b610e7382346112b8565b6060820190815285825260208083018681526040808501878152336000908152600b909452922093518455516001840155516002830155516003909101555b600980546001600160a01b03191633179055610ece81346112b8565b600a81905550600160066000828254610ee791906112a5565b909155503390507fe684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d2610f1983346112b8565b60405190815260200160405180910390a250505050565b6002546001600160a01b03163314610f5a5760405162461bcd60e51b815260040161017e90611183565b60055460ff16610f9e5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0814dd185c9d19590816595d608a1b604482015260640161017e565b600454421015610fdc5760405162461bcd60e51b8152602060048201526009602482015268139bdd08115b99195960ba1b604482015260640161017e565b600554610100900460ff16156110245760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e48115b991959609a1b604482015260640161017e565b6005805461ff001916610100179055600954600a54604080516001600160a01b03909316835260208301919091527fca09734d1fc32150404dc9252b4d991c6bee44319031b7159c03d5ae2c0627049101610af3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146110c7576040519150601f19603f3d011682016040523d82523d6000602084013e6110cc565b606091505b50509050806111135760405162461bcd60e51b815260206004820152601360248201527214995d1d5c9b88199d5b991cc819985a5b1959606a1b604482015260640161017e565b336000908152600b6020526040808220600381018390558281556001810183905560020191909155516001600160a01b038416907fe523757eee9c213543af9b06c96e0629da383d3149173f4a03ab96d8ff526760906111769085815260200190565b60405180910390a2505050565b60208082526013908201527229b2b73232b91034b9903737ba1037bbb732b960691b604082015260600190565b80356001600160a01b03811681146111c757600080fd5b919050565b600080604083850312156111df57600080fd5b6111e8836111b0565b9150602083013580151581146111fd57600080fd5b809150509250929050565b60006020828403121561121a57600080fd5b611223826111b0565b9392505050565b60008060006060848603121561123f57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b60008261128957634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610b1a57610b1a611256565b80820180821115610b1a57610b1a611256565b81810381811115610b1a57610b1a61125656fea26469706673582212208e73c8d19f2b6884f3253be9fab1ceaff3f6d975611aae9ad376bb27ab732a2064736f6c63430008110033000000000000000000000000d0ee011a4dc554064d47b8b9cb389896e77f549f0000000000000000000000006adb4bf285b891518cc5ccca07992a768debea90000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000006390e2b00000000000000000000000000000000000000000000000000000000000000064

Deployed ByteCode

0x60806040526004361061014f5760003560e01c80636b64c769116100b6578063c6bc51821161006f578063c6bc51821461040e578063ceb1641914610424578063d57bde7914610439578063db15c4371461044f578063ecefc70514610462578063fe67a54b1461047857610189565b80636b64c7691461032c5780637cc3ae8c1461034157806391f901571461035757806395ecc5cc14610377578063b9ae7364146103d9578063c683630d146103ee57610189565b8063378252f211610108578063378252f2146102825780633ccfd60b1461029757806341275358146102ac57806347ccca02146102cc57806353d6fd59146102ec5780635c975abb1461030c57610189565b806308551a53146101b357806312065fe0146101f057806312fa6feb1461020d57806317d531fc1461023c5780631df4ccfc146102525780631f2698ab1461026857610189565b36610189576002546001600160a01b031633146101875760405162461bcd60e51b815260040161017e90611183565b60405180910390fd5b005b6002546001600160a01b031633146101875760405162461bcd60e51b815260040161017e90611183565b3480156101bf57600080fd5b506002546101d3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101fc57600080fd5b50475b6040519081526020016101e7565b34801561021957600080fd5b5060055461022c90610100900460ff1681565b60405190151581526020016101e7565b34801561024857600080fd5b506101ff60065481565b34801561025e57600080fd5b506101ff60085481565b34801561027457600080fd5b5060055461022c9060ff1681565b34801561028e57600080fd5b5061018761048d565b3480156102a357600080fd5b5061018761078e565b3480156102b857600080fd5b506003546101d3906001600160a01b031681565b3480156102d857600080fd5b506000546101d3906001600160a01b031681565b3480156102f857600080fd5b506101876103073660046111cc565b6108ab565b34801561031857600080fd5b5060055461022c9062010000900460ff1681565b34801561033857600080fd5b5061018761092d565b34801561034d57600080fd5b506101ff60045481565b34801561036357600080fd5b506009546101d3906001600160a01b031681565b34801561038357600080fd5b506103b9610392366004611208565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016101e7565b3480156103e557600080fd5b50610187610a42565b3480156103fa57600080fd5b5061022c610409366004611208565b610afd565b34801561041a57600080fd5b506101ff60015481565b34801561043057600080fd5b50610187610b20565b34801561044557600080fd5b506101ff600a5481565b61018761045d36600461122a565b610bd0565b34801561046e57600080fd5b506101ff61271081565b34801561048457600080fd5b50610187610f30565b6002546001600160a01b031633146104b75760405162461bcd60e51b815260040161017e90611183565b6004544210156104f55760405162461bcd60e51b8152602060048201526009602482015268139bdd08115b99195960ba1b604482015260640161017e565b6009546001600160a01b03161561074957600054600954600154604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e906064015b600060405180830381600087803b15801561056157600080fd5b505af1158015610575573d6000803e3d6000fd5b5050600354600854604051600094506001600160a01b039092169250908381818185875af1925050503d80600081146105ca576040519150601f19603f3d011682016040523d82523d6000602084013e6105cf565b606091505b50509050806106205760405162461bcd60e51b815260206004820152601760248201527f52657475726e206665652066756e6473206661696c6564000000000000000000604482015260640161017e565b6003546008546040519081526001600160a01b03909116907e57d762ad8f1734de771f2b521b2668347c0cee2d709a12254662cd5a7d41809060200160405180910390a2600254600a546040516000926001600160a01b031691908381818185875af1925050503d80600081146106b3576040519150601f19603f3d011682016040523d82523d6000602084013e6106b8565b606091505b50509050806106ff5760405162461bcd60e51b815260206004820152601360248201527214995d1d5c9b88199d5b991cc819985a5b1959606a1b604482015260640161017e565b600254600a546040519081526001600160a01b03909116907f1c1b1a7e52e22e996a7b9c93efbf98eeb6171f5ecaa8f5c1c792427b53d29e84906020015b60405180910390a25050565b600054600254600154604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e90606401610547565b6009546001600160a01b031633036107e15760405162461bcd60e51b81526020600482015260166024820152752cb7bab9102134b21034b9903a3432903434b3b432b960511b604482015260640161017e565b336000908152600b602052604081206003015490036108345760405162461bcd60e51b815260206004820152600f60248201526e139bc8189a591cc8199bdd5b991959608a1b604482015260640161017e565b336000818152600b6020526040902060030154610851919061107a565b336000818152600b602090815260408083206003810184905583815560018101849055600201839055519182527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a2565b6002546001600160a01b031633146108d55760405162461bcd60e51b815260040161017e90611183565b6001600160a01b0382166000818152600c6020908152604091829020805460ff191685151590811790915591519182527fc2c8beffdf047b9e6c79b0e9dcd0bd71d174d84f52e013102fcc0e200dd58ee0910161073d565b6002546001600160a01b031633146109575760405162461bcd60e51b815260040161017e90611183565b60055460ff161561099c5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4814dd185c9d1959608a1b604482015260640161017e565b6000546001546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd90606401600060405180830381600087803b1580156109f257600080fd5b505af1158015610a06573d6000803e3d6000fd5b50506005805460ff1916600117905550506040517fd295ebf0a48a9a43d600a6ecb8626baa711d5750dec13a08145013aa30cb92ea90600090a1565b6002546001600160a01b03163314610a6c5760405162461bcd60e51b815260040161017e90611183565b60055462010000900460ff1615610ab65760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4814185d5cd95960921b604482015260640161017e565b6005805462ff00001916620100001790556040513381527fdee06086e53b718fd5176fdaa88a207819a06a56b42087ac2cab84d32a335654906020015b60405180910390a1565b6001600160a01b0381166000908152600c602052604081205460ff165b92915050565b6002546001600160a01b03163314610b4a5760405162461bcd60e51b815260040161017e90611183565b60055462010000900460ff16610b945760405162461bcd60e51b815260206004820152600f60248201526e416c72656164792052756e6e696e6760881b604482015260640161017e565b6005805462ff0000191690556040513381527fc1a02e947cf77134ed09ac0692636f0553306db51ffe4a1d9e7b51b4dcd9c76290602001610af3565b60055460ff16610c145760405162461bcd60e51b815260206004820152600f60248201526e139bdd0814dd185c9d19590816595d608a1b604482015260640161017e565b60055462010000900460ff1615610c5e5760405162461bcd60e51b815260206004820152600e60248201526d105d58dd1a5bdb8814185d5cd95960921b604482015260640161017e565b6004544210610c9f5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e48195b991959609a1b604482015260640161017e565b6002546001600160a01b03163303610cee5760405162461bcd60e51b815260206004820152601260248201527114d95b1b195c881b9bdd08185b1b1bddd95960721b604482015260640161017e565b336000908152600c602052604090205460ff16610d415760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015260640161017e565b600754600090610d536127103461126c565b610d5d919061128e565b90508060086000828254610d7191906112a5565b9091555050600a54610d8382346112b8565b11610dbc5760405162461bcd60e51b8152602060048201526009602482015268131bddd95c88109a5960ba1b604482015260640161017e565b6009546001600160a01b03166000818152600b6020526040902060030154610de4919061107a565b336000908152600b602052604090205415610e3e57336000908152600b60205260409020849055610e1581346112b8565b336000908152600b60205260409020600381019190915560018101849055600201829055610eb2565b610e696040518060800160405280600081526020016000815260200160008152602001600081525090565b610e7382346112b8565b6060820190815285825260208083018681526040808501878152336000908152600b909452922093518455516001840155516002830155516003909101555b600980546001600160a01b03191633179055610ece81346112b8565b600a81905550600160066000828254610ee791906112a5565b909155503390507fe684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d2610f1983346112b8565b60405190815260200160405180910390a250505050565b6002546001600160a01b03163314610f5a5760405162461bcd60e51b815260040161017e90611183565b60055460ff16610f9e5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0814dd185c9d19590816595d608a1b604482015260640161017e565b600454421015610fdc5760405162461bcd60e51b8152602060048201526009602482015268139bdd08115b99195960ba1b604482015260640161017e565b600554610100900460ff16156110245760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e48115b991959609a1b604482015260640161017e565b6005805461ff001916610100179055600954600a54604080516001600160a01b03909316835260208301919091527fca09734d1fc32150404dc9252b4d991c6bee44319031b7159c03d5ae2c0627049101610af3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146110c7576040519150601f19603f3d011682016040523d82523d6000602084013e6110cc565b606091505b50509050806111135760405162461bcd60e51b815260206004820152601360248201527214995d1d5c9b88199d5b991cc819985a5b1959606a1b604482015260640161017e565b336000908152600b6020526040808220600381018390558281556001810183905560020191909155516001600160a01b038416907fe523757eee9c213543af9b06c96e0629da383d3149173f4a03ab96d8ff526760906111769085815260200190565b60405180910390a2505050565b60208082526013908201527229b2b73232b91034b9903737ba1037bbb732b960691b604082015260600190565b80356001600160a01b03811681146111c757600080fd5b919050565b600080604083850312156111df57600080fd5b6111e8836111b0565b9150602083013580151581146111fd57600080fd5b809150509250929050565b60006020828403121561121a57600080fd5b611223826111b0565b9392505050565b60008060006060848603121561123f57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b60008261128957634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610b1a57610b1a611256565b80820180821115610b1a57610b1a611256565b81810381811115610b1a57610b1a61125656fea26469706673582212208e73c8d19f2b6884f3253be9fab1ceaff3f6d975611aae9ad376bb27ab732a2064736f6c63430008110033