false
false
0

Contract Address Details

0x91Aa85a172DD3e7EEA4ad1A4B33E90cbF3B99ed8

Token
Luxury Lofts (LOFT)
Creator
0xba5c92–f704f0 at 0xeaf6ac–d21c6e
Balance
0 SGB
Tokens
Fetching tokens...
Transactions
3,038 Transactions
Transfers
1 Transfers
Gas Used
240,880,009
Last Balance Update
59349532
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
LuxuryLofts




Optimization enabled
true
Compiler version
v0.8.12+commit.f00d7308




Optimization runs
200
EVM Version
default




Verified at
2022-03-17T20:11:25.893676Z

Constructor Arguments

00000000000000000000000035afb6ba51839dedd33140a3b704b39933d1e642

Arg [0] (address) : 0x35afb6ba51839dedd33140a3b704b39933d1e642

              

Contract source code

//SPDX-License-Identifier: MIT
pragma solidity 0.8.12;

error NotOwner();

abstract contract LilOwnable {
    address internal _owner;

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

    constructor() {
        _owner = msg.sender;
    }

    function owner() external view returns (address) {
        return _owner;
    }

    function transferOwnership(address _newOwner) external {
        if (msg.sender != _owner) revert NotOwner();

        _owner = _newOwner;
    }

    function renounceOwnership() public {
        if (msg.sender != _owner) revert NotOwner();

        _owner = address(0);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return interfaceId == 0x7f5828d0; // ERC165 Interface ID for ERC173
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

error DoesNotExist();
error NotFromToadz();

contract LuxuryLofts is LilOwnable, ERC721 {
    using Strings for uint256;

    uint256 public totalSupply;
    uint256 public teamStart = 6000;
    uint256 public totalLLAmount = 10000;
    string public baseURI;
	address public immutable TOADZ;

    modifier onlyOwner() {
        require(msg.sender == _owner, "Ownable: caller is not the owner");
        _;
    }
    

    constructor(address _toadzContract) payable ERC721("Luxury Lofts", "LOFT") {
		TOADZ = _toadzContract;
    }

    function mintFromToadz(address to, uint16 amount) external payable {    
		if(msg.sender != TOADZ) revert NotFromToadz();
        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(to, totalSupply + 1);
                totalSupply++;
            }
        }
    }

    function mintRemainderToOwner(address _to, uint256 _amount) public onlyOwner {
        require (teamStart + _amount <= totalLLAmount, "Reached max mint amount for SBC NFTs");
        for (uint16 index = 0; index < _amount; index++) {
            _mint(_to, teamStart + 1);
            teamStart++;
        }
    }

    function tokenURI(uint256 id) public view virtual override returns (string memory) {
        if (ownerOf[id] == address(0)) revert DoesNotExist();

        return string(abi.encodePacked(baseURI, id.toString(), ".json"));
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    /// @dev Tells interfacing contracts what they can do with this one
    function supportsInterface(bytes4 interfaceId)
        public
        pure
        override(LilOwnable, ERC721)
        returns (bool)
    {
        return
            interfaceId == 0x7f5828d0 || // ERC165 Interface ID for ERC173
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC165
            interfaceId == 0x01ffc9a7; // ERC165 Interface ID for ERC721Metadata
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"address","name":"_toadzContract","internalType":"address"}]},{"type":"error","name":"DoesNotExist","inputs":[]},{"type":"error","name":"NotFromToadz","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"TOADZ","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"baseURI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"mintFromToadz","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint16","name":"amount","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintRemainderToOwner","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBaseURI","inputs":[{"type":"string","name":"_newBaseURI","internalType":"string"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"teamStart","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLLAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]}]
              

Contract Creation Code

