false
false
0

Contract Address Details

0x35afb6Ba51839dEDD33140A3b704b39933D1e642

Token
sToadz (STOADZ)
Creator
0xba5c92–f704f0 at 0x5f2828–22378e
Balance
0 SGB
Tokens
Fetching tokens...
Transactions
5,220 Transactions
Transfers
1,406 Transfers
Gas Used
928,265,226
Last Balance Update
58976574
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
sToadz




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




Optimization runs
200
EVM Version
default




Verified at
2022-03-17T20:06:33.870235Z

Contract source code

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

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 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"
        );
    }
}

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

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

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool callStatus;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                           ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}

/*

    _____               _     
 __|_   _|__   __ _  __| |____
/ __|| |/ _ \ / _` |/ _` |_  /
\__ \| | (_) | (_| | (_| |/ / 
|___/|_|\___/ \__,_|\__,_/___|                       


*/

error DoesNotExist();
error NoTokensLeft();
error NotEnoughETH();
error TooManyMintAtOnce();
error MintNotStarted();
error EmptyBalance();
error CannotMintZero();

interface AirdropNft {
	function mintFromToadz(address to, uint16 amount) external payable;
}

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

	uint256 public constant publicMintMaxSupply = 6000;
    uint256 public constant mintPrice = 1200 ether;
    address public constant sRibbits = 0x399E279c814a3100065fceaB8CbA1aB114805344;
    uint256 public maxPublicMintAmount = 50;

    bool public mintStarted = false;

    uint256 public totalSupply;
	uint256 public publicMintSupply;

    string public baseURI;

    address[5] public _royaltyAddresses; 

	AirdropNft public SongBirdCity;
	AirdropNft public LuxuryLoft;
	 
	address[][] private airdropAddresses;
	uint256[][] private airdropAmounts;
	uint256 private airdropIndex;	 

    mapping(address => uint256) private _royaltyShares;

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

    constructor() payable ERC721("sToadz", "STOADZ") {

        address[5] memory _contributorAddresses = [ 
            0xb20F2a4601aED75B886CC5B84E28a0D65a7Bfd48, 
            0x90ca2B438482f2b205dA814B94b4758c3a229541, 
            0x8e23A0C18D2Fd631eFA838aCC1DfBecbbdB3ADD9, 
            0xc8d015b94a3Fb41DC13d6a9573bb454300023A94, 
            0x5B588e36FF358D4376A76FB163fd69Da02A2A9a5
        ];

        _royaltyAddresses[0] = _contributorAddresses[0]; 
        _royaltyAddresses[1] = _contributorAddresses[1];
        _royaltyAddresses[2] = _contributorAddresses[2];
        _royaltyAddresses[3] = _contributorAddresses[3]; 
        _royaltyAddresses[4] = _contributorAddresses[4];

        _royaltyShares[_royaltyAddresses[0]] = 498;
        _royaltyShares[_royaltyAddresses[1]] = 581;
        _royaltyShares[_royaltyAddresses[2]] = 581;
        _royaltyShares[_royaltyAddresses[3]] = 8090;
        _royaltyShares[_royaltyAddresses[4]] = 250;		  
    }


	 /* Split the airdrop to avoid exceeding the block gas limit
	   Call this multiple times to get through the airdrop indices */

	function airdrop() external onlyOwner {
        address[] memory recipients = airdropAddresses[airdropIndex];
        uint256[] memory numAllowed = airdropAmounts[airdropIndex];
		
	    uint256 length = recipients.length;
        for (uint256 i = 0; i < length; i++) {
                address recipient = recipients[i];
                uint256 numToMint = numAllowed[i];
                
                for(uint256 j=0; j <numToMint; j++) {
                    _mint(recipient, totalSupply + 1);
                    totalSupply++;
                }
        }
        
        airdropIndex++;
    }

	function setAirdropInfo(address[][] memory _airdropAddresses, uint256[][] memory _airdropAmounts) external onlyOwner {
        airdropAddresses = _airdropAddresses;
        airdropAmounts = _airdropAmounts;
	}
	 

    function mint(uint16 amount) external payable {
		if(amount == 0) revert CannotMintZero();
        if (publicMintSupply + amount > publicMintMaxSupply) revert NoTokensLeft();
        if (!mintStarted) revert MintNotStarted();
        if (msg.value < amount * mintPrice) revert NotEnoughETH();
        if (amount > maxPublicMintAmount) revert TooManyMintAtOnce();

        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(msg.sender, totalSupply + 1);
                totalSupply++;
					 publicMintSupply++;
            }
        }
		uint256 amountToSend = uint256(amount) * 3500 ether;
        SafeTransferLib.safeTransfer(ERC20(sRibbits), msg.sender, amountToSend);
        SongBirdCity.mintFromToadz(msg.sender, amount);
        LuxuryLoft.mintFromToadz(msg.sender, amount);
    }

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

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

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

    function startMint() public onlyOwner {
        mintStarted = true;
    }

    function pauseMint() public onlyOwner {
        mintStarted = false;
    }

    function withdraw() external {
        if (address(this).balance == 0) revert EmptyBalance();
        uint256 balance = address(this).balance;

        for (uint256 i = 0; i < _royaltyAddresses.length; i++) {
            payable(_royaltyAddresses[i]).transfer(
                balance / 10000 * _royaltyShares[_royaltyAddresses[i]]
            );
        }
    }

    function setSongBirdCity(address _songBirdCityAddress) external onlyOwner {
        SongBirdCity = AirdropNft(_songBirdCityAddress);
    }

    function setLofts(address _loftAddress) external onlyOwner {
        LuxuryLoft = AirdropNft(_loftAddress);
    }

    function setMaxPublicMintAmount(uint256 _maxPublicMintAmount) external onlyOwner {
        maxPublicMintAmount = _maxPublicMintAmount;
    }

    /// @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":"error","name":"CannotMintZero","inputs":[]},{"type":"error","name":"DoesNotExist","inputs":[]},{"type":"error","name":"EmptyBalance","inputs":[]},{"type":"error","name":"MintNotStarted","inputs":[]},{"type":"error","name":"NoTokensLeft","inputs":[]},{"type":"error","name":"NotEnoughETH","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"TooManyMintAtOnce","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":"contract AirdropNft"}],"name":"LuxuryLoft","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract AirdropNft"}],"name":"SongBirdCity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_royaltyAddresses","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdrop","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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxPublicMintAmount","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"mint","inputs":[{"type":"uint16","name":"amount","internalType":"uint16"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintStarted","inputs":[]},{"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":"pauseMint","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"publicMintMaxSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"publicMintSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sRibbits","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":"setAirdropInfo","inputs":[{"type":"address[][]","name":"_airdropAddresses","internalType":"address[][]"},{"type":"uint256[][]","name":"_airdropAmounts","internalType":"uint256[][]"}]},{"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":"nonpayable","outputs":[],"name":"setLofts","inputs":[{"type":"address","name":"_loftAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxPublicMintAmount","inputs":[{"type":"uint256","name":"_maxPublicMintAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSongBirdCity","inputs":[{"type":"address","name":"_songBirdCityAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startMint","inputs":[]},{"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":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"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"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[]}]
              

