ETH Price: $3,123.20 (-0.70%)

Contract

0x4ab2FC6e258a0cA7175D05fF10C5cF798A672cAE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw From St...212130432024-11-18 7:14:5953 mins ago1731914099IN
SushiSwap: FuroStream Token
0 ETH0.0012910612.4608365
Withdraw From St...212088802024-11-17 17:20:1114 hrs ago1731864011IN
SushiSwap: FuroStream Token
0 ETH0.002046319.74551663
Withdraw From St...211626752024-11-11 6:33:477 days ago1731306827IN
SushiSwap: FuroStream Token
0 ETH0.0015326914.79292779
Withdraw From St...211180202024-11-05 0:58:3513 days ago1730768315IN
SushiSwap: FuroStream Token
0 ETH0.000565185.45432455
Withdraw From St...211179532024-11-05 0:45:1113 days ago1730767511IN
SushiSwap: FuroStream Token
0 ETH0.000387914.48342043
Withdraw From St...211126922024-11-04 7:08:2314 days ago1730704103IN
SushiSwap: FuroStream Token
0 ETH0.000506224.88585851
Withdraw From St...211100832024-11-03 22:24:3514 days ago1730672675IN
SushiSwap: FuroStream Token
0 ETH0.000340633.8963942
Withdraw From St...210756042024-10-30 2:53:2319 days ago1730256803IN
SushiSwap: FuroStream Token
0 ETH0.001823517.59768837
Withdraw From St...210644652024-10-28 13:35:3520 days ago1730122535IN
SushiSwap: FuroStream Token
0 ETH0.0013239912.77868395
Withdraw From St...210629892024-10-28 8:38:5920 days ago1730104739IN
SushiSwap: FuroStream Token
0 ETH0.000590425.69717699
Safe Transfer Fr...210563722024-10-27 10:29:2321 days ago1730024963IN
SushiSwap: FuroStream Token
0 ETH0.000524827.18038282
Withdraw From St...210521712024-10-26 20:25:3522 days ago1729974335IN
SushiSwap: FuroStream Token
0 ETH0.000550275.31042829
Withdraw From St...210151502024-10-21 16:28:1127 days ago1729528091IN
SushiSwap: FuroStream Token
0 ETH0.0018263817.62745916
Withdraw From St...209842912024-10-17 9:08:2331 days ago1729156103IN
SushiSwap: FuroStream Token
0 ETH0.0025513724.62198549
Withdraw From St...209807812024-10-16 21:22:3532 days ago1729113755IN
SushiSwap: FuroStream Token
0 ETH0.0018237417.6
Withdraw From St...209794282024-10-16 16:50:4732 days ago1729097447IN
SushiSwap: FuroStream Token
0 ETH0.0019837826.1
Withdraw From St...209728082024-10-15 18:39:2333 days ago1729017563IN
SushiSwap: FuroStream Token
0 ETH0.0014446419.17217234
Withdraw From St...209652332024-10-14 17:15:3534 days ago1728926135IN
SushiSwap: FuroStream Token
0 ETH0.0037648436.33673672
Withdraw From St...209250452024-10-09 2:28:3540 days ago1728440915IN
SushiSwap: FuroStream Token
0 ETH0.0022874622.07513471
Withdraw From St...209177372024-10-08 2:01:5941 days ago1728352919IN
SushiSwap: FuroStream Token
0 ETH0.001000619.65749522
Withdraw From St...208932272024-10-04 16:02:2344 days ago1728057743IN
SushiSwap: FuroStream Token
0 ETH0.0019855523.10634083
Withdraw From St...208738712024-10-01 23:16:5947 days ago1727824619IN
SushiSwap: FuroStream Token
0 ETH0.000704466.79841751
Withdraw From St...208724052024-10-01 18:22:1147 days ago1727806931IN
SushiSwap: FuroStream Token
0 ETH0.0019605622.65971184
Withdraw From St...208610252024-09-30 4:18:2349 days ago1727669903IN
SushiSwap: FuroStream Token
0 ETH0.000557175.37760894
Withdraw From St...208606352024-09-30 2:59:5949 days ago1727665199IN
SushiSwap: FuroStream Token
0 ETH0.0010609310.23847695
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
212130432024-11-18 7:14:5953 mins ago1731914099
0x4ab2FC6e...98A672cAE
0 ETH
212088802024-11-17 17:20:1114 hrs ago1731864011
0x4ab2FC6e...98A672cAE
0 ETH
211626752024-11-11 6:33:477 days ago1731306827
0x4ab2FC6e...98A672cAE
0 ETH
211180202024-11-05 0:58:3513 days ago1730768315
0x4ab2FC6e...98A672cAE
0 ETH
211179532024-11-05 0:45:1113 days ago1730767511
0x4ab2FC6e...98A672cAE
0 ETH
211126922024-11-04 7:08:2314 days ago1730704103
0x4ab2FC6e...98A672cAE
0 ETH
211100832024-11-03 22:24:3514 days ago1730672675
0x4ab2FC6e...98A672cAE
0 ETH
210977352024-11-02 5:00:5916 days ago1730523659
0x4ab2FC6e...98A672cAE
0 ETH
210977352024-11-02 5:00:5916 days ago1730523659
0x4ab2FC6e...98A672cAE
0 ETH
210756042024-10-30 2:53:2319 days ago1730256803
0x4ab2FC6e...98A672cAE
0 ETH
210684172024-10-29 2:50:1120 days ago1730170211
0x4ab2FC6e...98A672cAE
0 ETH
210684172024-10-29 2:50:1120 days ago1730170211
0x4ab2FC6e...98A672cAE
0 ETH
210644652024-10-28 13:35:3520 days ago1730122535
0x4ab2FC6e...98A672cAE
0 ETH
210629892024-10-28 8:38:5920 days ago1730104739
0x4ab2FC6e...98A672cAE
0 ETH
210563722024-10-27 10:29:2321 days ago1730024963
0x4ab2FC6e...98A672cAE
0 ETH
210521712024-10-26 20:25:3522 days ago1729974335
0x4ab2FC6e...98A672cAE
0 ETH
210151502024-10-21 16:28:1127 days ago1729528091
0x4ab2FC6e...98A672cAE
0 ETH
209842912024-10-17 9:08:2331 days ago1729156103
0x4ab2FC6e...98A672cAE
0 ETH
209807812024-10-16 21:22:3532 days ago1729113755
0x4ab2FC6e...98A672cAE
0 ETH
209794282024-10-16 16:50:4732 days ago1729097447
0x4ab2FC6e...98A672cAE
0 ETH
209728082024-10-15 18:39:2333 days ago1729017563
0x4ab2FC6e...98A672cAE
0 ETH
209652332024-10-14 17:15:3534 days ago1728926135
0x4ab2FC6e...98A672cAE
0 ETH
209250452024-10-09 2:28:3540 days ago1728440915
0x4ab2FC6e...98A672cAE
0 ETH
209177372024-10-08 2:01:5941 days ago1728352919
0x4ab2FC6e...98A672cAE
0 ETH
208932272024-10-04 16:02:2344 days ago1728057743
0x4ab2FC6e...98A672cAE
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FuroStream

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 8 : FuroStream.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.10;

