false
true
0

Contract Address Details

0x46c862F82dDabb0d7AFf34074894F74bD3efAf48

Token
Liquid Staked PRINT (sPRINT)
Creator
0xdb1d5c–d02f4e at 0x166822–848abe
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
781 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26071281
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
StakedPrint




Optimization enabled
true
Compiler version
v0.8.28+commit.7893614a




Optimization runs
200
EVM Version
paris




Verified at
2025-04-28T12:28:26.264578Z

Constructor Arguments

0x0000000000000000000000006c203a555824ec90a215f37916cf8db58ebe2fa30000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d000000000000000000000000144cd22aaa2a80fed0bb8b1deaddc51a53df1d5000000000000000000000000035b99f29b3ec3276a2b3bb5863326b1c100aa160

Arg [0] (address) : 0x6c203a555824ec90a215f37916cf8db58ebe2fa3
Arg [1] (address) : 0x2fa878ab3f87cc1c9737fc071108f904c0b0c95d
Arg [2] (address) : 0x144cd22aaa2a80fed0bb8b1deaddc51a53df1d50
Arg [3] (address) : 0x35b99f29b3ec3276a2b3bb5863326b1c100aa160

              

contracts/StakedPrint.sol

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

import "./dependencies/ERC20.sol";
import "./dependencies/Owned.sol";
import "./dependencies/SafeTransferLib.sol";

interface IPrintStaking {
    function stake(uint256 amount) external;

    function unstake(uint256 amount) external;
}

contract StakedPrint is ERC20, Owned {
    ERC20 public immutable PRINT;
    ERC20 public immutable INC;
    ERC20 public immutable INCD;
    IPrintStaking public immutable stakingContract;

    constructor(
        address _print,
        address _inc,
        address _incd,
        address _stakingContract
    )
        ERC20("Liquid Staked PRINT", "sPRINT", 18)
        Owned(0xF7154b665e22674Ca7488c7D34Bdf016bdF0e911)
    {
        PRINT = ERC20(_print);
        INC = ERC20(_inc);
        INCD = ERC20(_incd);
        stakingContract = IPrintStaking(_stakingContract);
    }

    function stake(uint256 amount) external {
        SafeTransferLib.safeTransferFrom(
            PRINT,
            msg.sender,
            address(this),
            amount
        );
        stakingContract.stake(amount); // does the non-zero check
        _mint(msg.sender, amount);
    }

    function unstake(uint256 amount) external {
        _burn(msg.sender, amount);
        stakingContract.unstake(amount);
        SafeTransferLib.safeTransfer(PRINT, msg.sender, amount);
    }

    function claimFees() external {
        stakingContract.unstake(0);
        uint256 incBalance = INC.balanceOf(address(this));
        uint256 incdBalance = INCD.balanceOf(address(this));
        if (incBalance > 0)
            SafeTransferLib.safeTransfer(INC, owner, incBalance);
        if (incdBalance > 0)
            SafeTransferLib.safeTransfer(INCD, owner, incdBalance);
    }
}
        

contracts/dependencies/ERC20.sol

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/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
    //////////////////////////////////////////////////////////////*/

    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 {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                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);
    }
}
          

contracts/dependencies/Owned.sol

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

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

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}
          

contracts/dependencies/SafeTransferLib.sol

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "./ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.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 success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

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

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

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

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
            // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
            success := call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)

            // Set success to whether the call reverted, if not we check it either
            // returned exactly 1 (can't just be non-zero data), or had no return data and token has code.
            if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) {
                success := iszero(or(iszero(extcodesize(token)), returndatasize())) 
            }
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

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

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

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
            // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
            success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)

            // Set success to whether the call reverted, if not we check it either
            // returned exactly 1 (can't just be non-zero data), or had no return data and token has code.
            if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) {
                success := iszero(or(iszero(extcodesize(token)), returndatasize())) 
            }
        }

        require(success, "TRANSFER_FAILED");
    }

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

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

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
            // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
            success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)

            // Set success to whether the call reverted, if not we check it either
            // returned exactly 1 (can't just be non-zero data), or had no return data and token has code.
            if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) {
                success := iszero(or(iszero(extcodesize(token)), returndatasize())) 
            }
        }

        require(success, "APPROVE_FAILED");
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_print","internalType":"address"},{"type":"address","name":"_inc","internalType":"address"},{"type":"address","name":"_incd","internalType":"address"},{"type":"address","name":"_stakingContract","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"user","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":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ERC20"}],"name":"INC","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ERC20"}],"name":"INCD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ERC20"}],"name":"PRINT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPrintStaking"}],"name":"stakingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]}]
              