Contract Creation Code

0x60326007556008805460ff19169055600660808181526539aa37b0b23d60d11b60a090815261010060405260c08381526529aa27a0a22d60d11b60e052600080546001600160a01b0319163317905591926200005e9160019162000212565b5080516200007490600290602084019062000212565b50506040805160a08101825273b20f2a4601aed75b886cc5b84e28a0d65a7bfd488082527390ca2b438482f2b205da814b94b4758c3a2295416020808401829052738e23a0c18d2fd631efa838acc1dfbecbbdb3add994840185905273c8d015b94a3fb41dc13d6a9573bb454300023a9460608501819052735b588e36ff358d4376a76fb163fd69da02a2a9a56080909501859052600c80546001600160a01b03199081169095179055600d80548516909317909255600e80548416909517909455600f805483169091179055601080549091168217905560169091526101f27f22ed6cac80d5ca6ffb350b1d4f0fc327388eea2eb0bf6bc08b0924dfbeab7e4c556102457f28f33dd4ea12291e1b8edd79564bff876a587f28b2019979aea1b573a8c93e538190557fab70f35e3e585ef107e55c4544677aa939b9c5f7f9205d64e36fb7c8fe757c7e55611f9a7f94d1fdc8a36fd8043de2974a243d2a2270742a662efad3e7421e882fc8e07e2b556000525060fa7f7ef0be487a8cef9327702e4f6e931c52cfdd2a584ab8617a8d95622d78409cf255620002f5565b8280546200022090620002b8565b90600052602060002090601f0160209004810192826200024457600085556200028f565b82601f106200025f57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028f57825182559160200191906001019062000272565b506200029d929150620002a1565b5090565b5b808211156200029d5760008155600101620002a2565b600181811c90821680620002cd57607f821691505b60208210811415620002ef57634e487b7160e01b600052602260045260246000fd5b50919050565b6121c180620003056000396000f3fe60806040526004361061021a5760003560e01c80636817c76c1161012357806395d89b41116100ab578063c13bf37e1161006f578063c13bf37e1461061d578063c87b56dd1461063d578063cd85cdb51461065d578063e985e9c514610672578063f2fde38b146106ad57600080fd5b806395d89b4114610586578063a22cb4651461059b578063a9722cf3146105bb578063b88d4fde146105d5578063b8906ffd146105f557600080fd5b806379fcb984116100f257806379fcb984146104fc578063808bba601461051c57806385f29ca81461053257806387aa9060146105485780638da5cb5b1461056857600080fd5b80636817c76c146104885780636c0360eb146104a557806370a08231146104ba578063715018a6146104e757600080fd5b80632be09561116101a65780633ccfd60b116101755780633ccfd60b146103dd57806342842e0e146103f257806355e68b851461041257806355f804b3146104325780636352211e1461045257600080fd5b80632be09561146103735780632f808c3114610388578063343c2c75146103a85780633884d635146103c857600080fd5b8063095ea7b3116101ed578063095ea7b3146102e857806318160ddd1461030a5780631ae83e981461032057806323b872dd1461034057806323cf0a221461036057600080fd5b806301ffc9a71461021f57806303d8acef1461025457806306fdde0314610278578063081812fc1461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046119a0565b6106cd565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061026a60075481565b60405190815260200161024b565b34801561028457600080fd5b5061028d61073a565b60405161024b9190611a1c565b3480156102a657600080fd5b506102d06102b5366004611a2f565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161024b565b3480156102f457600080fd5b50610308610303366004611a64565b6107c8565b005b34801561031657600080fd5b5061026a60095481565b34801561032c57600080fd5b506011546102d0906001600160a01b031681565b34801561034c57600080fd5b5061030861035b366004611a8e565b6108af565b61030861036e366004611aca565b610a76565b34801561037f57600080fd5b50610308610c96565b34801561039457600080fd5b506103086103a3366004611aee565b610ccf565b3480156103b457600080fd5b506103086103c3366004611c5a565b610d1b565b3480156103d457600080fd5b50610308610d71565b3480156103e957600080fd5b50610308610f50565b3480156103fe57600080fd5b5061030861040d366004611a8e565b611024565b34801561041e57600080fd5b506012546102d0906001600160a01b031681565b34801561043e57600080fd5b5061030861044d366004611de3565b611117565b34801561045e57600080fd5b506102d061046d366004611a2f565b6004602052600090815260409020546001600160a01b031681565b34801561049457600080fd5b5061026a68410d586a20a4c0000081565b3480156104b157600080fd5b5061028d611154565b3480156104c657600080fd5b5061026a6104d5366004611aee565b60036020526000908152604090205481565b3480156104f357600080fd5b50610308611161565b34801561050857600080fd5b50610308610517366004611a2f565b61119e565b34801561052857600080fd5b5061026a61177081565b34801561053e57600080fd5b5061026a600a5481565b34801561055457600080fd5b506102d0610563366004611a2f565b6111cd565b34801561057457600080fd5b506000546001600160a01b03166102d0565b34801561059257600080fd5b5061028d6111ed565b3480156105a757600080fd5b506103086105b6366004611e2c565b6111fa565b3480156105c757600080fd5b5060085461023f9060ff1681565b3480156105e157600080fd5b506103086105f0366004611e68565b611266565b34801561060157600080fd5b506102d073399e279c814a3100065fceab8cba1ab11480534481565b34801561062957600080fd5b50610308610638366004611aee565b61134b565b34801561064957600080fd5b5061028d610658366004611a2f565b611397565b34801561066957600080fd5b50610308611401565b34801561067e57600080fd5b5061023f61068d366004611ee4565b600660209081526000928352604080842090915290825290205460ff1681565b3480156106b957600080fd5b506103086106c8366004611aee565b611437565b60006307f5828d60e41b6001600160e01b0319831614806106fe57506380ac58cd60e01b6001600160e01b03198316145b806107195750635b5e139f60e01b6001600160e01b03198316145b8061073457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001805461074790611f17565b80601f016020809104026020016040519081016040528092919081815260200182805461077390611f17565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b505050505081565b6000818152600460205260409020546001600160a01b03163381148061081157506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6108535760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600460205260409020546001600160a01b038481169116146109055760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161084a565b6001600160a01b03821661094f5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161084a565b336001600160a01b038416148061097c57506000818152600560205260409020546001600160a01b031633145b806109aa57506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b6109e75760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161084a565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526004825284832080546001600160a01b03199081168317909155600590925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61ffff8116610a9857604051632a6ce29960e11b815260040160405180910390fd5b6117708161ffff16600a54610aad9190611f68565b1115610acc57604051637364ba1760e01b815260040160405180910390fd5b60085460ff16610aef57604051630314872760e11b815260040160405180910390fd5b610b0668410d586a20a4c0000061ffff8316611f80565b341015610b2657604051632c1d501360e11b815260040160405180910390fd5b6007548161ffff161115610b4d576040516309defc7560e41b815260040160405180910390fd5b60005b8161ffff168161ffff161015610b8957610b6f33600954600101611484565b600980546001908101909155600a80548201905501610b50565b506000610ba361ffff831668bdbc41e0348b300000611f80565b9050610bc473399e279c814a3100065fceab8cba1ab114805344338361158f565b60115460405163b1d66ced60e01b815233600482015261ffff841660248201526001600160a01b039091169063b1d66ced90604401600060405180830381600087803b158015610c1357600080fd5b505af1158015610c27573d6000803e3d6000fd5b505060125460405163b1d66ced60e01b815233600482015261ffff861660248201526001600160a01b03909116925063b1d66ced9150604401600060405180830381600087803b158015610c7a57600080fd5b505af1158015610c8e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b03163314610cc05760405162461bcd60e51b815260040161084a90611f9f565b6008805460ff19166001179055565b6000546001600160a01b03163314610cf95760405162461bcd60e51b815260040161084a90611f9f565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d455760405162461bcd60e51b815260040161084a90611f9f565b8151610d58906013906020850190611755565b508051610d6c9060149060208401906117b2565b505050565b6000546001600160a01b03163314610d9b5760405162461bcd60e51b815260040161084a90611f9f565b6000601360155481548110610db257610db2611fd4565b90600052602060002001805480602002602001604051908101604052809291908181526020018280548015610e1057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610df2575b505050505090506000601460155481548110610e2e57610e2e611fd4565b90600052602060002001805480602002602001604051908101604052809291908181526020018280548015610e8257602002820191906000526020600020905b815481526020019060010190808311610e6e575b505085519394506000925050505b81811015610f35576000848281518110610eac57610eac611fd4565b602002602001015190506000848381518110610eca57610eca611fd4565b6020026020010151905060005b81811015610f1f57610ef7836009546001610ef29190611f68565b611484565b60098054906000610f0783611fea565b91905055508080610f1790611fea565b915050610ed7565b5050508080610f2d90611fea565b915050610e90565b5060158054906000610f4683611fea565b9190505550505050565b47610f6e57604051631189da5b60e11b815260040160405180910390fd5b4760005b600581101561102057600c8160058110610f8e57610f8e611fd4565b01546001600160a01b03166108fc60166000600c8560058110610fb357610fb3611fd4565b01546001600160a01b03168152602081019190915260400160002054610fdb6127108661201b565b610fe59190611f80565b6040518115909202916000818181858888f1935050505015801561100d573d6000803e3d6000fd5b508061101881611fea565b915050610f72565b5050565b61102f8383836108af565b6001600160a01b0382163b15806110d85750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc919061202f565b6001600160e01b031916145b610d6c5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161084a565b6000546001600160a01b031633146111415760405162461bcd60e51b815260040161084a90611f9f565b805161102090600b90602084019061180b565b600b805461074790611f17565b6000546001600160a01b0316331461118c576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319169055565b6000546001600160a01b031633146111c85760405162461bcd60e51b815260040161084a90611f9f565b600755565b600c81600581106111dd57600080fd5b01546001600160a01b0316905081565b6002805461074790611f17565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112718484846108af565b6001600160a01b0383163b15806113065750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a02906112b790339089908890889060040161204c565b6020604051808303816000875af11580156112d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fa919061202f565b6001600160e01b031916145b6113455760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161084a565b50505050565b6000546001600160a01b031633146113755760405162461bcd60e51b815260040161084a90611f9f565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600460205260409020546060906001600160a01b03166113cf5760405163b0ce759160e01b815260040160405180910390fd5b600b6113da83611608565b6040516020016113eb9291906120a5565b6040516020818303038152906040529050919050565b6000546001600160a01b0316331461142b5760405162461bcd60e51b815260040161084a90611f9f565b6008805460ff19169055565b6000546001600160a01b03163314611462576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166114ce5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161084a565b6000818152600460205260409020546001600160a01b0316156115245760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161084a565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060405163a9059cbb60e01b81526001600160a01b03841660048201528260248201526000806044836000895af19150506115ca8161170e565b6113455760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015260640161084a565b60608161162c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611656578061164081611fea565b915061164f9050600a8361201b565b9150611630565b60008167ffffffffffffffff81111561167157611671611b09565b6040519080825280601f01601f19166020018201604052801561169b576020820181803683370190505b5090505b8415611706576116b0600183612160565b91506116bd600a86612177565b6116c8906030611f68565b60f81b8183815181106116dd576116dd611fd4565b60200101906001600160f81b031916908160001a9053506116ff600a8661201b565b945061169f565b949350505050565b60003d8261172057806000803e806000fd5b8060208114611738578015611749576000925061174e565b816000803e6000511515925061174e565b600192505b5050919050565b8280548282559060005260206000209081019282156117a2579160200282015b828111156117a2578251805161179291849160209091019061188b565b5091602001919060010190611775565b506117ae9291506118e0565b5090565b8280548282559060005260206000209081019282156117ff579160200282015b828111156117ff57825180516117ef9184916020909101906118fd565b50916020019190600101906117d2565b506117ae929150611937565b82805461181790611f17565b90600052602060002090601f016020900481019282611839576000855561187f565b82601f1061185257805160ff191683800117855561187f565b8280016001018555821561187f579182015b8281111561187f578251825591602001919060010190611864565b506117ae929150611954565b82805482825590600052602060002090810192821561187f579160200282015b8281111561187f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906118ab565b808211156117ae5760006118f48282611969565b506001016118e0565b82805482825590600052602060002090810192821561187f579160200282018281111561187f578251825591602001919060010190611864565b808211156117ae57600061194b8282611969565b50600101611937565b5b808211156117ae5760008155600101611955565b50805460008255906000526020600020908101906119879190611954565b50565b6001600160e01b03198116811461198757600080fd5b6000602082840312156119b257600080fd5b81356119bd8161198a565b9392505050565b60005b838110156119df5781810151838201526020016119c7565b838111156113455750506000910152565b60008151808452611a088160208601602086016119c4565b601f01601f19169290920160200192915050565b6020815260006119bd60208301846119f0565b600060208284031215611a4157600080fd5b5035919050565b80356001600160a01b0381168114611a5f57600080fd5b919050565b60008060408385031215611a7757600080fd5b611a8083611a48565b946020939093013593505050565b600080600060608486031215611aa357600080fd5b611aac84611a48565b9250611aba60208501611a48565b9150604084013590509250925092565b600060208284031215611adc57600080fd5b813561ffff811681146119bd57600080fd5b600060208284031215611b0057600080fd5b6119bd82611a48565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b4857611b48611b09565b604052919050565b600067ffffffffffffffff821115611b6a57611b6a611b09565b5060051b60200190565b600082601f830112611b8557600080fd5b81356020611b9a611b9583611b50565b611b1f565b828152600592831b8501820192828201919087851115611bb957600080fd5b8387015b85811015611c4d57803567ffffffffffffffff811115611bdd5760008081fd5b8801603f81018a13611bef5760008081fd5b858101356040611c01611b9583611b50565b82815291851b8301810191888101908d841115611c1e5760008081fd5b938201935b83851015611c3c57843582529389019390890190611c23565b885250505093850193508401611bbd565b5090979650505050505050565b6000806040808486031215611c6e57600080fd5b833567ffffffffffffffff80821115611c8657600080fd5b818601915086601f830112611c9a57600080fd5b81356020611caa611b9583611b50565b82815260059290921b8401810191818101908a841115611cc957600080fd5b8286015b84811015611d5c57803586811115611ce55760008081fd5b8701603f81018d13611cf75760008081fd5b84810135611d07611b9582611b50565b81815260059190911b82018a0190868101908f831115611d275760008081fd5b928b01925b82841015611d4c57611d3d84611a48565b82529287019290870190611d2c565b8652505050918301918301611ccd565b5097505087013593505080831115611d7357600080fd5b5050611d8185828601611b74565b9150509250929050565b600067ffffffffffffffff831115611da557611da5611b09565b611db8601f8401601f1916602001611b1f565b9050828152838383011115611dcc57600080fd5b828260208301376000602084830101529392505050565b600060208284031215611df557600080fd5b813567ffffffffffffffff811115611e0c57600080fd5b8201601f81018413611e1d57600080fd5b61170684823560208401611d8b565b60008060408385031215611e3f57600080fd5b611e4883611a48565b915060208301358015158114611e5d57600080fd5b809150509250929050565b60008060008060808587031215611e7e57600080fd5b611e8785611a48565b9350611e9560208601611a48565b925060408501359150606085013567ffffffffffffffff811115611eb857600080fd5b8501601f81018713611ec957600080fd5b611ed887823560208401611d8b565b91505092959194509250565b60008060408385031215611ef757600080fd5b611f0083611a48565b9150611f0e60208401611a48565b90509250929050565b600181811c90821680611f2b57607f821691505b60208210811415611f4c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611f7b57611f7b611f52565b500190565b6000816000190483118215151615611f9a57611f9a611f52565b500290565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611ffe57611ffe611f52565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261202a5761202a612005565b500490565b60006020828403121561204157600080fd5b81516119bd8161198a565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207f908301846119f0565b9695505050505050565b6000815161209b8185602086016119c4565b9290920192915050565b600080845481600182811c9150808316806120c157607f831692505b60208084108214156120e157634e487b7160e01b86526022600452602486fd5b8180156120f5576001811461210657612133565b60ff19861689528489019650612133565b60008b81526020902060005b8681101561212b5781548b820152908501908301612112565b505084890196505b5050505050506121576121468286612089565b64173539b7b760d91b815260050190565b95945050505050565b60008282101561217257612172611f52565b500390565b60008261218657612186612005565b50069056fea26469706673582212201a89ff8c9036673e6532f9d28152ee80ba692d201dd3db5f442dc475d52f01cf64736f6c634300080c0033

