ETH Price: $2,674.21 (+1.40%)
Gas: 0.83 Gwei

Contract

0x0689640d190b10765f09310fCfE9C670eDe4E25B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw205900602024-08-23 8:18:2325 mins ago1724401103IN
SushiSwap: FUROVEST Token
0 ETH0.000097631.08280551
Withdraw205760442024-08-21 9:16:5947 hrs ago1724231819IN
SushiSwap: FUROVEST Token
0 ETH0.000104031.13997174
Withdraw205418352024-08-16 14:37:236 days ago1723819043IN
SushiSwap: FUROVEST Token
0 ETH0.000259083.45333513
Withdraw205359202024-08-15 18:49:117 days ago1723747751IN
SushiSwap: FUROVEST Token
0 ETH0.000393665.30812189
Transfer From205068382024-08-11 17:23:5911 days ago1723397039IN
SushiSwap: FUROVEST Token
0 ETH0.000106921.96432706
Withdraw204996482024-08-10 17:16:5912 days ago1723310219IN
SushiSwap: FUROVEST Token
0 ETH0.000139621.87411424
Withdraw204990702024-08-10 15:21:1112 days ago1723303271IN
SushiSwap: FUROVEST Token
0 ETH0.00018322
Withdraw204939612024-08-09 22:14:2313 days ago1723241663IN
SushiSwap: FUROVEST Token
0 ETH0.000272532.97513948
Withdraw204924972024-08-09 17:20:4713 days ago1723224047IN
SushiSwap: FUROVEST Token
0 ETH0.000379294.1406555
Withdraw204902652024-08-09 9:51:5913 days ago1723197119IN
SushiSwap: FUROVEST Token
0 ETH0.000308673.38228881
Withdraw204328952024-08-01 9:46:4721 days ago1722505607IN
SushiSwap: FUROVEST Token
0 ETH0.000460775.03010964
Withdraw204291362024-07-31 21:12:1122 days ago1722460331IN
SushiSwap: FUROVEST Token
0 ETH0.000693439.35018084
Withdraw204270572024-07-31 14:13:2322 days ago1722435203IN
SushiSwap: FUROVEST Token
0 ETH0.0023093630.77679927
Withdraw204181312024-07-30 8:17:1124 days ago1722327431IN
SushiSwap: FUROVEST Token
0 ETH0.000322943.52860722
Withdraw203933852024-07-26 21:23:3527 days ago1722029015IN
SushiSwap: FUROVEST Token
0 ETH0.000127291.39476419
Withdraw203857652024-07-25 19:51:1128 days ago1721937071IN
SushiSwap: FUROVEST Token
0 ETH0.000409044.4654134
Withdraw203553092024-07-21 13:47:4732 days ago1721569667IN
SushiSwap: FUROVEST Token
0 ETH0.000192892.60090992
Withdraw203298122024-07-18 0:24:4736 days ago1721262287IN
SushiSwap: FUROVEST Token
0 ETH0.000439765.92971817
Withdraw203215892024-07-16 20:53:4737 days ago1721163227IN
SushiSwap: FUROVEST Token
0 ETH0.000636118.53964642
Withdraw203197172024-07-16 14:38:1137 days ago1721140691IN
SushiSwap: FUROVEST Token
0 ETH0.00070639.41440483
Withdraw202945982024-07-13 2:27:1141 days ago1720837631IN
SushiSwap: FUROVEST Token
0 ETH0.000115741.56063781
Withdraw202925822024-07-12 19:41:3541 days ago1720813295IN
SushiSwap: FUROVEST Token
0 ETH0.000268883.62554407
Withdraw202913252024-07-12 15:29:3541 days ago1720798175IN
SushiSwap: FUROVEST Token
0 ETH0.000602488.03061716
Withdraw202734152024-07-10 3:29:3544 days ago1720582175IN
SushiSwap: FUROVEST Token
0 ETH0.000318863.48099757
Withdraw202658222024-07-09 2:01:3545 days ago1720490495IN
SushiSwap: FUROVEST Token
0 ETH0.000197332.15427053
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
150554042022-07-01 7:55:45784 days ago1656662145
SushiSwap: FUROVEST Token
0.006 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FuroVesting

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 999999 runs

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

pragma solidity 0.8.10;

import "../interfaces/IFuroVesting.sol";