Contract Creation Code

0x61016060405234801561001157600080fd5b50604051611708380380611708833981016040819052610030916101f9565b73f7154b665e22674ca7488c7d34bdf016bdf0e9116040518060400160405280601381526020017f4c6971756964205374616b6564205052494e5400000000000000000000000000815250604051806040016040528060068152602001651cd41492539560d21b815250601282600090816100ab91906102ec565b5060016100b883826102ec565b5060ff81166080524660a0526100cc610143565b60c0525050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b0393841660e05291831661010052821661012052166101405261041f565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405161017591906103aa565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80516001600160a01b03811681146101f457600080fd5b919050565b6000806000806080858703121561020f57600080fd5b610218856101dd565b9350610226602086016101dd565b9250610234604086016101dd565b9150610242606086016101dd565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061027757607f821691505b60208210810361029757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156102e757806000526020600020601f840160051c810160208510156102c45750805b601f840160051c820191505b818110156102e457600081556001016102d0565b50505b505050565b81516001600160401b038111156103055761030561024d565b610319816103138454610263565b8461029d565b6020601f82116001811461034d57600083156103355750848201515b600019600385901b1c1916600184901b1784556102e4565b600084815260208120601f198516915b8281101561037d578785015182556020948501946001909201910161035d565b508482101561039b5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60008083546103b881610263565b6001821680156103cf57600181146103e457610414565b60ff1983168652811515820286019350610414565b86600052602060002060005b8381101561040c578154888201526001909101906020016103f0565b505081860193505b509195945050505050565b60805160a05160c05160e0516101005161012051610140516112506104b86000396000818161032f01528181610586015281816106c201526107ac0152600081816101fa015281816108be015261097801526000818161030801528181610827015261093a015260008181610369015281816105ef0152610685015260006106510152600061061c015260006101c101526112506000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80638da5cb5b116100b8578063d505accf1161007c578063d505accf146102c5578063dd62ed3e146102d8578063e4932abe14610303578063ee99205c1461032a578063f2fde38b14610351578063f646ec791461036457600080fd5b80638da5cb5b1461027c57806395d89b411461028f578063a694fc3a14610297578063a9059cbb146102aa578063d294f093146102bd57600080fd5b8063313ce567116100ff578063313ce567146101bc57806332e2e972146101f55780633644e5151461023457806370a082311461023c5780637ecebe001461025c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806323b872dd146101945780632e17de78146101a7575b600080fd5b61014461038b565b6040516101519190610f1a565b60405180910390f35b61016d610168366004610f84565b610419565b6040519015158152602001610151565b61018660025481565b604051908152602001610151565b61016d6101a2366004610fae565b610486565b6101ba6101b5366004610feb565b610566565b005b6101e37f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610151565b61021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b610186610618565b61018661024a366004611004565b60036020526000908152604090205481565b61018661026a366004611004565b60056020526000908152604090205481565b60065461021c906001600160a01b031681565b610144610673565b6101ba6102a5366004610feb565b610680565b61016d6102b8366004610f84565b610730565b6101ba610796565b6101ba6102d3366004611026565b6109ab565b6101866102e6366004611099565b600460209081526000928352604080842090915290825290205481565b61021c7f000000000000000000000000000000000000000000000000000000000000000081565b61021c7f000000000000000000000000000000000000000000000000000000000000000081565b6101ba61035f366004611004565b610bf4565b61021c7f000000000000000000000000000000000000000000000000000000000000000081565b60008054610398906110cc565b80601f01602080910402602001604051908101604052809291908181526020018280546103c4906110cc565b80156104115780601f106103e657610100808354040283529160200191610411565b820191906000526020600020905b8154815290600101906020018083116103f457829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104749086815260200190565b60405180910390a35060015b92915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146104e2576104bd838261111c565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061050a90849061111c565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716906000805160206111fb833981519152906105539087815260200190565b60405180910390a3506001949350505050565b6105703382610c89565b6040516305c2fbcf60e31b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e17de7890602401600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b505050506106157f00000000000000000000000000000000000000000000000000000000000000003383610cf3565b50565b60007f0000000000000000000000000000000000000000000000000000000000000000461461064e57610649610d86565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60018054610398906110cc565b6106ac7f0000000000000000000000000000000000000000000000000000000000000000333084610e20565b60405163534a7e1d60e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a694fc3a90602401600060405180830381600087803b15801561070e57600080fd5b505af1158015610722573d6000803e3d6000fd5b505050506106153382610ec8565b3360009081526003602052604081208054839190839061075190849061111c565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133906000805160206111fb833981519152906104749086815260200190565b6040516305c2fbcf60e31b8152600060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e17de7890602401600060405180830381600087803b1580156107f857600080fd5b505af115801561080c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b919061112f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610929919061112f565b9050811561096957600654610969907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031684610cf3565b80156109a7576006546109a7907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683610cf3565b5050565b42841015610a005760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b60006001610a0c610618565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610b18573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610b4e5750876001600160a01b0316816001600160a01b0316145b610b8b5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016109f7565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b03163314610c3d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016109f7565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6001600160a01b03821660009081526003602052604081208054839290610cb190849061111c565b90915550506002805482900390556040518181526000906001600160a01b038416906000805160206111fb833981519152906020015b60405180910390a35050565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af191505080601f3d1160016000511416151615610d415750823b153d17155b80610d805760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016109f7565b50505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610db89190611148565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af191505080601f3d1160016000511416151615610e7d5750833b153d17155b80610ec15760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016109f7565b5050505050565b8060026000828254610eda91906111e7565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481526000805160206111fb8339815191529101610ce7565b602081526000825180602084015260005b81811015610f485760208186018101516040868401015201610f2b565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610f7f57600080fd5b919050565b60008060408385031215610f9757600080fd5b610fa083610f68565b946020939093013593505050565b600080600060608486031215610fc357600080fd5b610fcc84610f68565b9250610fda60208501610f68565b929592945050506040919091013590565b600060208284031215610ffd57600080fd5b5035919050565b60006020828403121561101657600080fd5b61101f82610f68565b9392505050565b600080600080600080600060e0888a03121561104157600080fd5b61104a88610f68565b965061105860208901610f68565b95506040880135945060608801359350608088013560ff8116811461107c57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156110ac57600080fd5b6110b583610f68565b91506110c360208401610f68565b90509250929050565b600181811c908216806110e057607f821691505b60208210810361110057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561048057610480611106565b60006020828403121561114157600080fd5b5051919050565b6000808354818160011c9050600182168061116457607f821691505b60208210810361118257634e487b7160e01b84526022600452602484fd5b80801561119657600181146111ab576111db565b60ff19841687528215158302870194506111db565b60008881526020902060005b848110156111d3578154898201526001909101906020016111b7565b505082870194505b50929695505050505050565b808201808211156104805761048061110656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122076ad26cc639f717f74a9f3e125129b8d6d16afe4b85bb96daaeed106097bc1cb64736f6c634300081c00330000000000000000000000006c203a555824ec90a215f37916cf8db58ebe2fa30000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d000000000000000000000000144cd22aaa2a80fed0bb8b1deaddc51a53df1d5000000000000000000000000035b99f29b3ec3276a2b3bb5863326b1c100aa160

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80638da5cb5b116100b8578063d505accf1161007c578063d505accf146102c5578063dd62ed3e146102d8578063e4932abe14610303578063ee99205c1461032a578063f2fde38b14610351578063f646ec791461036457600080fd5b80638da5cb5b1461027c57806395d89b411461028f578063a694fc3a14610297578063a9059cbb146102aa578063d294f093146102bd57600080fd5b8063313ce567116100ff578063313ce567146101bc57806332e2e972146101f55780633644e5151461023457806370a082311461023c5780637ecebe001461025c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806323b872dd146101945780632e17de78146101a7575b600080fd5b61014461038b565b6040516101519190610f1a565b60405180910390f35b61016d610168366004610f84565b610419565b6040519015158152602001610151565b61018660025481565b604051908152602001610151565b61016d6101a2366004610fae565b610486565b6101ba6101b5366004610feb565b610566565b005b6101e37f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610151565b61021c7f000000000000000000000000144cd22aaa2a80fed0bb8b1deaddc51a53df1d5081565b6040516001600160a01b039091168152602001610151565b610186610618565b61018661024a366004611004565b60036020526000908152604090205481565b61018661026a366004611004565b60056020526000908152604090205481565b60065461021c906001600160a01b031681565b610144610673565b6101ba6102a5366004610feb565b610680565b61016d6102b8366004610f84565b610730565b6101ba610796565b6101ba6102d3366004611026565b6109ab565b6101866102e6366004611099565b600460209081526000928352604080842090915290825290205481565b61021c7f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d81565b61021c7f00000000000000000000000035b99f29b3ec3276a2b3bb5863326b1c100aa16081565b6101ba61035f366004611004565b610bf4565b61021c7f0000000000000000000000006c203a555824ec90a215f37916cf8db58ebe2fa381565b60008054610398906110cc565b80601f01602080910402602001604051908101604052809291908181526020018280546103c4906110cc565b80156104115780601f106103e657610100808354040283529160200191610411565b820191906000526020600020905b8154815290600101906020018083116103f457829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104749086815260200190565b60405180910390a35060015b92915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146104e2576104bd838261111c565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061050a90849061111c565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716906000805160206111fb833981519152906105539087815260200190565b60405180910390a3506001949350505050565b6105703382610c89565b6040516305c2fbcf60e31b8152600481018290527f00000000000000000000000035b99f29b3ec3276a2b3bb5863326b1c100aa1606001600160a01b031690632e17de7890602401600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b505050506106157f0000000000000000000000006c203a555824ec90a215f37916cf8db58ebe2fa33383610cf3565b50565b60007f0000000000000000000000000000000000000000000000000000000000000171461461064e57610649610d86565b905090565b507f4e185ca8fe7d1cf51fef07fe8a88309b3bd51ed042cf903f3834d75bf9bbc8a090565b60018054610398906110cc565b6106ac7f0000000000000000000000006c203a555824ec90a215f37916cf8db58ebe2fa3333084610e20565b60405163534a7e1d60e11b8152600481018290527f00000000000000000000000035b99f29b3ec3276a2b3bb5863326b1c100aa1606001600160a01b03169063a694fc3a90602401600060405180830381600087803b15801561070e57600080fd5b505af1158015610722573d6000803e3d6000fd5b505050506106153382610ec8565b3360009081526003602052604081208054839190839061075190849061111c565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133906000805160206111fb833981519152906104749086815260200190565b6040516305c2fbcf60e31b8152600060048201527f00000000000000000000000035b99f29b3ec3276a2b3bb5863326b1c100aa1606001600160a01b031690632e17de7890602401600060405180830381600087803b1580156107f857600080fd5b505af115801561080c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d6001600160a01b031691506370a0823190602401602060405180830381865afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b919061112f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000144cd22aaa2a80fed0bb8b1deaddc51a53df1d5016906370a0823190602401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610929919061112f565b9050811561096957600654610969907f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d906001600160a01b031684610cf3565b80156109a7576006546109a7907f000000000000000000000000144cd22aaa2a80fed0bb8b1deaddc51a53df1d50906001600160a01b031683610cf3565b5050565b42841015610a005760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b60006001610a0c610618565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610b18573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610b4e5750876001600160a01b0316816001600160a01b0316145b610b8b5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016109f7565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b03163314610c3d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016109f7565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6001600160a01b03821660009081526003602052604081208054839290610cb190849061111c565b90915550506002805482900390556040518181526000906001600160a01b038416906000805160206111fb833981519152906020015b60405180910390a35050565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af191505080601f3d1160016000511416151615610d415750823b153d17155b80610d805760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016109f7565b50505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610db89190611148565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af191505080601f3d1160016000511416151615610e7d5750833b153d17155b80610ec15760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016109f7565b5050505050565b8060026000828254610eda91906111e7565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481526000805160206111fb8339815191529101610ce7565b602081526000825180602084015260005b81811015610f485760208186018101516040868401015201610f2b565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610f7f57600080fd5b919050565b60008060408385031215610f9757600080fd5b610fa083610f68565b946020939093013593505050565b600080600060608486031215610fc357600080fd5b610fcc84610f68565b9250610fda60208501610f68565b929592945050506040919091013590565b600060208284031215610ffd57600080fd5b5035919050565b60006020828403121561101657600080fd5b61101f82610f68565b9392505050565b600080600080600080600060e0888a03121561104157600080fd5b61104a88610f68565b965061105860208901610f68565b95506040880135945060608801359350608088013560ff8116811461107c57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156110ac57600080fd5b6110b583610f68565b91506110c360208401610f68565b90509250929050565b600181811c908216806110e057607f821691505b60208210810361110057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561048057610480611106565b60006020828403121561114157600080fd5b5051919050565b6000808354818160011c9050600182168061116457607f821691505b60208210810361118257634e487b7160e01b84526022600452602484fd5b80801561119657600181146111ab576111db565b60ff19841687528215158302870194506111db565b60008881526020902060005b848110156111d3578154898201526001909101906020016111b7565b505082870194505b50929695505050505050565b808201808211156104805761048061110656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122076ad26cc639f717f74a9f3e125129b8d6d16afe4b85bb96daaeed106097bc1cb64736f6c634300081c0033