0x60a06040526117706008556127106009556040516200181538038062001815833981016040819052620000329162000165565b604080518082018252600c81526b4c7578757279204c6f66747360a01b6020808301918252835180850190945260048452631313d19560e21b90840152600080546001600160a01b0319163317905581519192916200009491600191620000bf565b508051620000aa906002906020840190620000bf565b5050506001600160a01b0316608052620001d4565b828054620000cd9062000197565b90600052602060002090601f016020900481019282620000f157600085556200013c565b82601f106200010c57805160ff19168380011785556200013c565b828001600101855582156200013c579182015b828111156200013c5782518255916020019190600101906200011f565b506200014a9291506200014e565b5090565b5b808211156200014a57600081556001016200014f565b6000602082840312156200017857600080fd5b81516001600160a01b03811681146200019057600080fd5b9392505050565b600181811c90821680620001ac57607f821691505b60208210811415620001ce57634e487b7160e01b600052602260045260246000fd5b50919050565b60805161161e620001f7600039600081816102290152610a89015261161e6000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b1d66ced1161006f578063b1d66ced146103db578063b88d4fde146103ee578063c87b56dd1461040e578063e656a8851461042e578063e985e9c51461044e578063f2fde38b1461048957600080fd5b806370a0823114610330578063715018a61461035d57806386cfa924146103725780638da5cb5b1461038857806395d89b41146103a6578063a22cb465146103bb57600080fd5b806323b872dd1161010857806323b872dd1461026f57806342842e0e1461028f5780634c2afb90146102af57806355f804b3146102c55780636352211e146102e55780636c0360eb1461031b57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101f55780630dbd69a11461021757806318160ddd1461024b575b600080fd5b34801561015c57600080fd5b5061017061016b36600461106e565b6104a9565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610516565b60405161017c91906110ea565b3480156101b357600080fd5b506101dd6101c23660046110fd565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161017c565b34801561020157600080fd5b50610215610210366004611132565b6105a4565b005b34801561022357600080fd5b506101dd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561025757600080fd5b5061026160075481565b60405190815260200161017c565b34801561027b57600080fd5b5061021561028a36600461115c565b61068b565b34801561029b57600080fd5b506102156102aa36600461115c565b610852565b3480156102bb57600080fd5b5061026160095481565b3480156102d157600080fd5b506102156102e0366004611224565b61094a565b3480156102f157600080fd5b506101dd6103003660046110fd565b6004602052600090815260409020546001600160a01b031681565b34801561032757600080fd5b5061019a6109bb565b34801561033c57600080fd5b5061026161034b36600461126d565b60036020526000908152604090205481565b34801561036957600080fd5b506102156109c8565b34801561037e57600080fd5b5061026160085481565b34801561039457600080fd5b506000546001600160a01b03166101dd565b3480156103b257600080fd5b5061019a610a05565b3480156103c757600080fd5b506102156103d6366004611288565b610a12565b6102156103e93660046112c4565b610a7e565b3480156103fa57600080fd5b506102156104093660046112f7565b610afb565b34801561041a57600080fd5b5061019a6104293660046110fd565b610be0565b34801561043a57600080fd5b50610215610449366004611132565b610c4a565b34801561045a57600080fd5b50610170610469366004611373565b600660209081526000928352604080842090915290825290205460ff1681565b34801561049557600080fd5b506102156104a436600461126d565b610d5e565b60006307f5828d60e41b6001600160e01b0319831614806104da57506380ac58cd60e01b6001600160e01b03198316145b806104f55750635b5e139f60e01b6001600160e01b03198316145b8061051057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60018054610523906113a6565b80601f016020809104026020016040519081016040528092919081815260200182805461054f906113a6565b801561059c5780601f106105715761010080835404028352916020019161059c565b820191906000526020600020905b81548152906001019060200180831161057f57829003601f168201915b505050505081565b6000818152600460205260409020546001600160a01b0316338114806105ed57506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b61062f5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600460205260409020546001600160a01b038481169116146106e15760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610626565b6001600160a01b03821661072b5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610626565b336001600160a01b038416148061075857506000818152600560205260409020546001600160a01b031633145b8061078657506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b6107c35760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610626565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526004825284832080546001600160a01b03199081168317909155600590925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61085d83838361068b565b6001600160a01b0382163b15806109065750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156108d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fa91906113e1565b6001600160e01b031916145b6109455760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610626565b505050565b6000546001600160a01b031633146109a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610626565b80516109b790600a906020840190610fbc565b5050565b600a8054610523906113a6565b6000546001600160a01b031633146109f3576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319169055565b60028054610523906113a6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ac75760405163760a111760e11b815260040160405180910390fd5b60005b8161ffff168161ffff16101561094557610ae983600754600101610dab565b60078054600190810190915501610aca565b610b0684848461068b565b6001600160a01b0383163b1580610b9b5750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610b4c9033908990889088906004016113fe565b6020604051808303816000875af1158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906113e1565b6001600160e01b031916145b610bda5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610626565b50505050565b6000818152600460205260409020546060906001600160a01b0316610c185760405163b0ce759160e01b815260040160405180910390fd5b600a610c2383610eb6565b604051602001610c34929190611457565b6040516020818303038152906040529050919050565b6000546001600160a01b03163314610ca45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610626565b60095481600854610cb59190611528565b1115610d0f5760405162461bcd60e51b8152602060048201526024808201527f52656163686564206d6178206d696e7420616d6f756e7420666f7220534243206044820152634e46547360e01b6064820152608401610626565b60005b818161ffff16101561094557610d36836008546001610d319190611528565b610dab565b60088054906000610d4683611540565b91905055508080610d569061155b565b915050610d12565b6000546001600160a01b03163314610d89576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610df55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610626565b6000818152600460205260409020546001600160a01b031615610e4b5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610626565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081610eda5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f045780610eee81611540565b9150610efd9050600a83611593565b9150610ede565b60008167ffffffffffffffff811115610f1f57610f1f611198565b6040519080825280601f01601f191660200182016040528015610f49576020820181803683370190505b5090505b8415610fb457610f5e6001836115a7565b9150610f6b600a866115be565b610f76906030611528565b60f81b818381518110610f8b57610f8b6115d2565b60200101906001600160f81b031916908160001a905350610fad600a86611593565b9450610f4d565b949350505050565b828054610fc8906113a6565b90600052602060002090601f016020900481019282610fea5760008555611030565b82601f1061100357805160ff1916838001178555611030565b82800160010185558215611030579182015b82811115611030578251825591602001919060010190611015565b5061103c929150611040565b5090565b5b8082111561103c5760008155600101611041565b6001600160e01b03198116811461106b57600080fd5b50565b60006020828403121561108057600080fd5b813561108b81611055565b9392505050565b60005b838110156110ad578181015183820152602001611095565b83811115610bda5750506000910152565b600081518084526110d6816020860160208601611092565b601f01601f19169290920160200192915050565b60208152600061108b60208301846110be565b60006020828403121561110f57600080fd5b5035919050565b80356001600160a01b038116811461112d57600080fd5b919050565b6000806040838503121561114557600080fd5b61114e83611116565b946020939093013593505050565b60008060006060848603121561117157600080fd5b61117a84611116565b925061118860208501611116565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156111c9576111c9611198565b604051601f8501601f19908116603f011681019082821181831017156111f1576111f1611198565b8160405280935085815286868601111561120a57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561123657600080fd5b813567ffffffffffffffff81111561124d57600080fd5b8201601f8101841361125e57600080fd5b610fb4848235602084016111ae565b60006020828403121561127f57600080fd5b61108b82611116565b6000806040838503121561129b57600080fd5b6112a483611116565b9150602083013580151581146112b957600080fd5b809150509250929050565b600080604083850312156112d757600080fd5b6112e083611116565b9150602083013561ffff811681146112b957600080fd5b6000806000806080858703121561130d57600080fd5b61131685611116565b935061132460208601611116565b925060408501359150606085013567ffffffffffffffff81111561134757600080fd5b8501601f8101871361135857600080fd5b611367878235602084016111ae565b91505092959194509250565b6000806040838503121561138657600080fd5b61138f83611116565b915061139d60208401611116565b90509250929050565b600181811c908216806113ba57607f821691505b602082108114156113db57634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156113f357600080fd5b815161108b81611055565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611431908301846110be565b9695505050505050565b6000815161144d818560208601611092565b9290920192915050565b600080845481600182811c91508083168061147357607f831692505b602080841082141561149357634e487b7160e01b86526022600452602486fd5b8180156114a757600181146114b8576114e5565b60ff198616895284890196506114e5565b60008b81526020902060005b868110156114dd5781548b8201529085019083016114c4565b505084890196505b5050505050506115096114f8828661143b565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561153b5761153b611512565b500190565b600060001982141561155457611554611512565b5060010190565b600061ffff8083168181141561157357611573611512565b6001019392505050565b634e487b7160e01b600052601260045260246000fd5b6000826115a2576115a261157d565b500490565b6000828210156115b9576115b9611512565b500390565b6000826115cd576115cd61157d565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220abe0fa807456724eeb6529d6c231f212897e2be1ce3551fe9f0544e1b61c060664736f6c634300080c003300000000000000000000000035afb6ba51839dedd33140a3b704b39933d1e642