contract FuroVesting is
    IFuroVesting,
    ERC721("Furo Vesting", "FUROVEST"),
    Multicall,
    BoringOwnable
{
    IBentoBoxMinimal public immutable bentoBox;
    address public immutable wETH;

    address public tokenURIFetcher;

    mapping(uint256 => Vest) public vests;

    uint256 public vestIds;

    uint256 public constant PERCENTAGE_PRECISION = 1e18;

    // custom errors
    error InvalidStart();
    error NotOwner();
    error NotVestReceiver();
    error InvalidStepSetting();

    constructor(IBentoBoxMinimal _bentoBox, address _wETH) {
        bentoBox = _bentoBox;
        wETH = _wETH;
        vestIds = 1;
        _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 createVesting(VestParams calldata vestParams)
        external
        payable
        override
        returns (
            uint256 depositedShares,
            uint256 vestId,
            uint128 stepShares,
            uint128 cliffShares
        )
    {
        if (vestParams.start < block.timestamp) revert InvalidStart();
        if (vestParams.stepPercentage > PERCENTAGE_PRECISION)
            revert InvalidStepSetting();
        if (vestParams.stepDuration == 0 || vestParams.steps == 0)
            revert InvalidStepSetting();

        depositedShares = _depositToken(
            address(vestParams.token),
            msg.sender,
            address(this),
            vestParams.amount,
            vestParams.fromBentoBox
        );
        stepShares = uint128(
            (vestParams.stepPercentage * depositedShares) / PERCENTAGE_PRECISION
        );
        cliffShares = uint128(
            depositedShares - (stepShares * vestParams.steps)
        );

        vestId = vestIds++;
        _mint(vestParams.recipient, vestId);

        vests[vestId] = Vest({
            owner: msg.sender,
            token: address(vestParams.token) == address(0)
                ? IERC20(wETH)
                : vestParams.token,
            start: vestParams.start,
            cliffDuration: vestParams.cliffDuration,
            stepDuration: vestParams.stepDuration,
            steps: vestParams.steps,
            cliffShares: cliffShares,
            stepShares: stepShares,
            claimed: 0
        });

        emit CreateVesting(
            vestId,
            vestParams.token,
            msg.sender,
            vestParams.recipient,
            vestParams.start,
            vestParams.cliffDuration,
            vestParams.stepDuration,
            vestParams.steps,
            cliffShares,
            stepShares,
            vestParams.fromBentoBox
        );
    }

    function withdraw(
        uint256 vestId,
        bytes calldata taskData,
        bool toBentoBox
    ) external override {
        Vest storage vest = vests[vestId];
        address recipient = ownerOf[vestId];
        if (recipient != msg.sender) revert NotVestReceiver();
        uint256 canClaim = _balanceOf(vest) - vest.claimed;

        if (canClaim == 0) return;

        vest.claimed += uint128(canClaim);

        _transferToken(
            address(vest.token),
            address(this),
            recipient,
            canClaim,
            toBentoBox
        );

        if (taskData.length != 0) ITasker(recipient).onTaskReceived(taskData);

        emit Withdraw(vestId, vest.token, canClaim, toBentoBox);
    }

    function stopVesting(uint256 vestId, bool toBentoBox) external override {
        Vest memory vest = vests[vestId];

        if (vest.owner != msg.sender) revert NotOwner();

        uint256 amountVested = _balanceOf(vest);
        uint256 canClaim = amountVested - vest.claimed;
        uint256 returnShares = (vest.cliffShares +
            (vest.steps * vest.stepShares)) - amountVested;

        delete vests[vestId];

        _transferToken(
            address(vest.token),
            address(this),
            ownerOf[vestId],
            canClaim,
            toBentoBox
        );

        _transferToken(
            address(vest.token),
            address(this),
            msg.sender,
            returnShares,
            toBentoBox
        );
        emit CancelVesting(
            vestId,
            returnShares,
            canClaim,
            vest.token,
            toBentoBox
        );
    }

    function vestBalance(uint256 vestId)
        external
        view
        override
        returns (uint256)
    {
        Vest memory vest = vests[vestId];
        return _balanceOf(vest) - vest.claimed;
    }

    function _balanceOf(Vest memory vest)
        internal
        view
        returns (uint256 claimable)
    {
        uint256 timeAfterCliff = vest.start + vest.cliffDuration;

        if (block.timestamp < timeAfterCliff) {
            return claimable;
        }

        uint256 passedSinceCliff = block.timestamp - timeAfterCliff;

        uint256 stepPassed = Math.min(
            vest.steps,
            passedSinceCliff / vest.stepDuration
        );

        claimable = vest.cliffShares + (vest.stepShares * stepPassed);
    }

    function updateOwner(uint256 vestId, address newOwner) external override {
        Vest storage vest = vests[vestId];
        if (vest.owner != msg.sender) revert NotOwner();
        vest.owner = newOwner;
        emit LogUpdateOwner(vestId, newOwner);
    }

    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 shares,
        bool toBentoBox
    ) internal {
        if (toBentoBox) {
            bentoBox.transfer(token, from, to, shares);
        } else {
            bentoBox.withdraw(token, from, to, 0, shares);
        }
    }
}

File 2 of 10 : IFuroVesting.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.10;

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

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

    function createVesting(VestParams calldata vestParams)
        external
        payable
        returns (
            uint256 depositedShares,
            uint256 vestId,
            uint128 stepShares,
            uint128 cliffShares
        );

    function withdraw(
        uint256 vestId,
        bytes memory taskData,
        bool toBentoBox
    ) external;

    function stopVesting(uint256 vestId, bool toBentoBox) external;

    function vestBalance(uint256 vestId) external view returns (uint256);

    function updateOwner(uint256 vestId, address newOwner) external;

    struct VestParams {
        IERC20 token;
        address recipient;
        uint32 start;
        uint32 cliffDuration;
        uint32 stepDuration;
        uint32 steps;
        uint128 stepPercentage;
        uint128 amount;
        bool fromBentoBox;
    }

    struct Vest {
        address owner;
        IERC20 token;
        uint32 start;
        uint32 cliffDuration;
        uint32 stepDuration;
        uint32 steps;
        uint128 cliffShares;
        uint128 stepShares;
        uint128 claimed;
    }

    event CreateVesting(
        uint256 indexed vestId,
        IERC20 token,
        address indexed owner,
        address indexed recipient,
        uint32 start,
        uint32 cliffDuration,
        uint32 stepDuration,
        uint32 steps,
        uint128 cliffShares,
        uint128 stepShares,
        bool fromBentoBox
    );

    event Withdraw(
        uint256 indexed vestId,
        IERC20 indexed token,
        uint256 indexed amount,
        bool toBentoBox
    );

    event CancelVesting(
        uint256 indexed vestId,
        uint256 indexed ownerAmount,
        uint256 indexed recipientAmount,
        IERC20 token,
        bool toBentoBox
    );

    event LogUpdateOwner(uint256 indexed vestId, address indexed newOwner);
}