Deployed ByteCode

0x60806040526004361061021a5760003560e01c80636817c76c1161012357806395d89b41116100ab578063c13bf37e1161006f578063c13bf37e1461061d578063c87b56dd1461063d578063cd85cdb51461065d578063e985e9c514610672578063f2fde38b146106ad57600080fd5b806395d89b4114610586578063a22cb4651461059b578063a9722cf3146105bb578063b88d4fde146105d5578063b8906ffd146105f557600080fd5b806379fcb984116100f257806379fcb984146104fc578063808bba601461051c57806385f29ca81461053257806387aa9060146105485780638da5cb5b1461056857600080fd5b80636817c76c146104885780636c0360eb146104a557806370a08231146104ba578063715018a6146104e757600080fd5b80632be09561116101a65780633ccfd60b116101755780633ccfd60b146103dd57806342842e0e146103f257806355e68b851461041257806355f804b3146104325780636352211e1461045257600080fd5b80632be09561146103735780632f808c3114610388578063343c2c75146103a85780633884d635146103c857600080fd5b8063095ea7b3116101ed578063095ea7b3146102e857806318160ddd1461030a5780631ae83e981461032057806323b872dd1461034057806323cf0a221461036057600080fd5b806301ffc9a71461021f57806303d8acef1461025457806306fdde0314610278578063081812fc1461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046119a0565b6106cd565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061026a60075481565b60405190815260200161024b565b34801561028457600080fd5b5061028d61073a565b60405161024b9190611a1c565b3480156102a657600080fd5b506102d06102b5366004611a2f565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161024b565b3480156102f457600080fd5b50610308610303366004611a64565b6107c8565b005b34801561031657600080fd5b5061026a60095481565b34801561032c57600080fd5b506011546102d0906001600160a01b031681565b34801561034c57600080fd5b5061030861035b366004611a8e565b6108af565b61030861036e366004611aca565b610a76565b34801561037f57600080fd5b50610308610c96565b34801561039457600080fd5b506103086103a3366004611aee565b610ccf565b3480156103b457600080fd5b506103086103c3366004611c5a565b610d1b565b3480156103d457600080fd5b50610308610d71565b3480156103e957600080fd5b50610308610f50565b3480156103fe57600080fd5b5061030861040d366004611a8e565b611024565b34801561041e57600080fd5b506012546102d0906001600160a01b031681565b34801561043e57600080fd5b5061030861044d366004611de3565b611117565b34801561045e57600080fd5b506102d061046d366004611a2f565b6004602052600090815260409020546001600160a01b031681565b34801561049457600080fd5b5061026a68410d586a20a4c0000081565b3480156104b157600080fd5b5061028d611154565b3480156104c657600080fd5b5061026a6104d5366004611aee565b60036020526000908152604090205481565b3480156104f357600080fd5b50610308611161565b34801561050857600080fd5b50610308610517366004611a2f565b61119e565b34801561052857600080fd5b5061026a61177081565b34801561053e57600080fd5b5061026a600a5481565b34801561055457600080fd5b506102d0610563366004611a2f565b6111cd565b34801561057457600080fd5b506000546001600160a01b03166102d0565b34801561059257600080fd5b5061028d6111ed565b3480156105a757600080fd5b506103086105b6366004611e2c565b6111fa565b3480156105c757600080fd5b5060085461023f9060ff1681565b3480156105e157600080fd5b506103086105f0366004611e68565b611266565b34801561060157600080fd5b506102d073399e279c814a3100065fceab8cba1ab11480534481565b34801561062957600080fd5b50610308610638366004611aee565b61134b565b34801561064957600080fd5b5061028d610658366004611a2f565b611397565b34801561066957600080fd5b50610308611401565b34801561067e57600080fd5b5061023f61068d366004611ee4565b600660209081526000928352604080842090915290825290205460ff1681565b3480156106b957600080fd5b506103086106c8366004611aee565b611437565b60006307f5828d60e41b6001600160e01b0319831614806106fe57506380ac58cd60e01b6001600160e01b03198316145b806107195750635b5e139f60e01b6001600160e01b03198316145b8061073457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001805461074790611f17565b80601f016020809104026020016040519081016040528092919081815260200182805461077390611f17565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b505050505081565b6000818152600460205260409020546001600160a01b03163381148061081157506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6108535760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600460205260409020546001600160a01b038481169116146109055760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161084a565b6001600160a01b03821661094f5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161084a565b336001600160a01b038416148061097c57506000818152600560205260409020546001600160a01b031633145b806109aa57506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b6109e75760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161084a565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526004825284832080546001600160a01b03199081168317909155600590925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61ffff8116610a9857604051632a6ce29960e11b815260040160405180910390fd5b6117708161ffff16600a54610aad9190611f68565b1115610acc57604051637364ba1760e01b815260040160405180910390fd5b60085460ff16610aef57604051630314872760e11b815260040160405180910390fd5b610b0668410d586a20a4c0000061ffff8316611f80565b341015610b2657604051632c1d501360e11b815260040160405180910390fd5b6007548161ffff161115610b4d576040516309defc7560e41b815260040160405180910390fd5b60005b8161ffff168161ffff161015610b8957610b6f33600954600101611484565b600980546001908101909155600a80548201905501610b50565b506000610ba361ffff831668bdbc41e0348b300000611f80565b9050610bc473399e279c814a3100065fceab8cba1ab114805344338361158f565b60115460405163b1d66ced60e01b815233600482015261ffff841660248201526001600160a01b039091169063b1d66ced90604401600060405180830381600087803b158015610c1357600080fd5b505af1158015610c27573d6000803e3d6000fd5b505060125460405163b1d66ced60e01b815233600482015261ffff861660248201526001600160a01b03909116925063b1d66ced9150604401600060405180830381600087803b158015610c7a57600080fd5b505af1158015610c8e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b03163314610cc05760405162461bcd60e51b815260040161084a90611f9f565b6008805460ff19166001179055565b6000546001600160a01b03163314610cf95760405162461bcd60e51b815260040161084a90611f9f565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d455760405162461bcd60e51b815260040161084a90611f9f565b8151610d58906013906020850190611755565b508051610d6c9060149060208401906117b2565b505050565b6000546001600160a01b03163314610d9b5760405162461bcd60e51b815260040161084a90611f9f565b6000601360155481548110610db257610db2611fd4565b90600052602060002001805480602002602001604051908101604052809291908181526020018280548015610e1057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610df2575b505050505090506000601460155481548110610e2e57610e2e611fd4565b90600052602060002001805480602002602001604051908101604052809291908181526020018280548015610e8257602002820191906000526020600020905b815481526020019060010190808311610e6e575b505085519394506000925050505b81811015610f35576000848281518110610eac57610eac611fd4565b602002602001015190506000848381518110610eca57610eca611fd4565b6020026020010151905060005b81811015610f1f57610ef7836009546001610ef29190611f68565b611484565b60098054906000610f0783611fea565b91905055508080610f1790611fea565b915050610ed7565b5050508080610f2d90611fea565b915050610e90565b5060158054906000610f4683611fea565b9190505550505050565b47610f6e57604051631189da5b60e11b815260040160405180910390fd5b4760005b600581101561102057600c8160058110610f8e57610f8e611fd4565b01546001600160a01b03166108fc60166000600c8560058110610fb357610fb3611fd4565b01546001600160a01b03168152602081019190915260400160002054610fdb6127108661201b565b610fe59190611f80565b6040518115909202916000818181858888f1935050505015801561100d573d6000803e3d6000fd5b508061101881611fea565b915050610f72565b5050565b61102f8383836108af565b6001600160a01b0382163b15806110d85750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc919061202f565b6001600160e01b031916145b610d6c5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161084a565b6000546001600160a01b031633146111415760405162461bcd60e51b815260040161084a90611f9f565b805161102090600b90602084019061180b565b600b805461074790611f17565b6000546001600160a01b0316331461118c576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319169055565b6000546001600160a01b031633146111c85760405162461bcd60e51b815260040161084a90611f9f565b600755565b600c81600581106111dd57600080fd5b01546001600160a01b0316905081565b6002805461074790611f17565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112718484846108af565b6001600160a01b0383163b15806113065750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a02906112b790339089908890889060040161204c565b6020604051808303816000875af11580156112d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fa919061202f565b6001600160e01b031916145b6113455760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161084a565b50505050565b6000546001600160a01b031633146113755760405162461bcd60e51b815260040161084a90611f9f565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600460205260409020546060906001600160a01b03166113cf5760405163b0ce759160e01b815260040160405180910390fd5b600b6113da83611608565b6040516020016113eb9291906120a5565b6040516020818303038152906040529050919050565b6000546001600160a01b0316331461142b5760405162461bcd60e51b815260040161084a90611f9f565b6008805460ff19169055565b6000546001600160a01b03163314611462576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166114ce5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161084a565b6000818152600460205260409020546001600160a01b0316156115245760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161084a565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060405163a9059cbb60e01b81526001600160a01b03841660048201528260248201526000806044836000895af19150506115ca8161170e565b6113455760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015260640161084a565b60608161162c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611656578061164081611fea565b915061164f9050600a8361201b565b9150611630565b60008167ffffffffffffffff81111561167157611671611b09565b6040519080825280601f01601f19166020018201604052801561169b576020820181803683370190505b5090505b8415611706576116b0600183612160565b91506116bd600a86612177565b6116c8906030611f68565b60f81b8183815181106116dd576116dd611fd4565b60200101906001600160f81b031916908160001a9053506116ff600a8661201b565b945061169f565b949350505050565b60003d8261172057806000803e806000fd5b8060208114611738578015611749576000925061174e565b816000803e6000511515925061174e565b600192505b5050919050565b8280548282559060005260206000209081019282156117a2579160200282015b828111156117a2578251805161179291849160209091019061188b565b5091602001919060010190611775565b506117ae9291506118e0565b5090565b8280548282559060005260206000209081019282156117ff579160200282015b828111156117ff57825180516117ef9184916020909101906118fd565b50916020019190600101906117d2565b506117ae929150611937565b82805461181790611f17565b90600052602060002090601f016020900481019282611839576000855561187f565b82601f1061185257805160ff191683800117855561187f565b8280016001018555821561187f579182015b8281111561187f578251825591602001919060010190611864565b506117ae929150611954565b82805482825590600052602060002090810192821561187f579160200282015b8281111561187f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906118ab565b808211156117ae5760006118f48282611969565b506001016118e0565b82805482825590600052602060002090810192821561187f579160200282018281111561187f578251825591602001919060010190611864565b808211156117ae57600061194b8282611969565b50600101611937565b5b808211156117ae5760008155600101611955565b50805460008255906000526020600020908101906119879190611954565b50565b6001600160e01b03198116811461198757600080fd5b6000602082840312156119b257600080fd5b81356119bd8161198a565b9392505050565b60005b838110156119df5781810151838201526020016119c7565b838111156113455750506000910152565b60008151808452611a088160208601602086016119c4565b601f01601f19169290920160200192915050565b6020815260006119bd60208301846119f0565b600060208284031215611a4157600080fd5b5035919050565b80356001600160a01b0381168114611a5f57600080fd5b919050565b60008060408385031215611a7757600080fd5b611a8083611a48565b946020939093013593505050565b600080600060608486031215611aa357600080fd5b611aac84611a48565b9250611aba60208501611a48565b9150604084013590509250925092565b600060208284031215611adc57600080fd5b813561ffff811681146119bd57600080fd5b600060208284031215611b0057600080fd5b6119bd82611a48565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b4857611b48611b09565b604052919050565b600067ffffffffffffffff821115611b6a57611b6a611b09565b5060051b60200190565b600082601f830112611b8557600080fd5b81356020611b9a611b9583611b50565b611b1f565b828152600592831b8501820192828201919087851115611bb957600080fd5b8387015b85811015611c4d57803567ffffffffffffffff811115611bdd5760008081fd5b8801603f81018a13611bef5760008081fd5b858101356040611c01611b9583611b50565b82815291851b8301810191888101908d841115611c1e5760008081fd5b938201935b83851015611c3c57843582529389019390890190611c23565b885250505093850193508401611bbd565b5090979650505050505050565b6000806040808486031215611c6e57600080fd5b833567ffffffffffffffff80821115611c8657600080fd5b818601915086601f830112611c9a57600080fd5b81356020611caa611b9583611b50565b82815260059290921b8401810191818101908a841115611cc957600080fd5b8286015b84811015611d5c57803586811115611ce55760008081fd5b8701603f81018d13611cf75760008081fd5b84810135611d07611b9582611b50565b81815260059190911b82018a0190868101908f831115611d275760008081fd5b928b01925b82841015611d4c57611d3d84611a48565b82529287019290870190611d2c565b8652505050918301918301611ccd565b5097505087013593505080831115611d7357600080fd5b5050611d8185828601611b74565b9150509250929050565b600067ffffffffffffffff831115611da557611da5611b09565b611db8601f8401601f1916602001611b1f565b9050828152838383011115611dcc57600080fd5b828260208301376000602084830101529392505050565b600060208284031215611df557600080fd5b813567ffffffffffffffff811115611e0c57600080fd5b8201601f81018413611e1d57600080fd5b61170684823560208401611d8b565b60008060408385031215611e3f57600080fd5b611e4883611a48565b915060208301358015158114611e5d57600080fd5b809150509250929050565b60008060008060808587031215611e7e57600080fd5b611e8785611a48565b9350611e9560208601611a48565b925060408501359150606085013567ffffffffffffffff811115611eb857600080fd5b8501601f81018713611ec957600080fd5b611ed887823560208401611d8b565b91505092959194509250565b60008060408385031215611ef757600080fd5b611f0083611a48565b9150611f0e60208401611a48565b90509250929050565b600181811c90821680611f2b57607f821691505b60208210811415611f4c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611f7b57611f7b611f52565b500190565b6000816000190483118215151615611f9a57611f9a611f52565b500290565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611ffe57611ffe611f52565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261202a5761202a612005565b500490565b60006020828403121561204157600080fd5b81516119bd8161198a565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207f908301846119f0565b9695505050505050565b6000815161209b8185602086016119c4565b9290920192915050565b600080845481600182811c9150808316806120c157607f831692505b60208084108214156120e157634e487b7160e01b86526022600452602486fd5b8180156120f5576001811461210657612133565b60ff19861689528489019650612133565b60008b81526020902060005b8681101561212b5781548b820152908501908301612112565b505084890196505b5050505050506121576121468286612089565b64173539b7b760d91b815260050190565b95945050505050565b60008282101561217257612172611f52565b500390565b60008261218657612186612005565b50069056fea26469706673582212201a89ff8c9036673e6532f9d28152ee80ba692d201dd3db5f442dc475d52f01cf64736f6c634300080c0033