import "../interfaces/IFuroStream.sol";

contract FuroStream is
    IFuroStream,
    ERC721("Furo Stream", "FUROSTREAM"),
    Multicall,
    BoringOwnable
{
    IBentoBoxMinimal public immutable bentoBox;
    address public immutable wETH;

    uint256 public streamIds;

    address public tokenURIFetcher;

    mapping(uint256 => Stream) public streams;

    // custom errors
    error NotSenderOrRecipient();
    error InvalidStartTime();
    error InvalidEndTime();
    error InvalidWithdrawTooMuch();
    error NotSender();
    error Overflow();

    constructor(IBentoBoxMinimal _bentoBox, address _wETH) {
        bentoBox = _bentoBox;
        wETH = _wETH;
        streamIds = 1000;
        _bentoBox.registerProtocol();
    }

    function setTokenURIFetcher(address _fetcher) external onlyOwner {
        tokenURIFetcher = _fetcher;
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return ITokenURIFetcher(tokenURIFetcher).fetchTokenURIData(id);
    }

    function setBentoBoxApproval(
        address user,
        bool approved,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable override {
        bentoBox.setMasterContractApproval(
            user,
            address(this),
            approved,
            v,
            r,
            s
        );
    }

    function createStream(
        address recipient,
        address token,
        uint64 startTime,
        uint64 endTime,
        uint256 amount, /// @dev in token amount and not in shares
        bool fromBentoBox
    )
        external
        payable
        override
        returns (uint256 streamId, uint256 depositedShares)
    {
        if (startTime < block.timestamp) revert InvalidStartTime();
        if (endTime <= startTime) revert InvalidEndTime();

        depositedShares = _depositToken(
            token,
            msg.sender,
            address(this),
            amount,
            fromBentoBox
        );

        streamId = streamIds++;

        _mint(recipient, streamId);

        streams[streamId] = Stream({
            sender: msg.sender,
            token: token == address(0) ? wETH : token,
            depositedShares: uint128(depositedShares), // @dev safe since we know bento returns u128
            withdrawnShares: 0,
            startTime: startTime,
            endTime: endTime
        });

        emit CreateStream(
            streamId,
            msg.sender,
            recipient,
            token,
            depositedShares,
            startTime,
            endTime,
            fromBentoBox
        );
    }

    function withdrawFromStream(
        uint256 streamId,
        uint256 sharesToWithdraw,
        address withdrawTo,
        bool toBentoBox,
        bytes calldata taskData
    ) external override returns (uint256 recipientBalance, address to) {
        address recipient = ownerOf[streamId];
        if (msg.sender != streams[streamId].sender && msg.sender != recipient) {
            revert NotSenderOrRecipient();
        }
        Stream storage stream = streams[streamId];
        (, recipientBalance) = _streamBalanceOf(stream);
        if (recipientBalance < sharesToWithdraw)
            revert InvalidWithdrawTooMuch();
        stream.withdrawnShares += uint128(sharesToWithdraw);

        if (msg.sender == recipient && withdrawTo != address(0)) {
            to = withdrawTo;
        } else {
            to = recipient;
        }

        _transferToken(
            stream.token,
            address(this),
            to,
            sharesToWithdraw,
            toBentoBox
        );

        if (taskData.length != 0 && msg.sender == recipient)
            ITasker(to).onTaskReceived(taskData);

        emit Withdraw(
            streamId,
            sharesToWithdraw,
            withdrawTo,
            stream.token,
            toBentoBox
        );
    }

    function cancelStream(uint256 streamId, bool toBentoBox)
        external
        override
        returns (uint256 senderBalance, uint256 recipientBalance)
    {
        address recipient = ownerOf[streamId];
        if (msg.sender != streams[streamId].sender && msg.sender != recipient) {
            revert NotSenderOrRecipient();
        }
        Stream memory stream = streams[streamId];
        (senderBalance, recipientBalance) = _streamBalanceOf(stream);

        delete streams[streamId];

        _transferToken(
            stream.token,
            address(this),
            recipient,
            recipientBalance,
            toBentoBox
        );
        _transferToken(
            stream.token,
            address(this),
            stream.sender,
            senderBalance,
            toBentoBox
        );

        emit CancelStream(
            streamId,
            senderBalance,
            recipientBalance,
            stream.token,
            toBentoBox
        );
    }

    function getStream(uint256 streamId)
        external
        view
        override
        returns (Stream memory)
    {
        return streams[streamId];
    }

    function streamBalanceOf(uint256 streamId)
        external
        view
        override
        returns (uint256 senderBalance, uint256 recipientBalance)
    {
        return _streamBalanceOf(streams[streamId]);
    }

    function _streamBalanceOf(Stream memory stream)
        internal
        view
        returns (uint256 senderBalance, uint256 recipientBalance)
    {
        if (block.timestamp <= stream.startTime) {
            senderBalance = stream.depositedShares;
            recipientBalance = 0;
        } else if (stream.endTime <= block.timestamp) {
            recipientBalance = stream.depositedShares - stream.withdrawnShares;
            senderBalance = 0;
        } else {
            uint64 timeDelta = uint64(block.timestamp) - stream.startTime;
            uint128 streamed = ((stream.depositedShares * timeDelta) /
                (stream.endTime - stream.startTime));
            recipientBalance = streamed - stream.withdrawnShares;
            senderBalance = stream.depositedShares - streamed;
        }
    }

    function updateSender(uint256 streamId, address sender) external override {
        Stream storage stream = streams[streamId];
        if (msg.sender != stream.sender) revert NotSender();
        stream.sender = sender;
    }

    function updateStream(
        uint256 streamId,
        uint128 topUpAmount,
        uint64 extendTime,
        bool fromBentoBox
    ) external payable override returns (uint256 depositedShares) {
        Stream storage stream = streams[streamId];
        if (msg.sender != stream.sender) revert NotSender();

        depositedShares = _depositToken(
            stream.token,
            stream.sender,
            address(this),
            topUpAmount,
            fromBentoBox
        );

        address recipient = ownerOf[streamId];

        (uint256 senderBalance, uint256 recipientBalance) = _streamBalanceOf(
            stream
        );

        stream.startTime = uint64(block.timestamp);
        stream.withdrawnShares = 0;
        uint256 newDepositedShares = senderBalance + depositedShares;
        if (newDepositedShares > type(uint128).max) revert Overflow();
        stream.depositedShares = uint128(newDepositedShares);
        stream.endTime += extendTime;

        _transferToken(
            stream.token,
            address(this),
            recipient,
            recipientBalance,
            true
        );

        emit UpdateStream(streamId, topUpAmount, extendTime, fromBentoBox);
    }

    function _depositToken(
        address token,
        address from,
        address to,
        uint256 amount,
        bool fromBentoBox
    ) internal returns (uint256 depositedShares) {
        if (fromBentoBox) {
            depositedShares = bentoBox.toShare(token, amount, false);
            bentoBox.transfer(token, from, to, depositedShares);
        } else {
            (, depositedShares) = bentoBox.deposit{
                value: token == address(0) ? amount : 0
            }(token, from, to, amount, 0);
        }
    }

    function _transferToken(
        address token,
        address from,
        address to,
        uint256 share,
        bool toBentoBox
    ) internal {
        if (toBentoBox) {
            bentoBox.transfer(token, from, to, share);
        } else {
            bentoBox.withdraw(token, from, to, 0, share);
        }
    }
}

File 2 of 8 : IFuroStream.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.10;

import "./ITasker.sol";
import "./ITokenURIFetcher.sol";
import "./IBentoBoxMinimal.sol";
import "../utils/Multicall.sol";
import "../utils/BoringOwnable.sol";
import "@rari-capital/solmate/src/tokens/ERC721.sol";

interface IFuroStream {
    function setBentoBoxApproval(
        address user,
        bool approved,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable;

    function createStream(
        address recipient,
        address token,
        uint64 startTime,
        uint64 endTime,
        uint256 amount, /// @dev in token amount and not in shares
        bool fromBento
    ) external payable returns (uint256 streamId, uint256 depositedShares);

    function withdrawFromStream(
        uint256 streamId,
        uint256 sharesToWithdraw,
        address withdrawTo,
        bool toBentoBox,
        bytes memory taskData
    ) external returns (uint256 recipientBalance, address to);

    function cancelStream(uint256 streamId, bool toBentoBox)
        external
        returns (uint256 senderBalance, uint256 recipientBalance);

    function updateSender(uint256 streamId, address sender) external;

    function updateStream(
        uint256 streamId,
        uint128 topUpAmount,
        uint64 extendTime,
        bool fromBentoBox
    ) external payable returns (uint256 depositedShares);

    function streamBalanceOf(uint256 streamId)
        external
        view
        returns (uint256 senderBalance, uint256 recipientBalance);

    function getStream(uint256 streamId) external view returns (Stream memory);

    event CreateStream(
        uint256 indexed streamId,
        address indexed sender,
        address indexed recipient,
        address token,
        uint256 amount,
        uint256 startTime,
        uint256 endTime,
        bool fromBentoBox
    );

    event UpdateStream(
        uint256 indexed streamId,
        uint128 indexed topUpAmount,
        uint64 indexed extendTime,
        bool fromBentoBox
    );

    event Withdraw(
        uint256 indexed streamId,
        uint256 indexed sharesToWithdraw,
        address indexed withdrawTo,
        address token,
        bool toBentoBox
    );

    event CancelStream(
        uint256 indexed streamId,
        uint256 indexed senderBalance,
        uint256 indexed recipientBalance,
        address token,
        bool toBentoBox
    );

    struct Stream {
        address sender;
        address token;
        uint128 depositedShares;
        uint128 withdrawnShares;
        uint64 startTime;
        uint64 endTime;
    }
}

File 3 of 8 : ITasker.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.10;

interface ITasker {
    function onTaskReceived(
        bytes calldata data
    ) external;
}

File 4 of 8 : ITokenURIFetcher.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.10;

interface ITokenURIFetcher {
    function fetchTokenURIData(uint256 id)
        external
        view
        returns (string memory);
}

File 5 of 8 : IBentoBoxMinimal.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.10;

/// @notice Minimal BentoBox vault interface.
/// @dev `token` is aliased as `address` from `IERC20` for simplicity.
interface IBentoBoxMinimal {
    /// @notice Balance per ERC-20 token per account in shares.
    function balanceOf(address, address) external view returns (uint256);

    /// @dev Helper function to represent an `amount` of `token` in shares.
    /// @param token The ERC-20 token.
    /// @param amount The `token` amount.
    /// @param roundUp If the result `share` should be rounded up.
    /// @return share The token amount represented in shares.
    function toShare(
        address token,
        uint256 amount,
        bool roundUp
    ) external view returns (uint256 share);

    /// @dev Helper function to represent shares back into the `token` amount.
    /// @param token The ERC-20 token.
    /// @param share The amount of shares.
    /// @param roundUp If the result should be rounded up.
    /// @return amount The share amount back into native representation.
    function toAmount(
        address token,
        uint256 share,
        bool roundUp
    ) external view returns (uint256 amount);

    /// @notice Registers this contract so that users can approve it for BentoBox.
    function registerProtocol() external;

    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.
    /// @param token_ The ERC-20 token to deposit.
    /// @param from which account to pull the tokens.
    /// @param to which account to push the tokens.
    /// @param amount Token amount in native representation to deposit.
    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.
    /// @return amountOut The amount deposited.
    /// @return shareOut The deposited amount represented in shares.
    function deposit(
        address token_,
        address from,
        address to,
        uint256 amount,
        uint256 share
    ) external payable returns (uint256 amountOut, uint256 shareOut);

    /// @notice Withdraws an amount of `token` from a user account.
    /// @param token_ The ERC-20 token to withdraw.
    /// @param from which user to pull the tokens.
    /// @param to which user to push the tokens.
    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.
    /// @param share Like above, but `share` takes precedence over `amount`.
    function withdraw(
        address token_,
        address from,
        address to,
        uint256 amount,
        uint256 share
    ) external returns (uint256 amountOut, uint256 shareOut);

    /// @notice Transfer shares from a user account to another one.
    /// @param token The ERC-20 token to transfer.
    /// @param from which user to pull the tokens.
    /// @param to which user to push the tokens.
    /// @param share The amount of `token` in shares.
    function transfer(
        address token,
        address from,
        address to,
        uint256 share
    ) external;

    function setMasterContractApproval(
        address user,
        address masterContract,
        bool approved,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 6 of 8 : Multicall.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.10;

/// @title Multicall
/// @notice Enables calling multiple methods in a single call to the contract
abstract contract Multicall {
    function multicall(bytes[] calldata data)
        public
        payable
        returns (bytes[] memory results)
    {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(
                data[i]
            );

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;
        }
    }
}

File 7 of 8 : BoringOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12;

// Audit on 5-Jan-2021 by Keno and BoringCrypto
// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto

contract BoringOwnableData {
    address public owner;
    address public pendingOwner;
}

contract BoringOwnable is BoringOwnableData {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /// @notice `owner` defaults to msg.sender on construction.
    constructor() {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
    /// Can only be invoked by the current `owner`.
    /// @param newOwner Address of the new owner.
    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
    function transferOwnership(
        address newOwner,
        bool direct,
        bool renounce
    ) public onlyOwner {
        if (direct) {
            // Checks
            require(
                newOwner != address(0) || renounce,
                "Ownable: zero address"
            );

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    /// @notice Needs to be called by `pendingOwner` to claim ownership.
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;

        // Checks
        require(
            msg.sender == _pendingOwner,
            "Ownable: caller != pending owner"
        );

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    /// @notice Only allows the `owner` to execute the function.
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}

File 8 of 8 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IBentoBoxMinimal","name":"_bentoBox","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidEndTime","type":"error"},{"inputs":[],"name":"InvalidStartTime","type":"error"},{"inputs":[],"name":"InvalidWithdrawTooMuch","type":"error"},{"inputs":[],"name":"NotSender","type":"error"},{"inputs":[],"name":"NotSenderOrRecipient","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"senderBalance","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"recipientBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"CancelStream","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"fromBentoBox","type":"bool"}],"name":"CreateStream","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"uint128","name":"topUpAmount","type":"uint128"},{"indexed":true,"internalType":"uint64","name":"extendTime","type":"uint64"},{"indexed":false,"internalType":"bool","name":"fromBentoBox","type":"bool"}],"name":"UpdateStream","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"sharesToWithdraw","type":"uint256"},{"indexed":true,"internalType":"address","name":"withdrawTo","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bentoBox","outputs":[{"internalType":"contract IBentoBoxMinimal","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"cancelStream","outputs":[{"internalType":"uint256","name":"senderBalance","type":"uint256"},{"internalType":"uint256","name":"recipientBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"fromBentoBox","type":"bool"}],"name":"createStream","outputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"depositedShares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"getStream","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"depositedShares","type":"uint128"},{"internalType":"uint128","name":"withdrawnShares","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"}],"internalType":"struct IFuroStream.Stream","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setBentoBoxApproval","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_fetcher","type":"address"}],"name":"setTokenURIFetcher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"streamBalanceOf","outputs":[{"internalType":"uint256","name":"senderBalance","type":"uint256"},{"internalType":"uint256","name":"recipientBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"streamIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"streams","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"depositedShares","type":"uint128"},{"internalType":"uint128","name":"withdrawnShares","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIFetcher","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"updateSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint128","name":"topUpAmount","type":"uint128"},{"internalType":"uint64","name":"extendTime","type":"uint64"},{"internalType":"bool","name":"fromBentoBox","type":"bool"}],"name":"updateStream","outputs":[{"internalType":"uint256","name":"depositedShares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"sharesToWithdraw","type":"uint256"},{"internalType":"address","name":"withdrawTo","type":"address"},{"internalType":"bool","name":"toBentoBox","type":"bool"},{"internalType":"bytes","name":"taskData","type":"bytes"}],"name":"withdrawFromStream","outputs":[{"internalType":"uint256","name":"recipientBalance","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162003aec38038062003aec833981016040819052620000349162000218565b604080518082018252600b81526a4675726f2053747265616d60a81b60208083019182528351808501909452600a8452694655524f53545245414d60b01b908401528151919291620000899160009162000159565b5080516200009f90600190602084019062000159565b5050600680546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b03808316608081905290821660a0526103e86008556040805163577268d960e11b8152905163aee4d1b29160048082019260009290919082900301818387803b1580156200013857600080fd5b505af11580156200014d573d6000803e3d6000fd5b50505050505062000294565b828054620001679062000257565b90600052602060002090601f0160209004810192826200018b5760008555620001d6565b82601f10620001a657805160ff1916838001178555620001d6565b82800160010185558215620001d6579182015b82811115620001d6578251825591602001919060010190620001b9565b50620001e4929150620001e8565b5090565b5b80821115620001e45760008155600101620001e9565b6001600160a01b03811681146200021557600080fd5b50565b600080604083850312156200022c57600080fd5b82516200023981620001ff565b60208401519092506200024c81620001ff565b809150509250929050565b600181811c908216806200026c57607f821691505b602082108114156200028e57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613801620002eb60003960008181610905015261205d01526000818161059b015281816113dc0152818161276e0152818161283201528181612903015281816129cd0152612a4701526138016000f3fe6080604052600436106101e35760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c39781461088b578063e985e9c5146108b8578063f2428621146108f3578063f8c7e5881461092757600080fd5b8063b3a2b2cf14610818578063b88d4fde14610838578063c14cf8f014610858578063c87b56dd1461086b57600080fd5b806395d89b41116100d157806395d89b41146107ad5780639fd2640e146107c2578063a22cb465146107d8578063ac9650d8146107f857600080fd5b80636b2ace871461058957806370a08231146105bd578063894e9a0d146105f85780638da5cb5b1461078057600080fd5b80632b9134531161017a5780634e71e0c8116101495780634e71e0c81461040857806359f71c1a1461041d5780636352211e1461043d57806364d60d911461048057600080fd5b80632b9134531461036b57806342842e0e1461038b578063489bb0b2146103ab57806348bae94b146103be57600080fd5b8063081812fc116101b6578063081812fc146102b3578063095ea7b3146102f657806323b872dd1461031657806325958d8f1461033657600080fd5b806301ffc9a7146101e857806306fdde031461021d578063078dfbe71461023f57806307d88aad14610261575b600080fd5b3480156101f457600080fd5b50610208610203366004612d01565b61093a565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610a1f565b6040516102149190612d9b565b34801561024b57600080fd5b5061025f61025a366004612de7565b610aad565b005b34801561026d57600080fd5b5060095461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b3480156102bf57600080fd5b5061028e6102ce366004612e2a565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561030257600080fd5b5061025f610311366004612e43565b610c9e565b34801561032257600080fd5b5061025f610331366004612e6d565b610de8565b34801561034257600080fd5b50610356610351366004612e2a565b6110af565b60408051928352602083019190915201610214565b34801561037757600080fd5b5061025f610386366004612ea9565b611169565b34801561039757600080fd5b5061025f6103a6366004612e6d565b61120d565b61025f6103b9366004612ed5565b611372565b3480156103ca57600080fd5b506103de6103d9366004612f32565b61143f565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610214565b34801561041457600080fd5b5061025f6117c8565b34801561042957600080fd5b50610356610438366004612fd8565b6118df565b34801561044957600080fd5b5061028e610458366004612e2a565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561048c57600080fd5b5061052161049b366004612e2a565b600a60205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9283169391909216916fffffffffffffffffffffffffffffffff808316927001000000000000000000000000000000009004169067ffffffffffffffff808216916801000000000000000090041686565b6040805173ffffffffffffffffffffffffffffffffffffffff97881681529690951660208701526fffffffffffffffffffffffffffffffff938416948601949094529116606084015267ffffffffffffffff90811660808401521660a082015260c001610214565b34801561059557600080fd5b5061028e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c957600080fd5b506105ea6105d8366004612ffb565b60026020526000908152604090205481565b604051908152602001610214565b34801561060457600080fd5b506106f2610613366004612e2a565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506000908152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff808216948401949094527001000000000000000000000000000000009004909216606082015260039091015467ffffffffffffffff8082166080840152680100000000000000009091041660a082015290565b6040516102149190600060c08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401525060408301516fffffffffffffffffffffffffffffffff80821660408501528060608601511660608501525050608083015167ffffffffffffffff80821660808501528060a08601511660a0850152505092915050565b34801561078c57600080fd5b5060065461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107b957600080fd5b50610232611b2f565b3480156107ce57600080fd5b506105ea60085481565b3480156107e457600080fd5b5061025f6107f3366004613016565b611b3c565b61080b610806366004613040565b611bd3565b60405161021491906130b5565b34801561082457600080fd5b5061025f610833366004612ffb565b611d45565b34801561084457600080fd5b5061025f6108533660046131f9565b611e0d565b6103566108663660046132bc565b611f64565b34801561087757600080fd5b50610232610886366004612e2a565b612205565b34801561089757600080fd5b5060075461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108c457600080fd5b506102086108d3366004613329565b600560209081526000928352604080842090915290825290205460ff1681565b3480156108ff57600080fd5b5061028e7f000000000000000000000000000000000000000000000000000000000000000081565b6105ea610935366004613353565b6122bb565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109cd57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a1957507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60008054610a2c906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a58906133b7565b8015610aa55780601f10610a7a57610100808354040283529160200191610aa5565b820191906000526020600020905b815481529060010190602001808311610a8857829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610b33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610c585773ffffffffffffffffffffffffffffffffffffffff8316151580610b5a5750805b610bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610b2a565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610d01575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610b2a565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610b2a565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f3c575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f77575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600a60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169381019390935260028101546fffffffffffffffffffffffffffffffff80821693850193909352700100000000000000000000000000000000900490911660608301526003015467ffffffffffffffff8082166080840152680100000000000000009091041660a08201528190611160906125e7565b91509150915091565b6000828152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff1633146111c7576040517fb2c3aa6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611218838383610de8565b73ffffffffffffffffffffffffffffffffffffffff82163b158061130c57506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156112c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e8919061340b565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610b2a565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b505050505050505050565b600086815260036020908152604080832054600a909252822054829173ffffffffffffffffffffffffffffffffffffffff9081169116331480159061149a57503373ffffffffffffffffffffffffffffffffffffffff821614155b156114d1576040517fc821e7f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000898152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092166060820152600382015467ffffffffffffffff8082166080840152680100000000000000009091041660a0820152611582906125e7565b945050888410156115bf576040517f6a1f509a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888160020160108282829054906101000a90046fffffffffffffffffffffffffffffffff166115ee9190613457565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015611674575073ffffffffffffffffffffffffffffffffffffffff881615155b1561168157879250611685565b8192505b60018101546116ad9073ffffffffffffffffffffffffffffffffffffffff1630858c8b61270c565b84158015906116d157503373ffffffffffffffffffffffffffffffffffffffff8316145b1561175d576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063330df2829061172a908990899060040161348b565b600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b505050505b60018101546040805173ffffffffffffffffffffffffffffffffffffffff92831681528915156020820152918a16918b918d917f8deda66e5f5ef6c43f45734b544b27efe7fe2cd80a4b7fbf5c789aa69c024818910160405180910390a45050965096945050505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633811461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610b2a565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b600082815260036020908152604080832054600a909252822054829173ffffffffffffffffffffffffffffffffffffffff9081169116331480159061193a57503373ffffffffffffffffffffffffffffffffffffffff821614155b15611971576040517fc821e7f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff808216948401949094527001000000000000000000000000000000009004909216606082015260039091015467ffffffffffffffff8082166080840152680100000000000000009091041660a0820152611a23816125e7565b6000888152600a60209081526040822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116825560018201805490911690556002810192909255600390910180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690558301519195509350611aae903084868961270c565b611ac38160200151308360000151878961270c565b8284877fb76e70514ce71ea8144278de4cb58afc6c323447436371f6fe49e145ffdc540b846020015189604051611b1e92919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a450509250929050565b60018054610a2c906133b7565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611bee57611bee613135565b604051908082528060200260200182016040528015611c2157816020015b6060815260200190600190039081611c0c5790505b50905060005b82811015611d3e5760008030868685818110611c4557611c456134d8565b9050602002810190611c579190613507565b604051611c65929190613573565b600060405180830381855af49150503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b509150915081611d0b57604481511015611cbe57600080fd5b60048101905080806020019051810190611cd89190613583565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a9190612d9b565b80848481518110611d1e57611d1e6134d8565b602002602001018190525050508080611d36906135f1565b915050611c27565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611dc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b2a565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611e18848484610de8565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611ef857506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611e9190339089908890889060040161362a565b6020604051808303816000875af1158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed4919061340b565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610b2a565b50505050565b600080428667ffffffffffffffff161015611fab576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8567ffffffffffffffff168567ffffffffffffffff1611611ff8576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61200587333087876128a8565b600880549192506000612017836135f1565b9190505591506120278883612b37565b6040805160c081019091523381526020810173ffffffffffffffffffffffffffffffffffffffff89161561205b578861207d565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff90811682526fffffffffffffffffffffffffffffffff8481166020808501919091526000604080860182905267ffffffffffffffff8d811660608089018290528e83166080998a018190528c8652600a8752948490208a518154908a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161782558b880151600183018054918c16919092161790558a8501518b8301518916700100000000000000000000000000000000029816979097176002880155898901516003909701805460a09b8c0151851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911698909416979097179290921790955581518f871681529384018990529083019390935291810191909152861515928101929092528a1691339185917f1a2d760a604c03eaa74e64c0e42f0e4f41824be534853f4c2f3ed42d36fed25c910160405180910390a4965096945050505050565b6009546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015612275573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a199190810190613583565b6000848152600a60205260408120805473ffffffffffffffffffffffffffffffffffffffff163314612319576040517fb2c3aa6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015481546123589173ffffffffffffffffffffffffffffffffffffffff9081169116306fffffffffffffffffffffffffffffffff8916876128a8565b600087815260036020818152604080842054815160c081018352875473ffffffffffffffffffffffffffffffffffffffff9081168252600189015481169482019490945260028801546fffffffffffffffffffffffffffffffff80821694830194909452700100000000000000000000000000000000900490921660608301529286015467ffffffffffffffff8082166080840152680100000000000000009091041660a082015293955016918190612410906125e7565b6003860180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790556002860180546fffffffffffffffffffffffffffffffff169055909250905060006124718684613673565b90506fffffffffffffffffffffffffffffffff8111156124bd576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002850180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff831617905560038501805489919060089061252890849068010000000000000000900467ffffffffffffffff1661368b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506125808560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16308685600161270c565b8767ffffffffffffffff16896fffffffffffffffffffffffffffffffff168b7f9e2386766b478abaf84b870cc94441fee88f4a0d3ab18b96e523f193a695f3a18a6040516125d2911515815260200190565b60405180910390a45050505050949350505050565b600080826080015167ffffffffffffffff16421161261d575050604001516fffffffffffffffffffffffffffffffff1690600090565b428360a0015167ffffffffffffffff1611612663578260600151836040015161264691906136ae565b6fffffffffffffffffffffffffffffffff16905060009150915091565b600083608001514261267591906136df565b9050600084608001518560a0015161268d91906136df565b67ffffffffffffffff168267ffffffffffffffff1686604001516126b19190613700565b6126bb9190613738565b90508460600151816126cd91906136ae565b6fffffffffffffffffffffffffffffffff1692508085604001516126f191906136ae565b6fffffffffffffffffffffffffffffffff1693505050915091565b80156127cf576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156127b257600080fd5b505af11580156127c6573d6000803e3d6000fd5b505050506128a1565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af115801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e919061378e565b50505b5050505050565b60008115612a30576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e91906137b2565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b158015612a1357600080fd5b505af1158015612a27573d6000803e3d6000fd5b50505050612b2e565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615612a7d576000612a7f565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612b05573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b2a919061378e565b9150505b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612bb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610b2a565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612cfe57600080fd5b50565b600060208284031215612d1357600080fd5b8135612d1e81612cd0565b9392505050565b60005b83811015612d40578181015183820152602001612d28565b83811115611f5e5750506000910152565b60008151808452612d69816020860160208601612d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d1e6020830184612d51565b803573ffffffffffffffffffffffffffffffffffffffff81168114612dd257600080fd5b919050565b80358015158114612dd257600080fd5b600080600060608486031215612dfc57600080fd5b612e0584612dae565b9250612e1360208501612dd7565b9150612e2160408501612dd7565b90509250925092565b600060208284031215612e3c57600080fd5b5035919050565b60008060408385031215612e5657600080fd5b612e5f83612dae565b946020939093013593505050565b600080600060608486031215612e8257600080fd5b612e8b84612dae565b9250612e9960208501612dae565b9150604084013590509250925092565b60008060408385031215612ebc57600080fd5b82359150612ecc60208401612dae565b90509250929050565b600080600080600060a08688031215612eed57600080fd5b612ef686612dae565b9450612f0460208701612dd7565b9350604086013560ff81168114612f1a57600080fd5b94979396509394606081013594506080013592915050565b60008060008060008060a08789031215612f4b57600080fd5b8635955060208701359450612f6260408801612dae565b9350612f7060608801612dd7565b9250608087013567ffffffffffffffff80821115612f8d57600080fd5b818901915089601f830112612fa157600080fd5b813581811115612fb057600080fd5b8a6020828501011115612fc257600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612feb57600080fd5b82359150612ecc60208401612dd7565b60006020828403121561300d57600080fd5b612d1e82612dae565b6000806040838503121561302957600080fd5b61303283612dae565b9150612ecc60208401612dd7565b6000806020838503121561305357600080fd5b823567ffffffffffffffff8082111561306b57600080fd5b818501915085601f83011261307f57600080fd5b81358181111561308e57600080fd5b8660208260051b85010111156130a357600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613128577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613116858351612d51565b945092850192908501906001016130dc565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156131ab576131ab613135565b604052919050565b600067ffffffffffffffff8211156131cd576131cd613135565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561320f57600080fd5b61321885612dae565b935061322660208601612dae565b925060408501359150606085013567ffffffffffffffff81111561324957600080fd5b8501601f8101871361325a57600080fd5b803561326d613268826131b3565b613164565b81815288602083850101111561328257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b803567ffffffffffffffff81168114612dd257600080fd5b60008060008060008060c087890312156132d557600080fd5b6132de87612dae565b95506132ec60208801612dae565b94506132fa604088016132a4565b9350613308606088016132a4565b92506080870135915061331d60a08801612dd7565b90509295509295509295565b6000806040838503121561333c57600080fd5b61334583612dae565b9150612ecc60208401612dae565b6000806000806080858703121561336957600080fd5b8435935060208501356fffffffffffffffffffffffffffffffff8116811461339057600080fd5b925061339e604086016132a4565b91506133ac60608601612dd7565b905092959194509250565b600181811c908216806133cb57607f821691505b60208210811415613405577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561341d57600080fd5b8151612d1e81612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff80831681851680830382111561348257613482613428565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261353c57600080fd5b83018035915067ffffffffffffffff82111561355757600080fd5b60200191503681900382131561356c57600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561359557600080fd5b815167ffffffffffffffff8111156135ac57600080fd5b8201601f810184136135bd57600080fd5b80516135cb613268826131b3565b8181528560208385010111156135e057600080fd5b612b2e826020830160208601612d25565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561362357613623613428565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136696080830184612d51565b9695505050505050565b6000821982111561368657613686613428565b500190565b600067ffffffffffffffff80831681851680830382111561348257613482613428565b60006fffffffffffffffffffffffffffffffff838116908316818110156136d7576136d7613428565b039392505050565b600067ffffffffffffffff838116908316818110156136d7576136d7613428565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561372f5761372f613428565b02949350505050565b60006fffffffffffffffffffffffffffffffff80841680613782577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600080604083850312156137a157600080fd5b505080516020909101519092909150565b6000602082840312156137c457600080fd5b505191905056fea2646970667358221220ca8a362d21b3de557019306c5454882a264d66a47a3b11ba3dd6ff014ab116bc64736f6c634300080a0033000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c39781461088b578063e985e9c5146108b8578063f2428621146108f3578063f8c7e5881461092757600080fd5b8063b3a2b2cf14610818578063b88d4fde14610838578063c14cf8f014610858578063c87b56dd1461086b57600080fd5b806395d89b41116100d157806395d89b41146107ad5780639fd2640e146107c2578063a22cb465146107d8578063ac9650d8146107f857600080fd5b80636b2ace871461058957806370a08231146105bd578063894e9a0d146105f85780638da5cb5b1461078057600080fd5b80632b9134531161017a5780634e71e0c8116101495780634e71e0c81461040857806359f71c1a1461041d5780636352211e1461043d57806364d60d911461048057600080fd5b80632b9134531461036b57806342842e0e1461038b578063489bb0b2146103ab57806348bae94b146103be57600080fd5b8063081812fc116101b6578063081812fc146102b3578063095ea7b3146102f657806323b872dd1461031657806325958d8f1461033657600080fd5b806301ffc9a7146101e857806306fdde031461021d578063078dfbe71461023f57806307d88aad14610261575b600080fd5b3480156101f457600080fd5b50610208610203366004612d01565b61093a565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610a1f565b6040516102149190612d9b565b34801561024b57600080fd5b5061025f61025a366004612de7565b610aad565b005b34801561026d57600080fd5b5060095461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b3480156102bf57600080fd5b5061028e6102ce366004612e2a565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561030257600080fd5b5061025f610311366004612e43565b610c9e565b34801561032257600080fd5b5061025f610331366004612e6d565b610de8565b34801561034257600080fd5b50610356610351366004612e2a565b6110af565b60408051928352602083019190915201610214565b34801561037757600080fd5b5061025f610386366004612ea9565b611169565b34801561039757600080fd5b5061025f6103a6366004612e6d565b61120d565b61025f6103b9366004612ed5565b611372565b3480156103ca57600080fd5b506103de6103d9366004612f32565b61143f565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610214565b34801561041457600080fd5b5061025f6117c8565b34801561042957600080fd5b50610356610438366004612fd8565b6118df565b34801561044957600080fd5b5061028e610458366004612e2a565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561048c57600080fd5b5061052161049b366004612e2a565b600a60205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9283169391909216916fffffffffffffffffffffffffffffffff808316927001000000000000000000000000000000009004169067ffffffffffffffff808216916801000000000000000090041686565b6040805173ffffffffffffffffffffffffffffffffffffffff97881681529690951660208701526fffffffffffffffffffffffffffffffff938416948601949094529116606084015267ffffffffffffffff90811660808401521660a082015260c001610214565b34801561059557600080fd5b5061028e7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681565b3480156105c957600080fd5b506105ea6105d8366004612ffb565b60026020526000908152604090205481565b604051908152602001610214565b34801561060457600080fd5b506106f2610613366004612e2a565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506000908152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff808216948401949094527001000000000000000000000000000000009004909216606082015260039091015467ffffffffffffffff8082166080840152680100000000000000009091041660a082015290565b6040516102149190600060c08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401525060408301516fffffffffffffffffffffffffffffffff80821660408501528060608601511660608501525050608083015167ffffffffffffffff80821660808501528060a08601511660a0850152505092915050565b34801561078c57600080fd5b5060065461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107b957600080fd5b50610232611b2f565b3480156107ce57600080fd5b506105ea60085481565b3480156107e457600080fd5b5061025f6107f3366004613016565b611b3c565b61080b610806366004613040565b611bd3565b60405161021491906130b5565b34801561082457600080fd5b5061025f610833366004612ffb565b611d45565b34801561084457600080fd5b5061025f6108533660046131f9565b611e0d565b6103566108663660046132bc565b611f64565b34801561087757600080fd5b50610232610886366004612e2a565b612205565b34801561089757600080fd5b5060075461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108c457600080fd5b506102086108d3366004613329565b600560209081526000928352604080842090915290825290205460ff1681565b3480156108ff57600080fd5b5061028e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6105ea610935366004613353565b6122bb565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109cd57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a1957507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60008054610a2c906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a58906133b7565b8015610aa55780601f10610a7a57610100808354040283529160200191610aa5565b820191906000526020600020905b815481529060010190602001808311610a8857829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610b33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610c585773ffffffffffffffffffffffffffffffffffffffff8316151580610b5a5750805b610bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610b2a565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610d01575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610b2a565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610b2a565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f3c575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f77575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600a60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169381019390935260028101546fffffffffffffffffffffffffffffffff80821693850193909352700100000000000000000000000000000000900490911660608301526003015467ffffffffffffffff8082166080840152680100000000000000009091041660a08201528190611160906125e7565b91509150915091565b6000828152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff1633146111c7576040517fb2c3aa6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611218838383610de8565b73ffffffffffffffffffffffffffffffffffffffff82163b158061130c57506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156112c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e8919061340b565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610b2a565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063c0a47c939060c401600060405180830381600087803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b505050505050505050565b600086815260036020908152604080832054600a909252822054829173ffffffffffffffffffffffffffffffffffffffff9081169116331480159061149a57503373ffffffffffffffffffffffffffffffffffffffff821614155b156114d1576040517fc821e7f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000898152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092166060820152600382015467ffffffffffffffff8082166080840152680100000000000000009091041660a0820152611582906125e7565b945050888410156115bf576040517f6a1f509a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888160020160108282829054906101000a90046fffffffffffffffffffffffffffffffff166115ee9190613457565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015611674575073ffffffffffffffffffffffffffffffffffffffff881615155b1561168157879250611685565b8192505b60018101546116ad9073ffffffffffffffffffffffffffffffffffffffff1630858c8b61270c565b84158015906116d157503373ffffffffffffffffffffffffffffffffffffffff8316145b1561175d576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063330df2829061172a908990899060040161348b565b600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b505050505b60018101546040805173ffffffffffffffffffffffffffffffffffffffff92831681528915156020820152918a16918b918d917f8deda66e5f5ef6c43f45734b544b27efe7fe2cd80a4b7fbf5c789aa69c024818910160405180910390a45050965096945050505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633811461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610b2a565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b600082815260036020908152604080832054600a909252822054829173ffffffffffffffffffffffffffffffffffffffff9081169116331480159061193a57503373ffffffffffffffffffffffffffffffffffffffff821614155b15611971576040517fc821e7f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff808216948401949094527001000000000000000000000000000000009004909216606082015260039091015467ffffffffffffffff8082166080840152680100000000000000009091041660a0820152611a23816125e7565b6000888152600a60209081526040822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116825560018201805490911690556002810192909255600390910180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690558301519195509350611aae903084868961270c565b611ac38160200151308360000151878961270c565b8284877fb76e70514ce71ea8144278de4cb58afc6c323447436371f6fe49e145ffdc540b846020015189604051611b1e92919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a450509250929050565b60018054610a2c906133b7565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611bee57611bee613135565b604051908082528060200260200182016040528015611c2157816020015b6060815260200190600190039081611c0c5790505b50905060005b82811015611d3e5760008030868685818110611c4557611c456134d8565b9050602002810190611c579190613507565b604051611c65929190613573565b600060405180830381855af49150503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b509150915081611d0b57604481511015611cbe57600080fd5b60048101905080806020019051810190611cd89190613583565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a9190612d9b565b80848481518110611d1e57611d1e6134d8565b602002602001018190525050508080611d36906135f1565b915050611c27565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611dc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b2a565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611e18848484610de8565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611ef857506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611e9190339089908890889060040161362a565b6020604051808303816000875af1158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed4919061340b565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610b2a565b50505050565b600080428667ffffffffffffffff161015611fab576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8567ffffffffffffffff168567ffffffffffffffff1611611ff8576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61200587333087876128a8565b600880549192506000612017836135f1565b9190505591506120278883612b37565b6040805160c081019091523381526020810173ffffffffffffffffffffffffffffffffffffffff89161561205b578861207d565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b73ffffffffffffffffffffffffffffffffffffffff90811682526fffffffffffffffffffffffffffffffff8481166020808501919091526000604080860182905267ffffffffffffffff8d811660608089018290528e83166080998a018190528c8652600a8752948490208a518154908a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161782558b880151600183018054918c16919092161790558a8501518b8301518916700100000000000000000000000000000000029816979097176002880155898901516003909701805460a09b8c0151851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911698909416979097179290921790955581518f871681529384018990529083019390935291810191909152861515928101929092528a1691339185917f1a2d760a604c03eaa74e64c0e42f0e4f41824be534853f4c2f3ed42d36fed25c910160405180910390a4965096945050505050565b6009546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015612275573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a199190810190613583565b6000848152600a60205260408120805473ffffffffffffffffffffffffffffffffffffffff163314612319576040517fb2c3aa6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015481546123589173ffffffffffffffffffffffffffffffffffffffff9081169116306fffffffffffffffffffffffffffffffff8916876128a8565b600087815260036020818152604080842054815160c081018352875473ffffffffffffffffffffffffffffffffffffffff9081168252600189015481169482019490945260028801546fffffffffffffffffffffffffffffffff80821694830194909452700100000000000000000000000000000000900490921660608301529286015467ffffffffffffffff8082166080840152680100000000000000009091041660a082015293955016918190612410906125e7565b6003860180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790556002860180546fffffffffffffffffffffffffffffffff169055909250905060006124718684613673565b90506fffffffffffffffffffffffffffffffff8111156124bd576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002850180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff831617905560038501805489919060089061252890849068010000000000000000900467ffffffffffffffff1661368b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506125808560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16308685600161270c565b8767ffffffffffffffff16896fffffffffffffffffffffffffffffffff168b7f9e2386766b478abaf84b870cc94441fee88f4a0d3ab18b96e523f193a695f3a18a6040516125d2911515815260200190565b60405180910390a45050505050949350505050565b600080826080015167ffffffffffffffff16421161261d575050604001516fffffffffffffffffffffffffffffffff1690600090565b428360a0015167ffffffffffffffff1611612663578260600151836040015161264691906136ae565b6fffffffffffffffffffffffffffffffff16905060009150915091565b600083608001514261267591906136df565b9050600084608001518560a0015161268d91906136df565b67ffffffffffffffff168267ffffffffffffffff1686604001516126b19190613700565b6126bb9190613738565b90508460600151816126cd91906136ae565b6fffffffffffffffffffffffffffffffff1692508085604001516126f191906136ae565b6fffffffffffffffffffffffffffffffff1693505050915091565b80156127cf576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063f18d03cc90608401600060405180830381600087803b1580156127b257600080fd5b505af11580156127c6573d6000803e3d6000fd5b505050506128a1565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396616906397da6d309060a40160408051808303816000875af115801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e919061378e565b50505b5050505050565b60008115612a30576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063da5139ca90606401602060405180830381865afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e91906137b2565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439669091169063f18d03cc90608401600060405180830381600087803b158015612a1357600080fd5b505af1158015612a27573d6000803e3d6000fd5b50505050612b2e565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439668116906302b9446c90881615612a7d576000612a7f565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612b05573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b2a919061378e565b9150505b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612bb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610b2a565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612cfe57600080fd5b50565b600060208284031215612d1357600080fd5b8135612d1e81612cd0565b9392505050565b60005b83811015612d40578181015183820152602001612d28565b83811115611f5e5750506000910152565b60008151808452612d69816020860160208601612d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d1e6020830184612d51565b803573ffffffffffffffffffffffffffffffffffffffff81168114612dd257600080fd5b919050565b80358015158114612dd257600080fd5b600080600060608486031215612dfc57600080fd5b612e0584612dae565b9250612e1360208501612dd7565b9150612e2160408501612dd7565b90509250925092565b600060208284031215612e3c57600080fd5b5035919050565b60008060408385031215612e5657600080fd5b612e5f83612dae565b946020939093013593505050565b600080600060608486031215612e8257600080fd5b612e8b84612dae565b9250612e9960208501612dae565b9150604084013590509250925092565b60008060408385031215612ebc57600080fd5b82359150612ecc60208401612dae565b90509250929050565b600080600080600060a08688031215612eed57600080fd5b612ef686612dae565b9450612f0460208701612dd7565b9350604086013560ff81168114612f1a57600080fd5b94979396509394606081013594506080013592915050565b60008060008060008060a08789031215612f4b57600080fd5b8635955060208701359450612f6260408801612dae565b9350612f7060608801612dd7565b9250608087013567ffffffffffffffff80821115612f8d57600080fd5b818901915089601f830112612fa157600080fd5b813581811115612fb057600080fd5b8a6020828501011115612fc257600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612feb57600080fd5b82359150612ecc60208401612dd7565b60006020828403121561300d57600080fd5b612d1e82612dae565b6000806040838503121561302957600080fd5b61303283612dae565b9150612ecc60208401612dd7565b6000806020838503121561305357600080fd5b823567ffffffffffffffff8082111561306b57600080fd5b818501915085601f83011261307f57600080fd5b81358181111561308e57600080fd5b8660208260051b85010111156130a357600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613128577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613116858351612d51565b945092850192908501906001016130dc565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156131ab576131ab613135565b604052919050565b600067ffffffffffffffff8211156131cd576131cd613135565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561320f57600080fd5b61321885612dae565b935061322660208601612dae565b925060408501359150606085013567ffffffffffffffff81111561324957600080fd5b8501601f8101871361325a57600080fd5b803561326d613268826131b3565b613164565b81815288602083850101111561328257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b803567ffffffffffffffff81168114612dd257600080fd5b60008060008060008060c087890312156132d557600080fd5b6132de87612dae565b95506132ec60208801612dae565b94506132fa604088016132a4565b9350613308606088016132a4565b92506080870135915061331d60a08801612dd7565b90509295509295509295565b6000806040838503121561333c57600080fd5b61334583612dae565b9150612ecc60208401612dae565b6000806000806080858703121561336957600080fd5b8435935060208501356fffffffffffffffffffffffffffffffff8116811461339057600080fd5b925061339e604086016132a4565b91506133ac60608601612dd7565b905092959194509250565b600181811c908216806133cb57607f821691505b60208210811415613405577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561341d57600080fd5b8151612d1e81612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff80831681851680830382111561348257613482613428565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261353c57600080fd5b83018035915067ffffffffffffffff82111561355757600080fd5b60200191503681900382131561356c57600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561359557600080fd5b815167ffffffffffffffff8111156135ac57600080fd5b8201601f810184136135bd57600080fd5b80516135cb613268826131b3565b8181528560208385010111156135e057600080fd5b612b2e826020830160208601612d25565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561362357613623613428565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136696080830184612d51565b9695505050505050565b6000821982111561368657613686613428565b500190565b600067ffffffffffffffff80831681851680830382111561348257613482613428565b60006fffffffffffffffffffffffffffffffff838116908316818110156136d7576136d7613428565b039392505050565b600067ffffffffffffffff838116908316818110156136d7576136d7613428565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561372f5761372f613428565b02949350505050565b60006fffffffffffffffffffffffffffffffff80841680613782577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600080604083850312156137a157600080fd5b505080516020909101519092909150565b6000602082840312156137c457600080fd5b505191905056fea2646970667358221220ca8a362d21b3de557019306c5454882a264d66a47a3b11ba3dd6ff014ab116bc64736f6c634300080a0033

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

000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _bentoBox (address): 0xF5BCE5077908a1b7370B9ae04AdC565EBd643966
Arg [1] : _wETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.