Deployed ByteCode

0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b1d66ced1161006f578063b1d66ced146103db578063b88d4fde146103ee578063c87b56dd1461040e578063e656a8851461042e578063e985e9c51461044e578063f2fde38b1461048957600080fd5b806370a0823114610330578063715018a61461035d57806386cfa924146103725780638da5cb5b1461038857806395d89b41146103a6578063a22cb465146103bb57600080fd5b806323b872dd1161010857806323b872dd1461026f57806342842e0e1461028f5780634c2afb90146102af57806355f804b3146102c55780636352211e146102e55780636c0360eb1461031b57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101f55780630dbd69a11461021757806318160ddd1461024b575b600080fd5b34801561015c57600080fd5b5061017061016b36600461106e565b6104a9565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610516565b60405161017c91906110ea565b3480156101b357600080fd5b506101dd6101c23660046110fd565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161017c565b34801561020157600080fd5b50610215610210366004611132565b6105a4565b005b34801561022357600080fd5b506101dd7f00000000000000000000000035afb6ba51839dedd33140a3b704b39933d1e64281565b34801561025757600080fd5b5061026160075481565b60405190815260200161017c565b34801561027b57600080fd5b5061021561028a36600461115c565b61068b565b34801561029b57600080fd5b506102156102aa36600461115c565b610852565b3480156102bb57600080fd5b5061026160095481565b3480156102d157600080fd5b506102156102e0366004611224565b61094a565b3480156102f157600080fd5b506101dd6103003660046110fd565b6004602052600090815260409020546001600160a01b031681565b34801561032757600080fd5b5061019a6109bb565b34801561033c57600080fd5b5061026161034b36600461126d565b60036020526000908152604090205481565b34801561036957600080fd5b506102156109c8565b34801561037e57600080fd5b5061026160085481565b34801561039457600080fd5b506000546001600160a01b03166101dd565b3480156103b257600080fd5b5061019a610a05565b3480156103c757600080fd5b506102156103d6366004611288565b610a12565b6102156103e93660046112c4565b610a7e565b3480156103fa57600080fd5b506102156104093660046112f7565b610afb565b34801561041a57600080fd5b5061019a6104293660046110fd565b610be0565b34801561043a57600080fd5b50610215610449366004611132565b610c4a565b34801561045a57600080fd5b50610170610469366004611373565b600660209081526000928352604080842090915290825290205460ff1681565b34801561049557600080fd5b506102156104a436600461126d565b610d5e565b60006307f5828d60e41b6001600160e01b0319831614806104da57506380ac58cd60e01b6001600160e01b03198316145b806104f55750635b5e139f60e01b6001600160e01b03198316145b8061051057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60018054610523906113a6565b80601f016020809104026020016040519081016040528092919081815260200182805461054f906113a6565b801561059c5780601f106105715761010080835404028352916020019161059c565b820191906000526020600020905b81548152906001019060200180831161057f57829003601f168201915b505050505081565b6000818152600460205260409020546001600160a01b0316338114806105ed57506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b61062f5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600460205260409020546001600160a01b038481169116146106e15760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610626565b6001600160a01b03821661072b5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610626565b336001600160a01b038416148061075857506000818152600560205260409020546001600160a01b031633145b8061078657506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b6107c35760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610626565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526004825284832080546001600160a01b03199081168317909155600590925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61085d83838361068b565b6001600160a01b0382163b15806109065750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156108d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fa91906113e1565b6001600160e01b031916145b6109455760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610626565b505050565b6000546001600160a01b031633146109a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610626565b80516109b790600a906020840190610fbc565b5050565b600a8054610523906113a6565b6000546001600160a01b031633146109f3576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319169055565b60028054610523906113a6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336001600160a01b037f00000000000000000000000035afb6ba51839dedd33140a3b704b39933d1e6421614610ac75760405163760a111760e11b815260040160405180910390fd5b60005b8161ffff168161ffff16101561094557610ae983600754600101610dab565b60078054600190810190915501610aca565b610b0684848461068b565b6001600160a01b0383163b1580610b9b5750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610b4c9033908990889088906004016113fe565b6020604051808303816000875af1158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906113e1565b6001600160e01b031916145b610bda5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610626565b50505050565b6000818152600460205260409020546060906001600160a01b0316610c185760405163b0ce759160e01b815260040160405180910390fd5b600a610c2383610eb6565b604051602001610c34929190611457565b6040516020818303038152906040529050919050565b6000546001600160a01b03163314610ca45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610626565b60095481600854610cb59190611528565b1115610d0f5760405162461bcd60e51b8152602060048201526024808201527f52656163686564206d6178206d696e7420616d6f756e7420666f7220534243206044820152634e46547360e01b6064820152608401610626565b60005b818161ffff16101561094557610d36836008546001610d319190611528565b610dab565b60088054906000610d4683611540565b91905055508080610d569061155b565b915050610d12565b6000546001600160a01b03163314610d89576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610df55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610626565b6000818152600460205260409020546001600160a01b031615610e4b5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610626565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081610eda5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f045780610eee81611540565b9150610efd9050600a83611593565b9150610ede565b60008167ffffffffffffffff811115610f1f57610f1f611198565b6040519080825280601f01601f191660200182016040528015610f49576020820181803683370190505b5090505b8415610fb457610f5e6001836115a7565b9150610f6b600a866115be565b610f76906030611528565b60f81b818381518110610f8b57610f8b6115d2565b60200101906001600160f81b031916908160001a905350610fad600a86611593565b9450610f4d565b949350505050565b828054610fc8906113a6565b90600052602060002090601f016020900481019282610fea5760008555611030565b82601f1061100357805160ff1916838001178555611030565b82800160010185558215611030579182015b82811115611030578251825591602001919060010190611015565b5061103c929150611040565b5090565b5b8082111561103c5760008155600101611041565b6001600160e01b03198116811461106b57600080fd5b50565b60006020828403121561108057600080fd5b813561108b81611055565b9392505050565b60005b838110156110ad578181015183820152602001611095565b83811115610bda5750506000910152565b600081518084526110d6816020860160208601611092565b601f01601f19169290920160200192915050565b60208152600061108b60208301846110be565b60006020828403121561110f57600080fd5b5035919050565b80356001600160a01b038116811461112d57600080fd5b919050565b6000806040838503121561114557600080fd5b61114e83611116565b946020939093013593505050565b60008060006060848603121561117157600080fd5b61117a84611116565b925061118860208501611116565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156111c9576111c9611198565b604051601f8501601f19908116603f011681019082821181831017156111f1576111f1611198565b8160405280935085815286868601111561120a57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561123657600080fd5b813567ffffffffffffffff81111561124d57600080fd5b8201601f8101841361125e57600080fd5b610fb4848235602084016111ae565b60006020828403121561127f57600080fd5b61108b82611116565b6000806040838503121561129b57600080fd5b6112a483611116565b9150602083013580151581146112b957600080fd5b809150509250929050565b600080604083850312156112d757600080fd5b6112e083611116565b9150602083013561ffff811681146112b957600080fd5b6000806000806080858703121561130d57600080fd5b61131685611116565b935061132460208601611116565b925060408501359150606085013567ffffffffffffffff81111561134757600080fd5b8501601f8101871361135857600080fd5b611367878235602084016111ae565b91505092959194509250565b6000806040838503121561138657600080fd5b61138f83611116565b915061139d60208401611116565b90509250929050565b600181811c908216806113ba57607f821691505b602082108114156113db57634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156113f357600080fd5b815161108b81611055565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611431908301846110be565b9695505050505050565b6000815161144d818560208601611092565b9290920192915050565b600080845481600182811c91508083168061147357607f831692505b602080841082141561149357634e487b7160e01b86526022600452602486fd5b8180156114a757600181146114b8576114e5565b60ff198616895284890196506114e5565b60008b81526020902060005b868110156114dd5781548b8201529085019083016114c4565b505084890196505b5050505050506115096114f8828661143b565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561153b5761153b611512565b500190565b600060001982141561155457611554611512565b5060010190565b600061ffff8083168181141561157357611573611512565b6001019392505050565b634e487b7160e01b600052601260045260246000fd5b6000826115a2576115a261157d565b500490565b6000828210156115b9576115b9611512565b500390565b6000826115cd576115cd61157d565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220abe0fa807456724eeb6529d6c231f212897e2be1ce3551fe9f0544e1b61c060664736f6c634300080c0033