File 3 of 10 : 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 10 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    /// @notice EIP 2612
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 5 of 10 : 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 6 of 10 : 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 7 of 10 : 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 8 of 10 : 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 9 of 10 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

File 10 of 10 : 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":"InvalidStart","type":"error"},{"inputs":[],"name":"InvalidStepSetting","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotVestReceiver","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":"vestId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"ownerAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"recipientAmount","type":"uint256"},{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"CancelVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vestId","type":"uint256"},{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint32","name":"start","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"stepDuration","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"steps","type":"uint32"},{"indexed":false,"internalType":"uint128","name":"cliffShares","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"stepShares","type":"uint128"},{"indexed":false,"internalType":"bool","name":"fromBentoBox","type":"bool"}],"name":"CreateVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vestId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogUpdateOwner","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":"vestId","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PERCENTAGE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint32","name":"start","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"stepDuration","type":"uint32"},{"internalType":"uint32","name":"steps","type":"uint32"},{"internalType":"uint128","name":"stepPercentage","type":"uint128"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bool","name":"fromBentoBox","type":"bool"}],"internalType":"struct IFuroVesting.VestParams","name":"vestParams","type":"tuple"}],"name":"createVesting","outputs":[{"internalType":"uint256","name":"depositedShares","type":"uint256"},{"internalType":"uint256","name":"vestId","type":"uint256"},{"internalType":"uint128","name":"stepShares","type":"uint128"},{"internalType":"uint128","name":"cliffShares","type":"uint128"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"vestId","type":"uint256"},{"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"stopVesting","outputs":[],"stateMutability":"nonpayable","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":"vestId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestId","type":"uint256"}],"name":"vestBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vests","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint32","name":"start","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"stepDuration","type":"uint32"},{"internalType":"uint32","name":"steps","type":"uint32"},{"internalType":"uint128","name":"cliffShares","type":"uint128"},{"internalType":"uint128","name":"stepShares","type":"uint128"},{"internalType":"uint128","name":"claimed","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestId","type":"uint256"},{"internalType":"bytes","name":"taskData","type":"bytes"},{"internalType":"bool","name":"toBentoBox","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b50604051620039ac380380620039ac833981016040819052620000349162000216565b604080518082018252600c81526b4675726f2056657374696e6760a01b60208083019182528351808501909452600884526711955493d59154d560c21b908401528151919291620000889160009162000157565b5080516200009e90600190602084019062000157565b5050600680546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b03808316608081905290821660a0526001600a556040805163577268d960e11b8152905163aee4d1b29160048082019260009290919082900301818387803b1580156200013657600080fd5b505af11580156200014b573d6000803e3d6000fd5b50505050505062000292565b828054620001659062000255565b90600052602060002090601f016020900481019282620001895760008555620001d4565b82601f10620001a457805160ff1916838001178555620001d4565b82800160010185558215620001d4579182015b82811115620001d4578251825591602001919060010190620001b7565b50620001e2929150620001e6565b5090565b5b80821115620001e25760008155600101620001e7565b6001600160a01b03811681146200021357600080fd5b50565b600080604083850312156200022a57600080fd5b82516200023781620001fd565b60208401519092506200024a81620001fd565b809150509250929050565b600181811c908216806200026a57607f821691505b602082108114156200028c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516136c3620002e9600039600081816107f601526121f40152600081816105a4015281816115910152818161269a0152818161275e0152818161282f015281816128f9015261297301526136c36000f3fe6080604052600436106101d85760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c397814610731578063e985e9c51461075e578063e9d163c914610799578063f2428621146107e457600080fd5b8063b3a2b2cf146106b5578063b88d4fde146106d5578063c87b56dd146106f5578063e256888f1461071557600080fd5b806395d89b41116100d157806395d89b4114610640578063a203db8e14610655578063a22cb46514610675578063ac9650d81461069557600080fd5b80636b2ace871461059257806370a08231146105c65780637192711f146105f35780638da5cb5b1461061357600080fd5b806323b872dd1161017a578063489bb0b211610149578063489bb0b2146103af5780634e71e0c8146103c257806351def556146103d75780636352211e1461054f57600080fd5b806323b872dd146103395780632bcea7361461035957806340e76eff1461036f57806342842e0e1461038f57600080fd5b806307d88aad116101b657806307d88aad14610256578063081812fc146102a8578063095ea7b3146102eb57806319f771711461030b57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063078dfbe714610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612c41565b610818565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102276108fd565b6040516102099190612cd4565b34801561024057600080fd5b5061025461024f366004612d1e565b61098b565b005b34801561026257600080fd5b506008546102839073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b3480156102b457600080fd5b506102836102c3366004612d63565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f757600080fd5b50610254610306366004612d7c565b610b7c565b34801561031757600080fd5b5061032b610326366004612d63565b610cc6565b604051908152602001610209565b34801561034557600080fd5b50610254610354366004612da8565b610ded565b34801561036557600080fd5b5061032b600a5481565b34801561037b57600080fd5b5061025461038a366004612de9565b6110b4565b34801561039b57600080fd5b506102546103aa366004612da8565b6113c2565b6102546103bd366004612e76565b611527565b3480156103ce57600080fd5b506102546115f4565b3480156103e357600080fd5b506104d06103f2366004612d63565b600960205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff928316939282169263ffffffff740100000000000000000000000000000000000000008404811693780100000000000000000000000000000000000000000000000081048216937c0100000000000000000000000000000000000000000000000000000000909104821692918216916fffffffffffffffffffffffffffffffff640100000000909104811691808216917001000000000000000000000000000000009091041689565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b1681529990981660208a015263ffffffff96871697890197909752938516606088015291841660808701529290921660a08501526fffffffffffffffffffffffffffffffff91821660c0850152811660e08401521661010082015261012001610209565b34801561055b57600080fd5b5061028361056a366004612d63565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561059e57600080fd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d257600080fd5b5061032b6105e1366004612ed5565b60026020526000908152604090205481565b3480156105ff57600080fd5b5061025461060e366004612ef2565b61170b565b34801561061f57600080fd5b506006546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561064c57600080fd5b506102276117d9565b34801561066157600080fd5b50610254610670366004612f22565b6117e6565b34801561068157600080fd5b50610254610690366004612f4e565b611aa9565b6106a86106a3366004612f7a565b611b40565b6040516102099190612fef565b3480156106c157600080fd5b506102546106d0366004612ed5565b611cb2565b3480156106e157600080fd5b506102546106f0366004613133565b611d7a565b34801561070157600080fd5b50610227610710366004612d63565b611ecb565b34801561072157600080fd5b5061032b670de0b6b3a764000081565b34801561073d57600080fd5b506007546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561076a57600080fd5b506101fd6107793660046131e2565b600560209081526000928352604080842090915290825290205460ff1681565b6107ac6107a7366004613210565b611f81565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff91821692840192909252166060820152608001610209565b3480156107f057600080fd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806108ab57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806108f757507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805461090a90613229565b80601f016020809104026020016040519081016040528092919081815260200182805461093690613229565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610b365773ffffffffffffffffffffffffffffffffffffffff8316151580610a385750805b610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610bdf575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600960209081526040808320815161012081018352815473ffffffffffffffffffffffffffffffffffffffff908116825260018301549081169482019490945263ffffffff74010000000000000000000000000000000000000000850481169382019390935278010000000000000000000000000000000000000000000000008404831660608201527c010000000000000000000000000000000000000000000000000000000090930482166080840152600281015491821660a08401526fffffffffffffffffffffffffffffffff640100000000909204821660c08401526003015480821660e08401527001000000000000000000000000000000009004166101008201819052610ddc82612584565b610de691906132a6565b9392505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216610efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f41575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f7c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600084815260096020908152604080832060039092529091205473ffffffffffffffffffffffffffffffffffffffff1633811461111d576040517fe1c6117100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546040805161012081018252845473ffffffffffffffffffffffffffffffffffffffff90811682526001860154908116602083015274010000000000000000000000000000000000000000810463ffffffff9081169383019390935278010000000000000000000000000000000000000000000000008104831660608301527c0100000000000000000000000000000000000000000000000000000000900482166080820152600285015491821660a08201526fffffffffffffffffffffffffffffffff640100000000909204821660c082015281831660e082015270010000000000000000000000000000000090920416610100820181905260009161122790612584565b61123191906132a6565b905080611240575050506113bc565b808360030160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661126f91906132bd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506112d68360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630848488612638565b8415611363576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063330df2829061133090899089906004016132f1565b600060405180830381600087803b15801561134a57600080fd5b505af115801561135e573d6000803e3d6000fd5b505050505b60018301546040518515158152829173ffffffffffffffffffffffffffffffffffffffff169089907fff942d249898505febb2a9a00118e27567c084b9497d0aa3ba5e332c235b4f389060200160405180910390a45050505b50505050565b6113cd838383610ded565b73ffffffffffffffffffffffffffffffffffffffff82163b15806114c157506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff16338114611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b6000828152600960205260409020805473ffffffffffffffffffffffffffffffffffffffff163314611769576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184907fca0251ba80971adc7e92434b097ca40450b2a317013c51c5c5cb6ae74500bb0090600090a3505050565b6001805461090a90613229565b600082815260096020908152604091829020825161012081018452815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401549182169483019490945263ffffffff74010000000000000000000000000000000000000000820481169583019590955278010000000000000000000000000000000000000000000000008104851660608301527c0100000000000000000000000000000000000000000000000000000000900484166080820152600282015493841660a08201526fffffffffffffffffffffffffffffffff640100000000909404841660c082015260039091015480841660e08301527001000000000000000000000000000000009004909216610100830152331461192e576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061193982612584565b905060008261010001516fffffffffffffffffffffffffffffffff168261196091906132a6565b90506000828460e001518560a0015163ffffffff1661197f919061335b565b8560c0015161198e91906132bd565b6fffffffffffffffffffffffffffffffff166119aa91906132a6565b600087815260096020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168255600182018590556002820180549091169055600390810184905588830151925290912054919250611a2d91309073ffffffffffffffffffffffffffffffffffffffff168589612638565b611a3e846020015130338489612638565b8181877f061c75052be1ee7232bc654d7f489af163c983bb99c5affe5e8fc2e5225cb577876020015189604051611a9992919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a4505050505050565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611b5b57611b5b61306f565b604051908082528060200260200182016040528015611b8e57816020015b6060815260200190600190039081611b795790505b50905060005b82811015611cab5760008030868685818110611bb257611bb2613393565b9050602002810190611bc491906133c2565b604051611bd292919061342e565b600060405180830381855af49150503d8060008114611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b509150915081611c7857604481511015611c2b57600080fd5b60048101905080806020019051810190611c45919061343e565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a089190612cd4565b80848481518110611c8b57611c8b613393565b602002602001018190525050508080611ca3906134ac565b915050611b94565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a08565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611d85848484610ded565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611e6557506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611dfe9033908990889088906004016134e5565b6020604051808303816000875af1158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e41919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6113bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6008546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015611f3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108f7919081019061343e565b600080808042611f97606087016040880161352e565b63ffffffff161015611fd5576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a7640000611fee60e0870160c08801613554565b6fffffffffffffffffffffffffffffffff161115612038576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61204860a086016080870161352e565b63ffffffff16158061206d575061206560c0860160a0870161352e565b63ffffffff16155b156120a4576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120f06120b46020870187612ed5565b33306120c76101008a0160e08b01613554565b6fffffffffffffffffffffffffffffffff166120eb6101208b016101008c01613586565b6127d4565b9350670de0b6b3a76400008461210c60e0880160c08901613554565b6fffffffffffffffffffffffffffffffff1661212891906135a1565b61213291906135de565b915061214460c0860160a0870161352e565b6121549063ffffffff168361335b565b612170906fffffffffffffffffffffffffffffffff16856132a6565b600a80549192506000612182836134ac565b9091555092506121a161219b6040870160208801612ed5565b84612a61565b6040805161012081019091523381526020808201906000906121c590890189612ed5565b73ffffffffffffffffffffffffffffffffffffffff16146121f2576121ed6020880188612ed5565b612214565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff16815260200161223f606088016040890161352e565b63ffffffff16815260200161225a608088016060890161352e565b63ffffffff16815260200161227560a088016080890161352e565b63ffffffff16815260200161229060c0880160a0890161352e565b63ffffffff90811682526fffffffffffffffffffffffffffffffff80851660208085019190915286821660408086019190915260006060958601819052898152600983528190208651815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178355888501516001840180548b8701519a8c015160808d01518b167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff918c167801000000000000000000000000000000000000000000000000029190911677ffffffffffffffffffffffffffffffffffffffffffffffff9c8c1674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931694909616939093171799909916929092179190911790965560a087015160028201805460c08a0151871664010000000002981691909616179590951790935560e085015161010090950151821670010000000000000000000000000000000002949091169390931760039092019190915561246891908701908701612ed5565b73ffffffffffffffffffffffffffffffffffffffff1633847f603bb53f65550199ed7346ba18d49bcb7ec77162b3167b272f8cd19b20d9510b6124ae60208a018a612ed5565b6124be60608b0160408c0161352e565b6124ce60808c0160608d0161352e565b6124de60a08d0160808e0161352e565b6124ee60c08e0160a08f0161352e565b898b8f6101000160208101906125049190613586565b6040805173ffffffffffffffffffffffffffffffffffffffff909916895263ffffffff97881660208a0152958716958801959095529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a08501529190911660c0830152151560e08201526101000160405180910390a49193509193565b6000808260600151836040015161259b9190613619565b63ffffffff169050804210156125b15750919050565b60006125bd82426132a6565b905060006125ea8560a0015163ffffffff16866080015163ffffffff16846125e591906135de565b612bfa565b9050808560e001516fffffffffffffffffffffffffffffffff1661260e91906135a1565b8560c001516fffffffffffffffffffffffffffffffff1661262f9190613638565b95945050505050565b80156126fb576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050506127cd565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af11580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190613650565b50505b5050505050565b6000811561295c576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa158015612876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289a9190613674565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050505061262f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c908816156129a95760006129ab565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612a31573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a569190613650565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612c095781610de6565b5090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612c3e57600080fd5b50565b600060208284031215612c5357600080fd5b8135610de681612c10565b60005b83811015612c79578181015183820152602001612c61565b838111156113bc5750506000910152565b60008151808452612ca2816020860160208601612c5e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610de66020830184612c8a565b73ffffffffffffffffffffffffffffffffffffffff81168114612c3e57600080fd5b80358015158114612d1957600080fd5b919050565b600080600060608486031215612d3357600080fd5b8335612d3e81612ce7565b9250612d4c60208501612d09565b9150612d5a60408501612d09565b90509250925092565b600060208284031215612d7557600080fd5b5035919050565b60008060408385031215612d8f57600080fd5b8235612d9a81612ce7565b946020939093013593505050565b600080600060608486031215612dbd57600080fd5b8335612dc881612ce7565b92506020840135612dd881612ce7565b929592945050506040919091013590565b60008060008060608587031215612dff57600080fd5b84359350602085013567ffffffffffffffff80821115612e1e57600080fd5b818701915087601f830112612e3257600080fd5b813581811115612e4157600080fd5b886020828501011115612e5357600080fd5b602083019550809450505050612e6b60408601612d09565b905092959194509250565b600080600080600060a08688031215612e8e57600080fd5b8535612e9981612ce7565b9450612ea760208701612d09565b9350604086013560ff81168114612ebd57600080fd5b94979396509394606081013594506080013592915050565b600060208284031215612ee757600080fd5b8135610de681612ce7565b60008060408385031215612f0557600080fd5b823591506020830135612f1781612ce7565b809150509250929050565b60008060408385031215612f3557600080fd5b82359150612f4560208401612d09565b90509250929050565b60008060408385031215612f6157600080fd5b8235612f6c81612ce7565b9150612f4560208401612d09565b60008060208385031215612f8d57600080fd5b823567ffffffffffffffff80821115612fa557600080fd5b818501915085601f830112612fb957600080fd5b813581811115612fc857600080fd5b8660208260051b8501011115612fdd57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613062577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613050858351612c8a565b94509285019290850190600101613016565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130e5576130e561306f565b604052919050565b600067ffffffffffffffff8211156131075761310761306f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561314957600080fd5b843561315481612ce7565b9350602085013561316481612ce7565b925060408501359150606085013567ffffffffffffffff81111561318757600080fd5b8501601f8101871361319857600080fd5b80356131ab6131a6826130ed565b61309e565b8181528860208385010111156131c057600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156131f557600080fd5b823561320081612ce7565b91506020830135612f1781612ce7565b6000610120828403121561322357600080fd5b50919050565b600181811c9082168061323d57607f821691505b60208210811415613223577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156132b8576132b8613277565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156132e8576132e8613277565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006020828403121561335057600080fd5b8151610de681612c10565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561338a5761338a613277565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126133f757600080fd5b83018035915067ffffffffffffffff82111561341257600080fd5b60200191503681900382131561342757600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561345057600080fd5b815167ffffffffffffffff81111561346757600080fd5b8201601f8101841361347857600080fd5b80516134866131a6826130ed565b81815285602083850101111561349b57600080fd5b61262f826020830160208601612c5e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134de576134de613277565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526135246080830184612c8a565b9695505050505050565b60006020828403121561354057600080fd5b813563ffffffff81168114610de657600080fd5b60006020828403121561356657600080fd5b81356fffffffffffffffffffffffffffffffff81168114610de657600080fd5b60006020828403121561359857600080fd5b610de682612d09565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135d9576135d9613277565b500290565b600082613614577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168083038211156132e8576132e8613277565b6000821982111561364b5761364b613277565b500190565b6000806040838503121561366357600080fd5b505080516020909101519092909150565b60006020828403121561368657600080fd5b505191905056fea2646970667358221220a2531ca023eb50ca3dde83ced20cfa01768dcc3c81b0e4f9a744260954a2118164736f6c634300080a0033000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c397814610731578063e985e9c51461075e578063e9d163c914610799578063f2428621146107e457600080fd5b8063b3a2b2cf146106b5578063b88d4fde146106d5578063c87b56dd146106f5578063e256888f1461071557600080fd5b806395d89b41116100d157806395d89b4114610640578063a203db8e14610655578063a22cb46514610675578063ac9650d81461069557600080fd5b80636b2ace871461059257806370a08231146105c65780637192711f146105f35780638da5cb5b1461061357600080fd5b806323b872dd1161017a578063489bb0b211610149578063489bb0b2146103af5780634e71e0c8146103c257806351def556146103d75780636352211e1461054f57600080fd5b806323b872dd146103395780632bcea7361461035957806340e76eff1461036f57806342842e0e1461038f57600080fd5b806307d88aad116101b657806307d88aad14610256578063081812fc146102a8578063095ea7b3146102eb57806319f771711461030b57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063078dfbe714610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612c41565b610818565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102276108fd565b6040516102099190612cd4565b34801561024057600080fd5b5061025461024f366004612d1e565b61098b565b005b34801561026257600080fd5b506008546102839073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b3480156102b457600080fd5b506102836102c3366004612d63565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f757600080fd5b50610254610306366004612d7c565b610b7c565b34801561031757600080fd5b5061032b610326366004612d63565b610cc6565b604051908152602001610209565b34801561034557600080fd5b50610254610354366004612da8565b610ded565b34801561036557600080fd5b5061032b600a5481565b34801561037b57600080fd5b5061025461038a366004612de9565b6110b4565b34801561039b57600080fd5b506102546103aa366004612da8565b6113c2565b6102546103bd366004612e76565b611527565b3480156103ce57600080fd5b506102546115f4565b3480156103e357600080fd5b506104d06103f2366004612d63565b600960205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff928316939282169263ffffffff740100000000000000000000000000000000000000008404811693780100000000000000000000000000000000000000000000000081048216937c0100000000000000000000000000000000000000000000000000000000909104821692918216916fffffffffffffffffffffffffffffffff640100000000909104811691808216917001000000000000000000000000000000009091041689565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b1681529990981660208a015263ffffffff96871697890197909752938516606088015291841660808701529290921660a08501526fffffffffffffffffffffffffffffffff91821660c0850152811660e08401521661010082015261012001610209565b34801561055b57600080fd5b5061028361056a366004612d63565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561059e57600080fd5b506102837f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396681565b3480156105d257600080fd5b5061032b6105e1366004612ed5565b60026020526000908152604090205481565b3480156105ff57600080fd5b5061025461060e366004612ef2565b61170b565b34801561061f57600080fd5b506006546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561064c57600080fd5b506102276117d9565b34801561066157600080fd5b50610254610670366004612f22565b6117e6565b34801561068157600080fd5b50610254610690366004612f4e565b611aa9565b6106a86106a3366004612f7a565b611b40565b6040516102099190612fef565b3480156106c157600080fd5b506102546106d0366004612ed5565b611cb2565b3480156106e157600080fd5b506102546106f0366004613133565b611d7a565b34801561070157600080fd5b50610227610710366004612d63565b611ecb565b34801561072157600080fd5b5061032b670de0b6b3a764000081565b34801561073d57600080fd5b506007546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561076a57600080fd5b506101fd6107793660046131e2565b600560209081526000928352604080842090915290825290205460ff1681565b6107ac6107a7366004613210565b611f81565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff91821692840192909252166060820152608001610209565b3480156107f057600080fd5b506102837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806108ab57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806108f757507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805461090a90613229565b80601f016020809104026020016040519081016040528092919081815260200182805461093690613229565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610b365773ffffffffffffffffffffffffffffffffffffffff8316151580610a385750805b610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610bdf575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600960209081526040808320815161012081018352815473ffffffffffffffffffffffffffffffffffffffff908116825260018301549081169482019490945263ffffffff74010000000000000000000000000000000000000000850481169382019390935278010000000000000000000000000000000000000000000000008404831660608201527c010000000000000000000000000000000000000000000000000000000090930482166080840152600281015491821660a08401526fffffffffffffffffffffffffffffffff640100000000909204821660c08401526003015480821660e08401527001000000000000000000000000000000009004166101008201819052610ddc82612584565b610de691906132a6565b9392505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216610efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f41575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f7c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600084815260096020908152604080832060039092529091205473ffffffffffffffffffffffffffffffffffffffff1633811461111d576040517fe1c6117100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546040805161012081018252845473ffffffffffffffffffffffffffffffffffffffff90811682526001860154908116602083015274010000000000000000000000000000000000000000810463ffffffff9081169383019390935278010000000000000000000000000000000000000000000000008104831660608301527c0100000000000000000000000000000000000000000000000000000000900482166080820152600285015491821660a08201526fffffffffffffffffffffffffffffffff640100000000909204821660c082015281831660e082015270010000000000000000000000000000000090920416610100820181905260009161122790612584565b61123191906132a6565b905080611240575050506113bc565b808360030160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661126f91906132bd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506112d68360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630848488612638565b8415611363576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063330df2829061133090899089906004016132f1565b600060405180830381600087803b15801561134a57600080fd5b505af115801561135e573d6000803e3d6000fd5b505050505b60018301546040518515158152829173ffffffffffffffffffffffffffffffffffffffff169089907fff942d249898505febb2a9a00118e27567c084b9497d0aa3ba5e332c235b4f389060200160405180910390a45050505b50505050565b6113cd838383610ded565b73ffffffffffffffffffffffffffffffffffffffff82163b15806114c157506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063c0a47c939060c401600060405180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff16338114611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b6000828152600960205260409020805473ffffffffffffffffffffffffffffffffffffffff163314611769576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184907fca0251ba80971adc7e92434b097ca40450b2a317013c51c5c5cb6ae74500bb0090600090a3505050565b6001805461090a90613229565b600082815260096020908152604091829020825161012081018452815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401549182169483019490945263ffffffff74010000000000000000000000000000000000000000820481169583019590955278010000000000000000000000000000000000000000000000008104851660608301527c0100000000000000000000000000000000000000000000000000000000900484166080820152600282015493841660a08201526fffffffffffffffffffffffffffffffff640100000000909404841660c082015260039091015480841660e08301527001000000000000000000000000000000009004909216610100830152331461192e576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061193982612584565b905060008261010001516fffffffffffffffffffffffffffffffff168261196091906132a6565b90506000828460e001518560a0015163ffffffff1661197f919061335b565b8560c0015161198e91906132bd565b6fffffffffffffffffffffffffffffffff166119aa91906132a6565b600087815260096020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168255600182018590556002820180549091169055600390810184905588830151925290912054919250611a2d91309073ffffffffffffffffffffffffffffffffffffffff168589612638565b611a3e846020015130338489612638565b8181877f061c75052be1ee7232bc654d7f489af163c983bb99c5affe5e8fc2e5225cb577876020015189604051611a9992919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a4505050505050565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611b5b57611b5b61306f565b604051908082528060200260200182016040528015611b8e57816020015b6060815260200190600190039081611b795790505b50905060005b82811015611cab5760008030868685818110611bb257611bb2613393565b9050602002810190611bc491906133c2565b604051611bd292919061342e565b600060405180830381855af49150503d8060008114611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b509150915081611c7857604481511015611c2b57600080fd5b60048101905080806020019051810190611c45919061343e565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a089190612cd4565b80848481518110611c8b57611c8b613393565b602002602001018190525050508080611ca3906134ac565b915050611b94565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a08565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611d85848484610ded565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611e6557506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611dfe9033908990889088906004016134e5565b6020604051808303816000875af1158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e41919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6113bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6008546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015611f3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108f7919081019061343e565b600080808042611f97606087016040880161352e565b63ffffffff161015611fd5576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a7640000611fee60e0870160c08801613554565b6fffffffffffffffffffffffffffffffff161115612038576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61204860a086016080870161352e565b63ffffffff16158061206d575061206560c0860160a0870161352e565b63ffffffff16155b156120a4576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120f06120b46020870187612ed5565b33306120c76101008a0160e08b01613554565b6fffffffffffffffffffffffffffffffff166120eb6101208b016101008c01613586565b6127d4565b9350670de0b6b3a76400008461210c60e0880160c08901613554565b6fffffffffffffffffffffffffffffffff1661212891906135a1565b61213291906135de565b915061214460c0860160a0870161352e565b6121549063ffffffff168361335b565b612170906fffffffffffffffffffffffffffffffff16856132a6565b600a80549192506000612182836134ac565b9091555092506121a161219b6040870160208801612ed5565b84612a61565b6040805161012081019091523381526020808201906000906121c590890189612ed5565b73ffffffffffffffffffffffffffffffffffffffff16146121f2576121ed6020880188612ed5565b612214565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b73ffffffffffffffffffffffffffffffffffffffff16815260200161223f606088016040890161352e565b63ffffffff16815260200161225a608088016060890161352e565b63ffffffff16815260200161227560a088016080890161352e565b63ffffffff16815260200161229060c0880160a0890161352e565b63ffffffff90811682526fffffffffffffffffffffffffffffffff80851660208085019190915286821660408086019190915260006060958601819052898152600983528190208651815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178355888501516001840180548b8701519a8c015160808d01518b167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff918c167801000000000000000000000000000000000000000000000000029190911677ffffffffffffffffffffffffffffffffffffffffffffffff9c8c1674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931694909616939093171799909916929092179190911790965560a087015160028201805460c08a0151871664010000000002981691909616179590951790935560e085015161010090950151821670010000000000000000000000000000000002949091169390931760039092019190915561246891908701908701612ed5565b73ffffffffffffffffffffffffffffffffffffffff1633847f603bb53f65550199ed7346ba18d49bcb7ec77162b3167b272f8cd19b20d9510b6124ae60208a018a612ed5565b6124be60608b0160408c0161352e565b6124ce60808c0160608d0161352e565b6124de60a08d0160808e0161352e565b6124ee60c08e0160a08f0161352e565b898b8f6101000160208101906125049190613586565b6040805173ffffffffffffffffffffffffffffffffffffffff909916895263ffffffff97881660208a0152958716958801959095529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a08501529190911660c0830152151560e08201526101000160405180910390a49193509193565b6000808260600151836040015161259b9190613619565b63ffffffff169050804210156125b15750919050565b60006125bd82426132a6565b905060006125ea8560a0015163ffffffff16866080015163ffffffff16846125e591906135de565b612bfa565b9050808560e001516fffffffffffffffffffffffffffffffff1661260e91906135a1565b8560c001516fffffffffffffffffffffffffffffffff1661262f9190613638565b95945050505050565b80156126fb576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063f18d03cc90608401600060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050506127cd565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd64396616906397da6d309060a40160408051808303816000875af11580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190613650565b50505b5050505050565b6000811561295c576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966169063da5139ca90606401602060405180830381865afa158015612876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289a9190613674565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439669091169063f18d03cc90608401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050505061262f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439668116906302b9446c908816156129a95760006129ab565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612a31573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a569190613650565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612c095781610de6565b5090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612c3e57600080fd5b50565b600060208284031215612c5357600080fd5b8135610de681612c10565b60005b83811015612c79578181015183820152602001612c61565b838111156113bc5750506000910152565b60008151808452612ca2816020860160208601612c5e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610de66020830184612c8a565b73ffffffffffffffffffffffffffffffffffffffff81168114612c3e57600080fd5b80358015158114612d1957600080fd5b919050565b600080600060608486031215612d3357600080fd5b8335612d3e81612ce7565b9250612d4c60208501612d09565b9150612d5a60408501612d09565b90509250925092565b600060208284031215612d7557600080fd5b5035919050565b60008060408385031215612d8f57600080fd5b8235612d9a81612ce7565b946020939093013593505050565b600080600060608486031215612dbd57600080fd5b8335612dc881612ce7565b92506020840135612dd881612ce7565b929592945050506040919091013590565b60008060008060608587031215612dff57600080fd5b84359350602085013567ffffffffffffffff80821115612e1e57600080fd5b818701915087601f830112612e3257600080fd5b813581811115612e4157600080fd5b886020828501011115612e5357600080fd5b602083019550809450505050612e6b60408601612d09565b905092959194509250565b600080600080600060a08688031215612e8e57600080fd5b8535612e9981612ce7565b9450612ea760208701612d09565b9350604086013560ff81168114612ebd57600080fd5b94979396509394606081013594506080013592915050565b600060208284031215612ee757600080fd5b8135610de681612ce7565b60008060408385031215612f0557600080fd5b823591506020830135612f1781612ce7565b809150509250929050565b60008060408385031215612f3557600080fd5b82359150612f4560208401612d09565b90509250929050565b60008060408385031215612f6157600080fd5b8235612f6c81612ce7565b9150612f4560208401612d09565b60008060208385031215612f8d57600080fd5b823567ffffffffffffffff80821115612fa557600080fd5b818501915085601f830112612fb957600080fd5b813581811115612fc857600080fd5b8660208260051b8501011115612fdd57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613062577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613050858351612c8a565b94509285019290850190600101613016565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130e5576130e561306f565b604052919050565b600067ffffffffffffffff8211156131075761310761306f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561314957600080fd5b843561315481612ce7565b9350602085013561316481612ce7565b925060408501359150606085013567ffffffffffffffff81111561318757600080fd5b8501601f8101871361319857600080fd5b80356131ab6131a6826130ed565b61309e565b8181528860208385010111156131c057600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156131f557600080fd5b823561320081612ce7565b91506020830135612f1781612ce7565b6000610120828403121561322357600080fd5b50919050565b600181811c9082168061323d57607f821691505b60208210811415613223577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156132b8576132b8613277565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156132e8576132e8613277565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006020828403121561335057600080fd5b8151610de681612c10565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561338a5761338a613277565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126133f757600080fd5b83018035915067ffffffffffffffff82111561341257600080fd5b60200191503681900382131561342757600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561345057600080fd5b815167ffffffffffffffff81111561346757600080fd5b8201601f8101841361347857600080fd5b80516134866131a6826130ed565b81815285602083850101111561349b57600080fd5b61262f826020830160208601612c5e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134de576134de613277565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526135246080830184612c8a565b9695505050505050565b60006020828403121561354057600080fd5b813563ffffffff81168114610de657600080fd5b60006020828403121561356657600080fd5b81356fffffffffffffffffffffffffffffffff81168114610de657600080fd5b60006020828403121561359857600080fd5b610de682612d09565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135d9576135d9613277565b500290565b600082613614577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168083038211156132e8576132e8613277565b6000821982111561364b5761364b613277565b500190565b6000806040838503121561366357600080fd5b505080516020909101519092909150565b60006020828403121561368657600080fd5b505191905056fea2646970667358221220a2531ca023eb50ca3dde83ced20cfa01768dcc3c81b0e4f9a744260954a2118164736f6c634300080a0033

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  ]
[ 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.