Contract 0x4ab2fc6e258a0ca7175d05ff10c5cf798a672cae 20

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xb33216437dcca24cbb6b15a592d98f09171f4f185d3c9e6189b9c0d3fc615e86Withdraw From St...481130472023-09-29 6:33:2611 hrs 44 mins ago0x3f3a53de2411cbf55a92665f2adfb33544eab114 IN  SushiSwap: Furo Stream0 MATIC0.00344359457 38.170552567
0x2419d1109240fc272f7bfc3964bc91d347a54fa5703064cdfd8e1fc799ebe734Withdraw From St...480870182023-09-28 14:23:141 day 3 hrs ago0xc6c3ec422945e8f11fde85c7a14554c1cd7e319a IN  SushiSwap: Furo Stream0 MATIC0.008566064754 97.113208185
0x13384e784e791d2cdfede6243d12ea20c42a9db9246238b659d61aed1e7389b5Withdraw From St...480472242023-09-27 13:51:272 days 4 hrs ago0x9f7b6207805c3a3f5080452aa99144eb13d029a9 IN  SushiSwap: Furo Stream0 MATIC0.007196392655 81.585278442
0x3f987e54a908de35aa94f350005c3b4d1615aaf6612058e3c9468e8735968d74Withdraw From St...479670362023-09-25 12:31:004 days 5 hrs ago0x765a9a232a3d9c4fc0721304cc84af560a1781be IN  SushiSwap: Furo Stream0 MATIC0.01021477997
0x74f39e0ceb324898779bda4dbba136db86e54c5cb69af0759e56c78413122173Withdraw From St...478627362023-09-22 20:37:126 days 21 hrs ago0x9f7b6207805c3a3f5080452aa99144eb13d029a9 IN  SushiSwap: Furo Stream0 MATIC0.006998744339 79.344545662
0x97b54bf93474b50a578c3b0ed3491bd6a5074dd862bebe350cd764a422673f40Withdraw From St...478042192023-09-21 9:17:048 days 9 hrs ago0xc6c3ec422945e8f11fde85c7a14554c1cd7e319a IN  SushiSwap: Furo Stream0 MATIC0.00750557191285.090434006
0x5c28686b37a30f45ba817d406f9c97f3a4b280f108035c6ecf24e4ad921ccc2dWithdraw From St...477616492023-09-20 7:31:159 days 10 hrs ago0x73ed557d622f5379efce5058e205275a0e00c663 IN  SushiSwap: Furo Stream0 MATIC0.010590337994 100.577786172
0xf80988dd1a701526385da62bbb1400c9655425f8f094f0715585130add554c89Withdraw From St...477220982023-09-19 7:37:2210 days 10 hrs ago0x765a9a232a3d9c4fc0721304cc84af560a1781be IN  SushiSwap: Furo Stream0 MATIC0.011057235105
0xdc483dd8c4ec731f7ce9bb70347339c12173beed9bd258f670eb3b3671bed6dcWithdraw From St...477180512023-09-19 5:10:3910 days 13 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.007020887429 92.854142594
0x602e00a8b3941cc7e02c82f20463724f09cf0773ec3c4f2a4af39e3279f2743cWithdraw From St...477179832023-09-19 5:08:1310 days 13 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.007218654779 95.469697654
0xb584d7b370cc4a3420f8245a929b39acc4f879599621716b88a9f61e3b48a3f5Withdraw From St...477179382023-09-19 5:06:3910 days 13 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.007906434731 104.565872242
0xba99a518f1d146da8a738f04b84f5bc843f1431f74f6e54f9c81e357e2a2f5b6Withdraw From St...477176942023-09-19 4:57:5910 days 13 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.007633278863 93.842943454
0xbaaccee636a405833ec52e57502613b84fdc8355a9b6d8197194ac96c1550499Withdraw From St...477176802023-09-19 4:57:3110 days 13 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.007848545732 96.489417788
0x93941c442867466c6fcbe8cee37236d3a58a1166eb7a5aa5c61868d17fa8c3e8Withdraw From St...477176622023-09-19 4:56:5110 days 13 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.007955678707 97.806502352
0x880039124bd2fd82159e4d4aa80e76cce85a95d5e17d37de0f4124c30579967aWithdraw From St...477001732023-09-18 18:05:0311 days 12 mins ago0x9f7b6207805c3a3f5080452aa99144eb13d029a9 IN  SushiSwap: Furo Stream0 MATIC0.008815131207 99.936866777
0xecaae499115db5ca28ae7b0af89dd6aa6c9aac288b9e9b56d53455c8180a09a7Withdraw From St...476323902023-09-17 0:56:1612 days 17 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.006369539695 102.450294278
0x01f2f98ef06bd3a7fb7dc84712032f36fee06ea61bbef1f2e174047329dfcb2aWithdraw From St...476323642023-09-17 0:55:0612 days 17 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.006135424642 99.232150646
0xfffa9a53ba97424e2ed46c3c29f38d1b0065921340651df37219d28a70df28c3Withdraw From St...476323452023-09-17 0:54:2612 days 17 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.006234003872 100.826535639
0x55d3784ecc1c30706c888e8250a56001010ad0c18947c98d15cdc15bd5785fb7Withdraw From St...476323362023-09-17 0:54:0812 days 17 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.005043707007 81.575102427
0xac274fac490dfdf391d1318fa35ec6fd3b3328ad40dd7569f150cf62087b03d0Withdraw From St...476323172023-09-17 0:53:2412 days 17 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.006387796045 86.581312125
0x89236ada23bd5277d445379468f1421f1cc658894649c21e9fb39a4522111862Update Stream476310142023-09-17 0:06:2812 days 18 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.006830809085 80.919375526
0x5a8c4f8a616327b1faee6902e36f5426bf9359fed30e4dc031c17eb1821b9038Withdraw From St...476254742023-09-16 20:47:1712 days 21 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.005786301734 93.585562352
0x479f895efc4e2755b6b621eac3c80f86ace6f231c02f6e337f96635958148ee1Withdraw From St...476254582023-09-16 20:46:4312 days 21 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.005951608018 96.259166713
0x8c44579bf09493f1702a46f8e6f3fd10b58a75be16b81f3a710cc86c03ab2439Withdraw From St...476254382023-09-16 20:45:5912 days 21 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.005789788399 93.641954418
0x68f0aa28183997fe92586d45b206c47e91912a054d475d31436c168195e3adf8Withdraw From St...476254292023-09-16 20:45:4112 days 21 hrs ago0xdb306e5c24cd28a02b50c6f893d46a3572835195 IN  SushiSwap: Furo Stream0 MATIC0.005846281418 94.555652179
[ Download CSV Export 
Latest 5 internal transactions
Parent Txn Hash Block From To Value
0xb32314f359533c94725a59392417dde7d4989da8f3e7bd2925e5f797c1e694be300679192022-06-27 18:04:46459 days 12 mins ago SushiSwap: Furo Stream SushiSwap: Bento Box V12 MATIC
0x45095a11295ddce17fd8b0b64f8e93cac0248d8949c3a53050f4f9f574e76a71293963832022-06-10 13:15:39476 days 5 hrs ago SushiSwap: Furo Stream SushiSwap: Bento Box V12 MATIC
0xc1d5dccd106ec2a61bb53efb8aa21a43378e56f1f417e20c32de52b15ee80ad7293663782022-06-09 18:57:23476 days 23 hrs ago SushiSwap: Furo Stream SushiSwap: Bento Box V11 MATIC
0xb2f6cf02561bffd3ce3f03a64741c369d0853305e7d6f785976c8be9becc8b7f293287482022-06-08 20:25:45477 days 21 hrs ago SushiSwap: Furo Stream SushiSwap: Bento Box V10.1 MATIC
0x455f067b76c1acd06bd8ef5ea8fd98ffce857765e98cecfb7991ccaac101817d292973392022-06-08 1:45:21478 days 16 hrs ago SushiSwap: Furo Stream SushiSwap: Bento Box V11 MATIC
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

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


// Use the FuroStreamRouter to create Streams and do not create streams directly.

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"}]

60c06040523480156200001157600080fd5b5060405162003aec38038062003aec833981016040819052620000349162000218565b604080518082018252600b81526a4675726f2053747265616d60a81b60208083019182528351808501909452600a8452694655524f53545245414d60b01b908401528151919291620000899160009162000159565b5080516200009f90600190602084019062000159565b5050600680546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b03808316608081905290821660a0526103e86008556040805163577268d960e11b8152905163aee4d1b29160048082019260009290919082900301818387803b1580156200013857600080fd5b505af11580156200014d573d6000803e3d6000fd5b50505050505062000294565b828054620001679062000257565b90600052602060002090601f0160209004810192826200018b5760008555620001d6565b82601f10620001a657805160ff1916838001178555620001d6565b82800160010185558215620001d6579182015b82811115620001d6578251825591602001919060010190620001b9565b50620001e4929150620001e8565b5090565b5b80821115620001e45760008155600101620001e9565b6001600160a01b03811681146200021557600080fd5b50565b600080604083850312156200022c57600080fd5b82516200023981620001ff565b60208401519092506200024c81620001ff565b809150509250929050565b600181811c908216806200026c57607f821691505b602082108114156200028e57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613801620002eb60003960008181610905015261205d01526000818161059b015281816113dc0152818161276e0152818161283201528181612903015281816129cd0152612a4701526138016000f3fe6080604052600436106101e35760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c39781461088b578063e985e9c5146108b8578063f2428621146108f3578063f8c7e5881461092757600080fd5b8063b3a2b2cf14610818578063b88d4fde14610838578063c14cf8f014610858578063c87b56dd1461086b57600080fd5b806395d89b41116100d157806395d89b41146107ad5780639fd2640e146107c2578063a22cb465146107d8578063ac9650d8146107f857600080fd5b80636b2ace871461058957806370a08231146105bd578063894e9a0d146105f85780638da5cb5b1461078057600080fd5b80632b9134531161017a5780634e71e0c8116101495780634e71e0c81461040857806359f71c1a1461041d5780636352211e1461043d57806364d60d911461048057600080fd5b80632b9134531461036b57806342842e0e1461038b578063489bb0b2146103ab57806348bae94b146103be57600080fd5b8063081812fc116101b6578063081812fc146102b3578063095ea7b3146102f657806323b872dd1461031657806325958d8f1461033657600080fd5b806301ffc9a7146101e857806306fdde031461021d578063078dfbe71461023f57806307d88aad14610261575b600080fd5b3480156101f457600080fd5b50610208610203366004612d01565b61093a565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610a1f565b6040516102149190612d9b565b34801561024b57600080fd5b5061025f61025a366004612de7565b610aad565b005b34801561026d57600080fd5b5060095461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b3480156102bf57600080fd5b5061028e6102ce366004612e2a565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561030257600080fd5b5061025f610311366004612e43565b610c9e565b34801561032257600080fd5b5061025f610331366004612e6d565b610de8565b34801561034257600080fd5b50610356610351366004612e2a565b6110af565b60408051928352602083019190915201610214565b34801561037757600080fd5b5061025f610386366004612ea9565b611169565b34801561039757600080fd5b5061025f6103a6366004612e6d565b61120d565b61025f6103b9366004612ed5565b611372565b3480156103ca57600080fd5b506103de6103d9366004612f32565b61143f565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610214565b34801561041457600080fd5b5061025f6117c8565b34801561042957600080fd5b50610356610438366004612fd8565b6118df565b34801561044957600080fd5b5061028e610458366004612e2a565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561048c57600080fd5b5061052161049b366004612e2a565b600a60205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9283169391909216916fffffffffffffffffffffffffffffffff808316927001000000000000000000000000000000009004169067ffffffffffffffff808216916801000000000000000090041686565b6040805173ffffffffffffffffffffffffffffffffffffffff97881681529690951660208701526fffffffffffffffffffffffffffffffff938416948601949094529116606084015267ffffffffffffffff90811660808401521660a082015260c001610214565b34801561059557600080fd5b5061028e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c957600080fd5b506105ea6105d8366004612ffb565b60026020526000908152604090205481565b604051908152602001610214565b34801561060457600080fd5b506106f2610613366004612e2a565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506000908152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff808216948401949094527001000000000000000000000000000000009004909216606082015260039091015467ffffffffffffffff8082166080840152680100000000000000009091041660a082015290565b6040516102149190600060c08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401525060408301516fffffffffffffffffffffffffffffffff80821660408501528060608601511660608501525050608083015167ffffffffffffffff80821660808501528060a08601511660a0850152505092915050565b34801561078c57600080fd5b5060065461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107b957600080fd5b50610232611b2f565b3480156107ce57600080fd5b506105ea60085481565b3480156107e457600080fd5b5061025f6107f3366004613016565b611b3c565b61080b610806366004613040565b611bd3565b60405161021491906130b5565b34801561082457600080fd5b5061025f610833366004612ffb565b611d45565b34801561084457600080fd5b5061025f6108533660046131f9565b611e0d565b6103566108663660046132bc565b611f64565b34801561087757600080fd5b50610232610886366004612e2a565b612205565b34801561089757600080fd5b5060075461028e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108c457600080fd5b506102086108d3366004613329565b600560209081526000928352604080842090915290825290205460ff1681565b3480156108ff57600080fd5b5061028e7f000000000000000000000000000000000000000000000000000000000000000081565b6105ea610935366004613353565b6122bb565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109cd57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a1957507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60008054610a2c906133b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a58906133b7565b8015610aa55780601f10610a7a57610100808354040283529160200191610aa5565b820191906000526020600020905b815481529060010190602001808311610a8857829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610b33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610c585773ffffffffffffffffffffffffffffffffffffffff8316151580610b5a5750805b610bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610b2a565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610d01575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610b2a565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610b2a565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f3c575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f77575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600a60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169381019390935260028101546fffffffffffffffffffffffffffffffff80821693850193909352700100000000000000000000000000000000900490911660608301526003015467ffffffffffffffff8082166080840152680100000000000000009091041660a08201528190611160906125e7565b91509150915091565b6000828152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff1633146111c7576040517fb2c3aa6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611218838383610de8565b73ffffffffffffffffffffffffffffffffffffffff82163b158061130c57506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156112c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e8919061340b565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610b2a565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b505050505050505050565b600086815260036020908152604080832054600a909252822054829173ffffffffffffffffffffffffffffffffffffffff9081169116331480159061149a57503373ffffffffffffffffffffffffffffffffffffffff821614155b156114d1576040517fc821e7f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000898152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092166060820152600382015467ffffffffffffffff8082166080840152680100000000000000009091041660a0820152611582906125e7565b945050888410156115bf576040517f6a1f509a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888160020160108282829054906101000a90046fffffffffffffffffffffffffffffffff166115ee9190613457565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015611674575073ffffffffffffffffffffffffffffffffffffffff881615155b1561168157879250611685565b8192505b60018101546116ad9073ffffffffffffffffffffffffffffffffffffffff1630858c8b61270c565b84158015906116d157503373ffffffffffffffffffffffffffffffffffffffff8316145b1561175d576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063330df2829061172a908990899060040161348b565b600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b505050505b60018101546040805173ffffffffffffffffffffffffffffffffffffffff92831681528915156020820152918a16918b918d917f8deda66e5f5ef6c43f45734b544b27efe7fe2cd80a4b7fbf5c789aa69c024818910160405180910390a45050965096945050505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633811461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610b2a565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b600082815260036020908152604080832054600a909252822054829173ffffffffffffffffffffffffffffffffffffffff9081169116331480159061193a57503373ffffffffffffffffffffffffffffffffffffffff821614155b15611971576040517fc821e7f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600a6020908152604091829020825160c081018452815473ffffffffffffffffffffffffffffffffffffffff90811682526001830154169281019290925260028101546fffffffffffffffffffffffffffffffff808216948401949094527001000000000000000000000000000000009004909216606082015260039091015467ffffffffffffffff8082166080840152680100000000000000009091041660a0820152611a23816125e7565b6000888152600a60209081526040822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116825560018201805490911690556002810192909255600390910180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690558301519195509350611aae903084868961270c565b611ac38160200151308360000151878961270c565b8284877fb76e70514ce71ea8144278de4cb58afc6c323447436371f6fe49e145ffdc540b846020015189604051611b1e92919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a450509250929050565b60018054610a2c906133b7565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611bee57611bee613135565b604051908082528060200260200182016040528015611c2157816020015b6060815260200190600190039081611c0c5790505b50905060005b82811015611d3e5760008030868685818110611c4557611c456134d8565b9050602002810190611c579190613507565b604051611c65929190613573565b600060405180830381855af49150503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b509150915081611d0b57604481511015611cbe57600080fd5b60048101905080806020019051810190611cd89190613583565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a9190612d9b565b80848481518110611d1e57611d1e6134d8565b602002602001018190525050508080611d36906135f1565b915050611c27565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611dc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b2a565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611e18848484610de8565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611ef857506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611e9190339089908890889060040161362a565b6020604051808303816000875af1158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed4919061340b565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610b2a565b50505050565b600080428667ffffffffffffffff161015611fab576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8567ffffffffffffffff168567ffffffffffffffff1611611ff8576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61200587333087876128a8565b600880549192506000612017836135f1565b9190505591506120278883612b37565b6040805160c081019091523381526020810173ffffffffffffffffffffffffffffffffffffffff89161561205b578861207d565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff90811682526fffffffffffffffffffffffffffffffff8481166020808501919091526000604080860182905267ffffffffffffffff8d811660608089018290528e83166080998a018190528c8652600a8752948490208a518154908a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161782558b880151600183018054918c16919092161790558a8501518b8301518916700100000000000000000000000000000000029816979097176002880155898901516003909701805460a09b8c0151851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911698909416979097179290921790955581518f871681529384018990529083019390935291810191909152861515928101929092528a1691339185917f1a2d760a604c03eaa74e64c0e42f0e4f41824be534853f4c2f3ed42d36fed25c910160405180910390a4965096945050505050565b6009546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015612275573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a199190810190613583565b6000848152600a60205260408120805473ffffffffffffffffffffffffffffffffffffffff163314612319576040517fb2c3aa6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015481546123589173ffffffffffffffffffffffffffffffffffffffff9081169116306fffffffffffffffffffffffffffffffff8916876128a8565b600087815260036020818152604080842054815160c081018352875473ffffffffffffffffffffffffffffffffffffffff9081168252600189015481169482019490945260028801546fffffffffffffffffffffffffffffffff80821694830194909452700100000000000000000000000000000000900490921660608301529286015467ffffffffffffffff8082166080840152680100000000000000009091041660a082015293955016918190612410906125e7565b6003860180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790556002860180546fffffffffffffffffffffffffffffffff169055909250905060006124718684613673565b90506fffffffffffffffffffffffffffffffff8111156124bd576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002850180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff831617905560038501805489919060089061252890849068010000000000000000900467ffffffffffffffff1661368b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506125808560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16308685600161270c565b8767ffffffffffffffff16896fffffffffffffffffffffffffffffffff168b7f9e2386766b478abaf84b870cc94441fee88f4a0d3ab18b96e523f193a695f3a18a6040516125d2911515815260200190565b60405180910390a45050505050949350505050565b600080826080015167ffffffffffffffff16421161261d575050604001516fffffffffffffffffffffffffffffffff1690600090565b428360a0015167ffffffffffffffff1611612663578260600151836040015161264691906136ae565b6fffffffffffffffffffffffffffffffff16905060009150915091565b600083608001514261267591906136df565b9050600084608001518560a0015161268d91906136df565b67ffffffffffffffff168267ffffffffffffffff1686604001516126b19190613700565b6126bb9190613738565b90508460600151816126cd91906136ae565b6fffffffffffffffffffffffffffffffff1692508085604001516126f191906136ae565b6fffffffffffffffffffffffffffffffff1693505050915091565b80156127cf576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156127b257600080fd5b505af11580156127c6573d6000803e3d6000fd5b505050506128a1565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af115801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e919061378e565b50505b5050505050565b60008115612a30576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e91906137b2565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b158015612a1357600080fd5b505af1158015612a27573d6000803e3d6000fd5b50505050612b2e565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615612a7d576000612a7f565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612b05573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b2a919061378e565b9150505b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612bb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610b2a565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610b2a565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612cfe57600080fd5b50565b600060208284031215612d1357600080fd5b8135612d1e81612cd0565b9392505050565b60005b83811015612d40578181015183820152602001612d28565b83811115611f5e5750506000910152565b60008151808452612d69816020860160208601612d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d1e6020830184612d51565b803573ffffffffffffffffffffffffffffffffffffffff81168114612dd257600080fd5b919050565b80358015158114612dd257600080fd5b600080600060608486031215612dfc57600080fd5b612e0584612dae565b9250612e1360208501612dd7565b9150612e2160408501612dd7565b90509250925092565b600060208284031215612e3c57600080fd5b5035919050565b60008060408385031215612e5657600080fd5b612e5f83612dae565b946020939093013593505050565b600080600060608486031215612e8257600080fd5b612e8b84612dae565b9250612e9960208501612dae565b9150604084013590509250925092565b60008060408385031215612ebc57600080fd5b82359150612ecc60208401612dae565b90509250929050565b600080600080600060a08688031215612eed57600080fd5b612ef686612dae565b9450612f0460208701612dd7565b9350604086013560ff81168114612f1a57600080fd5b94979396509394606081013594506080013592915050565b60008060008060008060a08789031215612f4b57600080fd5b8635955060208701359450612f6260408801612dae565b9350612f7060608801612dd7565b9250608087013567ffffffffffffffff80821115612f8d57600080fd5b818901915089601f830112612fa157600080fd5b813581811115612fb057600080fd5b8a6020828501011115612fc257600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612feb57600080fd5b82359150612ecc60208401612dd7565b60006020828403121561300d57600080fd5b612d1e82612dae565b6000806040838503121561302957600080fd5b61303283612dae565b9150612ecc60208401612dd7565b6000806020838503121561305357600080fd5b823567ffffffffffffffff8082111561306b57600080fd5b818501915085601f83011261307f57600080fd5b81358181111561308e57600080fd5b8660208260051b85010111156130a357600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613128577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613116858351612d51565b945092850192908501906001016130dc565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156131ab576131ab613135565b604052919050565b600067ffffffffffffffff8211156131cd576131cd613135565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561320f57600080fd5b61321885612dae565b935061322660208601612dae565b925060408501359150606085013567ffffffffffffffff81111561324957600080fd5b8501601f8101871361325a57600080fd5b803561326d613268826131b3565b613164565b81815288602083850101111561328257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b803567ffffffffffffffff81168114612dd257600080fd5b60008060008060008060c087890312156132d557600080fd5b6132de87612dae565b95506132ec60208801612dae565b94506132fa604088016132a4565b9350613308606088016132a4565b92506080870135915061331d60a08801612dd7565b90509295509295509295565b6000806040838503121561333c57600080fd5b61334583612dae565b9150612ecc60208401612dae565b6000806000806080858703121561336957600080fd5b8435935060208501356fffffffffffffffffffffffffffffffff8116811461339057600080fd5b925061339e604086016132a4565b91506133ac60608601612dd7565b905092959194509250565b600181811c908216806133cb57607f821691505b60208210811415613405577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561341d57600080fd5b8151612d1e81612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff80831681851680830382111561348257613482613428565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261353c57600080fd5b83018035915067ffffffffffffffff82111561355757600080fd5b60200191503681900382131561356c57600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561359557600080fd5b815167ffffffffffffffff8111156135ac57600080fd5b8201601f810184136135bd57600080fd5b80516135cb613268826131b3565b8181528560208385010111156135e057600080fd5b612b2e826020830160208601612d25565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561362357613623613428565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136696080830184612d51565b9695505050505050565b6000821982111561368657613686613428565b500190565b600067ffffffffffffffff80831681851680830382111561348257613482613428565b60006fffffffffffffffffffffffffffffffff838116908316818110156136d7576136d7613428565b039392505050565b600067ffffffffffffffff838116908316818110156136d7576136d7613428565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561372f5761372f613428565b02949350505050565b60006fffffffffffffffffffffffffffffffff80841680613782577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600080604083850312156137a157600080fd5b505080516020909101519092909150565b6000602082840312156137c457600080fd5b505191905056fea2646970667358221220ca8a362d21b3de557019306c5454882a264d66a47a3b11ba3dd6ff014ab116bc64736f6c634300080a00330000000000000000000000000319000133d3ada02600f0875d2cf03d442c33670000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

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

0000000000000000000000000319000133d3ada02600f0875d2cf03d442c33670000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _bentoBox (address): 0x0319000133d3ada02600f0875d2cf03d442c3367
Arg [1] : _wETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000319000133d3ada02600f0875d2cf03d442c3367
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.