S Price: $0.48266 (+3.68%)
    /

    Contract

    0x0945c1F4f0008a9E14d4721B95734dCeD355838e

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0 S

    S Value

    $0.00

    Multichain Info

    No addresses found
    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount

    There are no matching entries

    1 Internal Transaction found.

    Latest 1 internal transaction

    Parent Transaction Hash Block Age From To Amount
    159882782025-03-26 1:14:0726 days ago1742951647
     Contract Creation
    0 S
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    TellerWithMultiAssetSupport

    Compiler Version
    v0.8.21+commit.d9974bed

    Optimization Enabled:
    Yes with 200 runs

    Other Settings:
    shanghai EvmVersion
    File 1 of 23 : TellerWithMultiAssetSupport.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    import {ERC20} from "@solmate/tokens/ERC20.sol";
    import {WETH} from "@solmate/tokens/WETH.sol";
    import {BoringVault} from "src/base/BoringVault.sol";
    import {AccountantWithRateProviders} from "src/base/Roles/AccountantWithRateProviders.sol";
    import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol";
    import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol";
    import {BeforeTransferHook} from "src/interfaces/BeforeTransferHook.sol";
    import {Auth, Authority} from "@solmate/auth/Auth.sol";
    import {ReentrancyGuard} from "@solmate/utils/ReentrancyGuard.sol";
    import {IPausable} from "src/interfaces/IPausable.sol";
    contract TellerWithMultiAssetSupport is Auth, BeforeTransferHook, ReentrancyGuard, IPausable {
    using FixedPointMathLib for uint256;
    using SafeTransferLib for ERC20;
    using SafeTransferLib for WETH;
    // ========================================= STRUCTS =========================================
    /**
    * @param allowDeposits bool indicating whether or not deposits are allowed for this asset.
    * @param allowWithdraws bool indicating whether or not withdraws are allowed for this asset.
    * @param sharePremium uint16 indicating the premium to apply to the shares minted.
    * where 40 represents a 40bps reduction in shares minted using this asset.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 23 : ERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
    /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
    /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
    abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
    EVENTS
    //////////////////////////////////////////////////////////////*/
    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
    /*//////////////////////////////////////////////////////////////
    METADATA STORAGE
    //////////////////////////////////////////////////////////////*/
    string public name;
    string public symbol;
    uint8 public immutable decimals;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 23 : WETH.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    import {ERC20} from "./ERC20.sol";
    import {SafeTransferLib} from "../utils/SafeTransferLib.sol";
    /// @notice Minimalist and modern Wrapped Ether implementation.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/WETH.sol)
    /// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
    contract WETH is ERC20("Wrapped Ether", "WETH", 18) {
    using SafeTransferLib for address;
    event Deposit(address indexed from, uint256 amount);
    event Withdrawal(address indexed to, uint256 amount);
    function deposit() public payable virtual {
    _mint(msg.sender, msg.value);
    emit Deposit(msg.sender, msg.value);
    }
    function withdraw(uint256 amount) public virtual {
    _burn(msg.sender, amount);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 23 : BoringVault.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    import {Address} from "@openzeppelin/contracts/utils/Address.sol";
    import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
    import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
    import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol";
    import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol";
    import {BeforeTransferHook} from "src/interfaces/BeforeTransferHook.sol";
    import {Auth, Authority} from "@solmate/auth/Auth.sol";
    import {ERC20} from "@solmate/tokens/ERC20.sol";
    import {BoringChef} from "src/boring-chef/BoringChef.sol";
    contract BoringVault is BoringChef, ERC721Holder, ERC1155Holder {
    using Address for address;
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;
    // ========================================= STATE =========================================
    /**
    * @notice Contract responsbile for implementing `beforeTransfer`.
    */
    BeforeTransferHook public hook;
    //============================== EVENTS ===============================
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 23 : AccountantWithRateProviders.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol";
    import {IRateProvider} from "src/interfaces/IRateProvider.sol";
    import {ERC20} from "@solmate/tokens/ERC20.sol";
    import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol";
    import {BoringVault} from "src/base/BoringVault.sol";
    import {Auth, Authority} from "@solmate/auth/Auth.sol";
    import {IPausable} from "src/interfaces/IPausable.sol";
    contract AccountantWithRateProviders is Auth, IRateProvider, IPausable {
    using FixedPointMathLib for uint256;
    using SafeTransferLib for ERC20;
    // ========================================= STRUCTS =========================================
    /**
    * @param payoutAddress the address `claimFees` sends fees to
    * @param highwaterMark the highest value of the BoringVault's share price
    * @param feesOwedInBase total pending fees owed in terms of base
    * @param totalSharesLastUpdate total amount of shares the last exchange rate update
    * @param exchangeRate the current exchange rate in terms of base
    * @param allowedExchangeRateChangeUpper the max allowed change to exchange rate from an update
    * @param allowedExchangeRateChangeLower the min allowed change to exchange rate from an update
    * @param lastUpdateTimestamp the block timestamp of the last exchange rate update
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 23 : FixedPointMathLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    /// @notice Arithmetic library with operations for fixed-point numbers.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
    /// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
    library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/
    uint256 internal constant MAX_UINT256 = 2**256 - 1;
    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.
    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
    return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }
    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
    return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }
    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
    return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 23 : SafeTransferLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    import {ERC20} from "../tokens/ERC20.sol";
    /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
    /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
    library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
    ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/
    function safeTransferETH(address to, uint256 amount) internal {
    bool success;
    /// @solidity memory-safe-assembly
    assembly {
    // Transfer the ETH and store if it succeeded or not.
    success := call(gas(), to, amount, 0, 0, 0, 0)
    }
    require(success, "ETH_TRANSFER_FAILED");
    }
    /*//////////////////////////////////////////////////////////////
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 23 : BeforeTransferHook.sol
    1
    2
    3
    4
    5
    6
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    interface BeforeTransferHook {
    function beforeTransfer(address from, address to, address operator) external view;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 23 : Auth.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    /// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
    /// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
    abstract contract Auth {
    event OwnershipTransferred(address indexed user, address indexed newOwner);
    event AuthorityUpdated(address indexed user, Authority indexed newAuthority);
    address public owner;
    Authority public authority;
    constructor(address _owner, Authority _authority) {
    owner = _owner;
    authority = _authority;
    emit OwnershipTransferred(msg.sender, _owner);
    emit AuthorityUpdated(msg.sender, _authority);
    }
    modifier requiresAuth() virtual {
    require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED");
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 23 : ReentrancyGuard.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    /// @notice Gas optimized reentrancy protection for smart contracts.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)
    /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
    abstract contract ReentrancyGuard {
    uint256 private locked = 1;
    modifier nonReentrant() virtual {
    require(locked == 1, "REENTRANCY");
    locked = 2;
    _;
    locked = 1;
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 23 : IPausable.sol
    1
    2
    3
    4
    5
    6
    7
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    interface IPausable {
    function pause() external;
    function unpause() external;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 23 : Address.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)
    pragma solidity ^0.8.20;
    import {Errors} from "./Errors.sol";
    /**
    * @dev Collection of functions related to the address type
    */
    library Address {
    /**
    * @dev There's no code at `target` (it is not a contract).
    */
    error AddressEmptyCode(address target);
    /**
    * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    * `recipient`, forwarding all available gas and reverting on errors.
    *
    * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
    * of certain opcodes, possibly making contracts go over the 2300 gas limit
    * imposed by `transfer`, making them unable to receive funds via
    * `transfer`. {sendValue} removes this limitation.
    *
    * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 23 : ERC721Holder.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol)
    pragma solidity ^0.8.20;
    import {IERC721Receiver} from "../IERC721Receiver.sol";
    /**
    * @dev Implementation of the {IERC721Receiver} interface.
    *
    * Accepts all token transfers.
    * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or
    * {IERC721-setApprovalForAll}.
    */
    abstract contract ERC721Holder is IERC721Receiver {
    /**
    * @dev See {IERC721Receiver-onERC721Received}.
    *
    * Always returns `IERC721Receiver.onERC721Received.selector`.
    */
    function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) {
    return this.onERC721Received.selector;
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 23 : ERC1155Holder.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/utils/ERC1155Holder.sol)
    pragma solidity ^0.8.20;
    import {IERC165, ERC165} from "../../../utils/introspection/ERC165.sol";
    import {IERC1155Receiver} from "../IERC1155Receiver.sol";
    /**
    * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC-1155 tokens.
    *
    * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
    * stuck.
    */
    abstract contract ERC1155Holder is ERC165, IERC1155Receiver {
    /**
    * @dev See {IERC165-supportsInterface}.
    */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
    return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
    function onERC1155Received(
    address,
    address,
    uint256,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 23 : BoringChef.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    import {Auth, Authority} from "@solmate/auth/Auth.sol";
    import {ERC20} from "@solmate/tokens/ERC20.sol";
    import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol";
    import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol";
    import {BoringSafe} from "./BoringSafe.sol";
    /// @title BoringChef
    /// @author Shivaansh Kapoor, Jet Jadeja, Jack Corddry
    /// @notice A contract for reward accounting, retroactive distribution, and claims for share based vaults.
    contract BoringChef is Auth, ERC20 {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;
    /*//////////////////////////////////////////////////////////////
    ERRORS
    //////////////////////////////////////////////////////////////*/
    error ArrayLengthMismatch();
    error NoFutureEpochRewards();
    error InvalidRewardCampaignDuration();
    error MustClaimAtLeastOneReward();
    error CannotClaimFutureReward();
    error RewardClaimedAlready(uint256 rewardId);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 23 : IRateProvider.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // SPDX-License-Identifier: UNLICENSED
    // This program is free software: you can redistribute it and/or modify
    // it under the terms of the GNU General Public License as published by
    // the Free Software Foundation, either version 3 of the License, or
    // (at your option) any later version.
    // This program is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    // GNU General Public License for more details.
    // You should have received a copy of the GNU General Public License
    // along with this program. If not, see <http://www.gnu.org/licenses/>.
    pragma solidity ^0.8.0;
    interface IRateProvider {
    function getRate() external view returns (uint256);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 23 : Errors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Collection of common custom errors used in multiple contracts
    *
    * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
    * It is recommended to avoid relying on the error API for critical functionality.
    *
    * _Available since v5.1._
    */
    library Errors {
    /**
    * @dev The ETH balance of the account is not enough to perform the operation.
    */
    error InsufficientBalance(uint256 balance, uint256 needed);
    /**
    * @dev A call to an address target failed. The target may have reverted.
    */
    error FailedCall();
    /**
    * @dev The deployment failed.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 23 : IERC721Receiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)
    pragma solidity ^0.8.20;
    /**
    * @title ERC-721 token receiver interface
    * @dev Interface for any contract that wants to support safeTransfers
    * from ERC-721 asset contracts.
    */
    interface IERC721Receiver {
    /**
    * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
    * by `operator` from `from`, this function is called.
    *
    * It must return its Solidity selector to confirm the token transfer.
    * If any other value is returned or the interface is not implemented by the recipient, the transfer will be
    * reverted.
    *
    * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
    */
    function onERC721Received(
    address operator,
    address from,
    uint256 tokenId,
    bytes calldata data
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 23 : ERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "./IERC165.sol";
    /**
    * @dev Implementation of the {IERC165} interface.
    *
    * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
    * for the additional interface id that will be supported. For example:
    *
    * ```solidity
    * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
    * }
    * ```
    */
    abstract contract ERC165 is IERC165 {
    /**
    * @dev See {IERC165-supportsInterface}.
    */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
    return interfaceId == type(IERC165).interfaceId;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 23 : IERC1155Receiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155Receiver.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "../../utils/introspection/IERC165.sol";
    /**
    * @dev Interface that must be implemented by smart contracts in order to receive
    * ERC-1155 token transfers.
    */
    interface IERC1155Receiver is IERC165 {
    /**
    * @dev Handles the receipt of a single ERC-1155 token type. This function is
    * called at the end of a `safeTransferFrom` after the balance has been updated.
    *
    * NOTE: To accept the transfer, this must return
    * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    * (i.e. 0xf23a6e61, or its own function selector).
    *
    * @param operator The address which initiated the transfer (i.e. msg.sender)
    * @param from The address which previously owned the token
    * @param id The ID of the token being transferred
    * @param value The amount of tokens being transferred
    * @param data Additional data with no specified format
    * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 23 : BoringSafe.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity 0.8.21;
    import {Owned} from "@solmate/auth/Owned.sol";
    import {ERC20} from "solmate/tokens/ERC20.sol";
    import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";
    /// @title BoringSafe
    /// @notice Lightweight middleware contract for holding funds that have been committed to reward campaigns in BoringChef.
    contract BoringSafe is Owned(msg.sender) {
    using SafeTransferLib for ERC20;
    error ArrayLengthMismatch();
    /// @notice Transfers tokens from this contract.
    /// @notice Only callable by the owner (BoringChef).
    /// @param tokens The addresses of the ERC20 tokens to transfer.
    /// @param amounts The amounts of each token to transfer.
    /// @param to The recipient address.
    function transfer(address[] memory tokens, uint256[] memory amounts, address to) external onlyOwner {
    // Make sure each token has a corresponding amount
    uint256 numTokens = tokens.length;
    if (numTokens != amounts.length) {
    revert ArrayLengthMismatch();
    }
    // Transfer all tokens to the specified address
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 23 : IERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-165 standard, as defined in the
    * https://eips.ethereum.org/EIPS/eip-165[ERC].
    *
    * Implementers can declare support of contract interfaces, which can then be
    * queried by others ({ERC165Checker}).
    *
    * For an implementation, see {ERC165}.
    */
    interface IERC165 {
    /**
    * @dev Returns true if this contract implements the interface defined by
    * `interfaceId`. See the corresponding
    * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
    * to learn more about how these ids are created.
    *
    * This function call must use less than 30 000 gas.
    */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 23 : Owned.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: AGPL-3.0-only
    pragma solidity >=0.8.0;
    /// @notice Simple single owner authorization mixin.
    /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
    abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
    EVENTS
    //////////////////////////////////////////////////////////////*/
    event OwnershipTransferred(address indexed user, address indexed newOwner);
    /*//////////////////////////////////////////////////////////////
    OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/
    address public owner;
    modifier onlyOwner() virtual {
    require(msg.sender == owner, "UNAUTHORIZED");
    _;
    }
    /*//////////////////////////////////////////////////////////////
    CONSTRUCTOR
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
    "remappings": [
    "@solmate/=lib/solmate/src/",
    "@forge-std/=lib/forge-std/src/",
    "@ds-test/=lib/forge-std/lib/ds-test/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@ccip/=lib/ccip/",
    "@oapp-auth/=lib/OAppAuth/src/",
    "@devtools-oapp-evm/=lib/OAppAuth/lib/devtools/packages/oapp-evm/contracts/oapp/",
    "@layerzerolabs/lz-evm-messagelib-v2/=lib/OAppAuth/node_modules/@layerzerolabs/lz-evm-messagelib-v2/",
    "@layerzerolabs/lz-evm-protocol-v2/=lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/protocol/",
    "@layerzerolabs/oapp-evm/=lib/OAppAuth/lib/devtools/packages/oapp-evm/",
    "@lz-oapp-evm/=lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/oapp/contracts/oapp/",
    "@sbu/=lib/OAppAuth/lib/solidity-bytes-utils/",
    "LayerZero-V2/=lib/OAppAuth/lib/",
    "OAppAuth/=lib/OAppAuth/",
    "ccip/=lib/ccip/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solidity-bytes-utils/=lib/OAppAuth/node_modules/solidity-bytes-utils/",
    "solmate/=lib/solmate/src/"
    ],
    "optimizer": {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_accountant","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"TellerWithMultiAssetSupport__AssetNotSupported","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__BadDepositHash","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__CannotDepositNative","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__DualDeposit","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__MinimumAssetsNotMet","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__MinimumMintNotMet","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__Paused","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__PermitFailedAndAllowanceTooLow","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__ShareLockPeriodTooLong","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__SharePremiumTooLarge","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__SharesAreLocked","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__SharesAreUnLocked","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"TellerWithMultiAssetSupport__TransferDenied","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__ZeroAssets","type":"error"},{"inputs":[],"name":"TellerWithMultiAssetSupport__ZeroShares","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AllowFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AllowOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AllowTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"bool","name":"allowDeposits","type":"bool"},{"indexed":false,"internalType":"bool","name":"allowWithdraws","type":"bool"},{"indexed":false,"internalType":"uint16","name":"sharePremium","type":"uint16"}],"name":"AssetDataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"BulkDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"BulkWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"DenyFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"DenyOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"DenyTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"depositAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareLockPeriodAtTimeOfDeposit","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"depositHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"DepositRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"accountant","outputs":[{"internalType":"contract AccountantWithRateProviders","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"allowAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"allowFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"allowOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"allowTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"name":"assetData","outputs":[{"internalType":"bool","name":"allowDeposits","type":"bool"},{"internalType":"bool","name":"allowWithdraws","type":"bool"},{"internalType":"uint16","name":"sharePremium","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"beforeTransfer","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"minimumMint","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bulkDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"withdrawAsset","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"},{"internalType":"uint256","name":"minimumAssets","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bulkWithdraw","outputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"denyAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"denyFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"denyOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"denyTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"minimumMint","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositNonce","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"minimumMint","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fromDenyList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeWrapper","outputs":[{"internalType":"contract WETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorDenyList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"publicDepositHistory","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"shareAmount","type":"uint256"},{"internalType":"uint256","name":"depositTimestamp","type":"uint256"},{"internalType":"uint256","name":"shareLockUpPeriodAtTimeOfDeposit","type":"uint256"}],"name":"refundDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_shareLockPeriod","type":"uint64"}],"name":"setShareLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareLockPeriod","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shareUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"toDenyList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"bool","name":"allowDeposits","type":"bool"},{"internalType":"bool","name":"allowWithdraws","type":"bool"},{"internalType":"uint16","name":"sharePremium","type":"uint16"}],"name":"updateAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract BoringVault","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

    610100604052600160025534801562000016575f80fd5b50604051620027283803806200272883398101604081905262000039916200017b565b5f80546001600160a01b0386166001600160a01b031991821681178355600180549092169091556040518692919033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908490a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350506001600160a01b03831660808190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156200010e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001349190620001d5565b6200014190600a6200030d565b60c0526001600160a01b0391821660a0521660e052506200031d9050565b80516001600160a01b038116811462000176575f80fd5b919050565b5f805f80608085870312156200018f575f80fd5b6200019a856200015f565b9350620001aa602086016200015f565b9250620001ba604086016200015f565b9150620001ca606086016200015f565b905092959194509250565b5f60208284031215620001e6575f80fd5b815160ff81168114620001f7575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200025257815f1904821115620002365762000236620001fe565b808516156200024457918102915b93841c939080029062000217565b509250929050565b5f826200026a5750600162000307565b816200027857505f62000307565b81600181146200029157600281146200029c57620002bc565b600191505062000307565b60ff841115620002b057620002b0620001fe565b50506001821b62000307565b5060208310610133831016604e8410600b8410161715620002e1575081810a62000307565b620002ed838362000212565b805f1904821115620003035762000303620001fe565b0290505b92915050565b5f620001f760ff8416836200025a565b60805160a05160c05160e05161237c620003ac5f395f8181610249015281816107e301528181610860015281816108ae01526111d101525f8181610f3d0152611b6b01525f81816104a001528181610ece0152611b8d01525f818161070c0152818161088401528181610f9b0152818161120b01528181611c7201528181611e320152611ed2015261237c5ff3fe6080604052600436106101f1575f3560e01c80635f45bac811610108578063a924bf611161009d578063c29d2f101161006d578063c29d2f1014610658578063de35f5cb14610677578063f07f287d146106ae578063f2fde38b146106dc578063fbfa77cf146106fb575f80fd5b8063a924bf61146105db578063abd626b0146105fa578063b187bd2614610619578063bf7e214f14610639575f80fd5b80638dfd8ba1116100d85780638dfd8ba1146105325780639a94d3d0146105515780639d5744201461057c5780639fdb11b61461059b575f80fd5b80635f45bac8146104c25780637a9e5e4b146104e15780638456cb59146105005780638da5cb5b14610514575f80fd5b806326a64b40116101895780633e64ce99116101595780633e64ce99146103d85780633f4ba83a146103f757806341fee44a1461040b57806346b563f4146104705780634fb3ccc51461048f575f80fd5b806326a64b401461034d5780632c524c421461037b5780633b5754071461039a5780633d935d9e146103b9575f80fd5b80631899ea81116101c45780631899ea81146102c557806318aed921146102f05780631b62636c1461030f5780631ba9a4581461032e575f80fd5b806304ded84a146101f55780630b48a8b8146102385780630efe6a8b1461028357806312056e2d146102a4575b5f80fd5b348015610200575f80fd5b5061022361020f366004611f9f565b60086020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610243575f80fd5b5061026b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161022f565b610296610291366004611fc1565b61072e565b60405190815260200161022f565b3480156102af575f80fd5b506102c36102be366004611ff3565b610942565b005b3480156102d0575f80fd5b506102966102df366004611f9f565b60066020525f908152604090205481565b3480156102fb575f80fd5b506102c361030a366004611f9f565b6109cf565b34801561031a575f80fd5b506102c3610329366004611f9f565b610ad7565b348015610339575f80fd5b506102c3610348366004611f9f565b610b53565b348015610358575f80fd5b50610223610367366004611f9f565b60076020525f908152604090205460ff1681565b348015610386575f80fd5b506102c3610395366004611f9f565b610bcc565b3480156103a5575f80fd5b506102c36103b4366004611f9f565b610c48565b3480156103c4575f80fd5b506102966103d336600461201a565b610cc4565b3480156103e3575f80fd5b506102966103f2366004612082565b610dc4565b348015610402575f80fd5b506102c3611051565b348015610416575f80fd5b5061044f610425366004611f9f565b60036020525f908152604090205460ff8082169161010081049091169062010000900461ffff1683565b604080519315158452911515602084015261ffff169082015260600161022f565b34801561047b575f80fd5b506102c361048a3660046120c9565b6110b9565b34801561049a575f80fd5b5061026b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cd575f80fd5b506102c36104dc366004611f9f565b6112c3565b3480156104ec575f80fd5b506102c36104fb366004611f9f565b61133c565b34801561050b575f80fd5b506102c3611420565b34801561051f575f80fd5b505f5461026b906001600160a01b031681565b34801561053d575f80fd5b506102c361054c366004612136565b61148e565b34801561055c575f80fd5b5061029661056b36600461218a565b60056020525f908152604090205481565b348015610587575f80fd5b50610296610596366004612082565b6115a7565b3480156105a6575f80fd5b506004546105c290600160601b900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022f565b3480156105e6575f80fd5b506102c36105f5366004611f9f565b61166c565b348015610605575f80fd5b506102c36106143660046121a1565b6116e5565b348015610624575f80fd5b5060045461022390600160a01b900460ff1681565b348015610644575f80fd5b5060015461026b906001600160a01b031681565b348015610663575f80fd5b506102c3610672366004611f9f565b6117ba565b348015610682575f80fd5b50600454610696906001600160601b031681565b6040516001600160601b03909116815260200161022f565b3480156106b9575f80fd5b506102236106c8366004611f9f565b60096020525f908152604090205460ff1681565b3480156106e7575f80fd5b506102c36106f6366004611f9f565b6118bb565b348015610706575f80fd5b5061026b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60025460011461075a5760405162461bcd60e51b8152600401610751906121e9565b60405180910390fd5b60028055610773336001600160e01b03195f3516611936565b61078f5760405162461bcd60e51b81526004016107519061220d565b5f610799856119de565b90505f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038716016108d557345f036107e15760405163259be69560e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561083a575f80fd5b505af115801561084c573d5f803e3d5ffd5b503498506108ab9350506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691507f0000000000000000000000000000000000000000000000000000000000000000905087611a99565b507f00000000000000000000000000000000000000000000000000000000000000009450306108f7565b34156108f457604051631cf02cf960e21b815260040160405180910390fd5b50335b610905868686843387611b27565b9250610934338787866004600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff16611ce6565b505060016002559392505050565b610957335f356001600160e01b031916611936565b6109735760405162461bcd60e51b81526004016107519061220d565b6203f4808167ffffffffffffffff1611156109a157604051631fac010160e21b815260040160405180910390fd5b6004805467ffffffffffffffff909216600160601b0267ffffffffffffffff60601b19909216919091179055565b6109e4335f356001600160e01b031916611936565b610a005760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f8181526007602090815260408083208054600160ff1991821681179092556008845282852080548216831790556009909352818420805490931617909155517fd658022b1a3aaf6ad3b3c615253712807f21a8f7bc3e4996e10618175d4afb2b9190a26040516001600160a01b038216907f79fc685a7dbabb75a67df5e69a90602cef1f19bc465b060eab1ac56685e04a13905f90a26040516001600160a01b038216907f3afb02134e37f7205acf470adc2fc4ebb70614b1599a602d069790915380e2aa905f90a250565b610aec335f356001600160e01b031916611936565b610b085760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260096020526040808220805460ff19166001179055517f3afb02134e37f7205acf470adc2fc4ebb70614b1599a602d069790915380e2aa9190a250565b610b68335f356001600160e01b031916611936565b610b845760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260096020526040808220805460ff19169055517f77cb944c14da76928795279d1519ce9150085a06e0a53c61d5a86fc4e0fd57c69190a250565b610be1335f356001600160e01b031916611936565b610bfd5760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260076020526040808220805460ff19166001179055517fd658022b1a3aaf6ad3b3c615253712807f21a8f7bc3e4996e10618175d4afb2b9190a250565b610c5d335f356001600160e01b031916611936565b610c795760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260086020526040808220805460ff19166001179055517f79fc685a7dbabb75a67df5e69a90602cef1f19bc465b060eab1ac56685e04a139190a250565b5f610cda335f356001600160e01b031916611936565b610cf65760405162461bcd60e51b81526004016107519061220d565b600254600114610d185760405162461bcd60e51b8152600401610751906121e9565b600280558773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601610d5b576040516316df5df960e31b815260040160405180910390fd5b5f610d658a6119de565b9050610d758a8a89898989611e15565b610d838a8a8a333386611b27565b9250610db2338b8b866004600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff16611ce6565b50506001600255979650505050505050565b5f610dda335f356001600160e01b031916611936565b610df65760405162461bcd60e51b81526004016107519061220d565b600454600160a01b900460ff1615610e215760405163e0f9e71d60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600360209081526040918290208251606081018452905460ff80821615158352610100820416151592820183905262010000900461ffff1692810192909252610e8b5760405163645fd19f60e11b815260040160405180910390fd5b845f03610eab57604051630ea3153160e21b815260040160405180910390fd5b604051634104b9ed60e11b81526001600160a01b038781166004830152610f61917f00000000000000000000000000000000000000000000000000000000000000009091169063820973da90602401602060405180830381865afa158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f399190612233565b86907f0000000000000000000000000000000000000000000000000000000000000000611f6d565b915083821015610f84576040516302620f6160e61b815260040160405180910390fd5b6040516318457e6160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318457e6190610fd89086908a90879033908c9060040161224a565b5f604051808303815f87803b158015610fef575f80fd5b505af1158015611001573d5f803e3d5ffd5b50505050856001600160a01b03167fdcc60b41ff1c604459e6aa4a7299817416b19fc586a392f111646e26597c4af98660405161104091815260200190565b60405180910390a250949350505050565b611066335f356001600160e01b031916611936565b6110825760405162461bcd60e51b81526004016107519061220d565b6004805460ff60a01b191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a1565b6110ce335f356001600160e01b031916611936565b6110ea5760405162461bcd60e51b81526004016107519061220d565b806110f58342612291565b1061111357604051634c1eef1760e11b815260040160405180910390fd5b604080516001600160a01b038089166020830152871691810191909152606081018590526080810184905260a0810183905260c081018290525f9060e00160408051601f1981840301815291815281516020928301205f8b8152600590935291205490915081146111975760405163fa174ecb60e01b815260040160405180910390fd5b5f888152600560205260408120556001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146111cf57856111f1565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516318457e6160e01b81529096506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318457e6190611248908a908a908a9083908b9060040161224a565b5f604051808303815f87803b15801561125f575f80fd5b505af1158015611271573d5f803e3d5ffd5b50505050866001600160a01b0316887faf98ea774275cadfa3e477a7b52cba03e01197445a76bd5d0d561608708c3624836040516112b191815260200190565b60405180910390a35050505050505050565b6112d8335f356001600160e01b031916611936565b6112f45760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260086020526040808220805460ff19169055517f039bcf51833310242b8b7c6aa0fbabf1bf2b5e5270807ee020f1920ef200666b9190a250565b5f546001600160a01b03163314806113cd575060015460405163b700961360e01b81526001600160a01b039091169063b70096139061138e90339030906001600160e01b03195f3516906004016122a4565b602060405180830381865afa1580156113a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cd91906122d1565b6113d5575f80fd5b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b611435335f356001600160e01b031916611936565b6114515760405162461bcd60e51b81526004016107519061220d565b6004805460ff60a01b1916600160a01b1790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a1565b6114a3335f356001600160e01b031916611936565b6114bf5760405162461bcd60e51b81526004016107519061220d565b6103e861ffff821611156114e657604051636c5cde8760e01b815260040160405180910390fd5b6040805160608082018352851515808352851515602080850182815261ffff8881168789018181526001600160a01b038e165f818152600387528b902099518a549551925161ffff1990961690151561ff00191617610100921515929092029190911763ffff0000191662010000949093169390930291909117909655865193845290830191909152938101929092527fe08301321781ac43935a2099b2c3fd42de0a0ee87a519cac00e8c9cecd26ff12910160405180910390a250505050565b5f6115bd335f356001600160e01b031916611936565b6115d95760405162461bcd60e51b81526004016107519061220d565b6002546001146115fb5760405162461bcd60e51b8152600401610751906121e9565b600280555f611609866119de565b9050611619868686338786611b27565b9150856001600160a01b03167f6f9b974223f85a1ae805c33b8b519039e2435481d949db1110de151a94d587af8660405161165691815260200190565b60405180910390a2506001600255949350505050565b611681335f356001600160e01b031916611936565b61169d5760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260076020526040808220805460ff19169055517fae893dda71e2eee548f8291f458cceae4bd22b56a79906928591e4420444c0e99190a250565b6001600160a01b0383165f9081526007602052604090205460ff168061172257506001600160a01b0382165f9081526008602052604090205460ff165b8061174457506001600160a01b0381165f9081526009602052604090205460ff165b1561177d57604051632821264f60e01b81526001600160a01b038085166004830152808416602483015282166044820152606401610751565b6001600160a01b0383165f908152600660205260409020544210156117b55760405163f64059db60e01b815260040160405180910390fd5b505050565b6117cf335f356001600160e01b031916611936565b6117eb5760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f818152600760209081526040808320805460ff199081169091556008835281842080548216905560099092528083208054909216909155517fae893dda71e2eee548f8291f458cceae4bd22b56a79906928591e4420444c0e99190a26040516001600160a01b038216907f039bcf51833310242b8b7c6aa0fbabf1bf2b5e5270807ee020f1920ef200666b905f90a26040516001600160a01b038216907f77cb944c14da76928795279d1519ce9150085a06e0a53c61d5a86fc4e0fd57c6905f90a250565b6118d0335f356001600160e01b031916611936565b6118ec5760405162461bcd60e51b81526004016107519061220d565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001545f906001600160a01b031680158015906119bd575060405163b700961360e01b81526001600160a01b0382169063b70096139061197e908790309088906004016122a4565b602060405180830381865afa158015611999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119bd91906122d1565b806119d457505f546001600160a01b038581169116145b9150505b92915050565b604080516060810182525f8082526020820181905291810191909152600454600160a01b900460ff1615611a255760405163e0f9e71d60e01b815260040160405180910390fd5b506001600160a01b0381165f908152600360209081526040918290208251606081018452905460ff8082161515808452610100830490911615159383019390935262010000900461ffff1692810192909252611a945760405163645fd19f60e11b815260040160405180910390fd5b919050565b5f60405163095ea7b360e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f511416151615611ae35750823b153d17155b80611b215760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610751565b50505050565b5f855f03611b485760405163259be69560e11b815260040160405180910390fd5b604051634104b9ed60e11b81526001600160a01b038881166004830152611bfe917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000169063820973da90602401602060405180830381865afa158015611bd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf69190612233565b889190611f6d565b90505f826040015161ffff1611611c155780611c38565b611c388260400151612710611c2a91906122ec565b829061ffff16612710611f6d565b905084811015611c5b5760405163097b2ad560e31b815260040160405180910390fd5b604051631ceb5d1960e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906339d6ba3290611caf9087908b908b908990889060040161224a565b5f604051808303815f87803b158015611cc6575f80fd5b505af1158015611cd8573d5f803e3d5ffd5b505050509695505050505050565b600480545f91908290611d01906001600160601b031661230e565b82546001600160601b039182166101009390930a838102920219161790915590508115611da557611d328242612333565b6001600160a01b038781165f81815260066020908152604091829020949094558051938401919091529087169082015260608101859052608081018490524260a082015260c0810183905260e00160408051601f1981840301815291815281516020928301205f84815260059093529120555b846001600160a01b0316866001600160a01b0316827fe96d7872363f475d18b2f5390caaa5eaa96b2d38e42c62afe4ac08ebd2b13c3a87874288604051611e05949392919093845260208401929092526040830152606082015260800190565b60405180910390a4505050505050565b60405163d505accf60e01b81523360048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018790526064820186905260ff8516608483015260a4820184905260c4820183905287169063d505accf9060e4015f604051808303815f87803b158015611ea0575f80fd5b505af1925050508015611eb1575060015b611f6557604051636eb1769f60e11b81523360048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116602483015286919088169063dd62ed3e90604401602060405180830381865afa158015611f22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f469190612233565b1015611f65576040516301b8851f60e41b815260040160405180910390fd5b505050505050565b5f825f190484118302158202611f81575f80fd5b5091020490565b6001600160a01b0381168114611f9c575f80fd5b50565b5f60208284031215611faf575f80fd5b8135611fba81611f88565b9392505050565b5f805f60608486031215611fd3575f80fd5b8335611fde81611f88565b95602085013595506040909401359392505050565b5f60208284031215612003575f80fd5b813567ffffffffffffffff81168114611fba575f80fd5b5f805f805f805f60e0888a031215612030575f80fd5b873561203b81611f88565b9650602088013595506040880135945060608801359350608088013560ff81168114612065575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f805f8060808587031215612095575f80fd5b84356120a081611f88565b9350602085013592506040850135915060608501356120be81611f88565b939692955090935050565b5f805f805f805f60e0888a0312156120df575f80fd5b8735965060208801356120f181611f88565b9550604088013561210181611f88565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b8015158114611f9c575f80fd5b5f805f8060808587031215612149575f80fd5b843561215481611f88565b9350602085013561216481612129565b9250604085013561217481612129565b9150606085013561ffff811681146120be575f80fd5b5f6020828403121561219a575f80fd5b5035919050565b5f805f606084860312156121b3575f80fd5b83356121be81611f88565b925060208401356121ce81611f88565b915060408401356121de81611f88565b809150509250925092565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f60208284031215612243575f80fd5b5051919050565b6001600160a01b039586168152938516602085015260408401929092529092166060820152608081019190915260a00190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156119d8576119d861227d565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f602082840312156122e1575f80fd5b8151611fba81612129565b61ffff8281168282160390808211156123075761230761227d565b5092915050565b5f6001600160601b038083168181036123295761232961227d565b6001019392505050565b808201808211156119d8576119d861227d56fea26469706673582212209ec8f5f7b40a6a74d5dbe2b5a6bc2dd8eb04cf6bcafdbbdef38774b8dd683d1864736f6c634300081500330000000000000000000000005f2f11ad8656439d5c14d9b351f8b09cdac2a02d000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee200000000000000000000000072489268f65721f5c86024d9ad00307cec844c31000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38

    Deployed Bytecode

    0x6080604052600436106101f1575f3560e01c80635f45bac811610108578063a924bf611161009d578063c29d2f101161006d578063c29d2f1014610658578063de35f5cb14610677578063f07f287d146106ae578063f2fde38b146106dc578063fbfa77cf146106fb575f80fd5b8063a924bf61146105db578063abd626b0146105fa578063b187bd2614610619578063bf7e214f14610639575f80fd5b80638dfd8ba1116100d85780638dfd8ba1146105325780639a94d3d0146105515780639d5744201461057c5780639fdb11b61461059b575f80fd5b80635f45bac8146104c25780637a9e5e4b146104e15780638456cb59146105005780638da5cb5b14610514575f80fd5b806326a64b40116101895780633e64ce99116101595780633e64ce99146103d85780633f4ba83a146103f757806341fee44a1461040b57806346b563f4146104705780634fb3ccc51461048f575f80fd5b806326a64b401461034d5780632c524c421461037b5780633b5754071461039a5780633d935d9e146103b9575f80fd5b80631899ea81116101c45780631899ea81146102c557806318aed921146102f05780631b62636c1461030f5780631ba9a4581461032e575f80fd5b806304ded84a146101f55780630b48a8b8146102385780630efe6a8b1461028357806312056e2d146102a4575b5f80fd5b348015610200575f80fd5b5061022361020f366004611f9f565b60086020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610243575f80fd5b5061026b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516001600160a01b03909116815260200161022f565b610296610291366004611fc1565b61072e565b60405190815260200161022f565b3480156102af575f80fd5b506102c36102be366004611ff3565b610942565b005b3480156102d0575f80fd5b506102966102df366004611f9f565b60066020525f908152604090205481565b3480156102fb575f80fd5b506102c361030a366004611f9f565b6109cf565b34801561031a575f80fd5b506102c3610329366004611f9f565b610ad7565b348015610339575f80fd5b506102c3610348366004611f9f565b610b53565b348015610358575f80fd5b50610223610367366004611f9f565b60076020525f908152604090205460ff1681565b348015610386575f80fd5b506102c3610395366004611f9f565b610bcc565b3480156103a5575f80fd5b506102c36103b4366004611f9f565b610c48565b3480156103c4575f80fd5b506102966103d336600461201a565b610cc4565b3480156103e3575f80fd5b506102966103f2366004612082565b610dc4565b348015610402575f80fd5b506102c3611051565b348015610416575f80fd5b5061044f610425366004611f9f565b60036020525f908152604090205460ff8082169161010081049091169062010000900461ffff1683565b604080519315158452911515602084015261ffff169082015260600161022f565b34801561047b575f80fd5b506102c361048a3660046120c9565b6110b9565b34801561049a575f80fd5b5061026b7f00000000000000000000000072489268f65721f5c86024d9ad00307cec844c3181565b3480156104cd575f80fd5b506102c36104dc366004611f9f565b6112c3565b3480156104ec575f80fd5b506102c36104fb366004611f9f565b61133c565b34801561050b575f80fd5b506102c3611420565b34801561051f575f80fd5b505f5461026b906001600160a01b031681565b34801561053d575f80fd5b506102c361054c366004612136565b61148e565b34801561055c575f80fd5b5061029661056b36600461218a565b60056020525f908152604090205481565b348015610587575f80fd5b50610296610596366004612082565b6115a7565b3480156105a6575f80fd5b506004546105c290600160601b900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022f565b3480156105e6575f80fd5b506102c36105f5366004611f9f565b61166c565b348015610605575f80fd5b506102c36106143660046121a1565b6116e5565b348015610624575f80fd5b5060045461022390600160a01b900460ff1681565b348015610644575f80fd5b5060015461026b906001600160a01b031681565b348015610663575f80fd5b506102c3610672366004611f9f565b6117ba565b348015610682575f80fd5b50600454610696906001600160601b031681565b6040516001600160601b03909116815260200161022f565b3480156106b9575f80fd5b506102236106c8366004611f9f565b60096020525f908152604090205460ff1681565b3480156106e7575f80fd5b506102c36106f6366004611f9f565b6118bb565b348015610706575f80fd5b5061026b7f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee281565b5f60025460011461075a5760405162461bcd60e51b8152600401610751906121e9565b60405180910390fd5b60028055610773336001600160e01b03195f3516611936565b61078f5760405162461bcd60e51b81526004016107519061220d565b5f610799856119de565b90505f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038716016108d557345f036107e15760405163259be69560e11b815260040160405180910390fd5b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561083a575f80fd5b505af115801561084c573d5f803e3d5ffd5b503498506108ab9350506001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad381691507f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee2905087611a99565b507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad389450306108f7565b34156108f457604051631cf02cf960e21b815260040160405180910390fd5b50335b610905868686843387611b27565b9250610934338787866004600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff16611ce6565b505060016002559392505050565b610957335f356001600160e01b031916611936565b6109735760405162461bcd60e51b81526004016107519061220d565b6203f4808167ffffffffffffffff1611156109a157604051631fac010160e21b815260040160405180910390fd5b6004805467ffffffffffffffff909216600160601b0267ffffffffffffffff60601b19909216919091179055565b6109e4335f356001600160e01b031916611936565b610a005760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f8181526007602090815260408083208054600160ff1991821681179092556008845282852080548216831790556009909352818420805490931617909155517fd658022b1a3aaf6ad3b3c615253712807f21a8f7bc3e4996e10618175d4afb2b9190a26040516001600160a01b038216907f79fc685a7dbabb75a67df5e69a90602cef1f19bc465b060eab1ac56685e04a13905f90a26040516001600160a01b038216907f3afb02134e37f7205acf470adc2fc4ebb70614b1599a602d069790915380e2aa905f90a250565b610aec335f356001600160e01b031916611936565b610b085760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260096020526040808220805460ff19166001179055517f3afb02134e37f7205acf470adc2fc4ebb70614b1599a602d069790915380e2aa9190a250565b610b68335f356001600160e01b031916611936565b610b845760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260096020526040808220805460ff19169055517f77cb944c14da76928795279d1519ce9150085a06e0a53c61d5a86fc4e0fd57c69190a250565b610be1335f356001600160e01b031916611936565b610bfd5760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260076020526040808220805460ff19166001179055517fd658022b1a3aaf6ad3b3c615253712807f21a8f7bc3e4996e10618175d4afb2b9190a250565b610c5d335f356001600160e01b031916611936565b610c795760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260086020526040808220805460ff19166001179055517f79fc685a7dbabb75a67df5e69a90602cef1f19bc465b060eab1ac56685e04a139190a250565b5f610cda335f356001600160e01b031916611936565b610cf65760405162461bcd60e51b81526004016107519061220d565b600254600114610d185760405162461bcd60e51b8152600401610751906121e9565b600280558773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601610d5b576040516316df5df960e31b815260040160405180910390fd5b5f610d658a6119de565b9050610d758a8a89898989611e15565b610d838a8a8a333386611b27565b9250610db2338b8b866004600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff16611ce6565b50506001600255979650505050505050565b5f610dda335f356001600160e01b031916611936565b610df65760405162461bcd60e51b81526004016107519061220d565b600454600160a01b900460ff1615610e215760405163e0f9e71d60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600360209081526040918290208251606081018452905460ff80821615158352610100820416151592820183905262010000900461ffff1692810192909252610e8b5760405163645fd19f60e11b815260040160405180910390fd5b845f03610eab57604051630ea3153160e21b815260040160405180910390fd5b604051634104b9ed60e11b81526001600160a01b038781166004830152610f61917f00000000000000000000000072489268f65721f5c86024d9ad00307cec844c319091169063820973da90602401602060405180830381865afa158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f399190612233565b86907f00000000000000000000000000000000000000000000000000000000000f4240611f6d565b915083821015610f84576040516302620f6160e61b815260040160405180910390fd5b6040516318457e6160e01b81526001600160a01b037f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee216906318457e6190610fd89086908a90879033908c9060040161224a565b5f604051808303815f87803b158015610fef575f80fd5b505af1158015611001573d5f803e3d5ffd5b50505050856001600160a01b03167fdcc60b41ff1c604459e6aa4a7299817416b19fc586a392f111646e26597c4af98660405161104091815260200190565b60405180910390a250949350505050565b611066335f356001600160e01b031916611936565b6110825760405162461bcd60e51b81526004016107519061220d565b6004805460ff60a01b191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a1565b6110ce335f356001600160e01b031916611936565b6110ea5760405162461bcd60e51b81526004016107519061220d565b806110f58342612291565b1061111357604051634c1eef1760e11b815260040160405180910390fd5b604080516001600160a01b038089166020830152871691810191909152606081018590526080810184905260a0810183905260c081018290525f9060e00160408051601f1981840301815291815281516020928301205f8b8152600590935291205490915081146111975760405163fa174ecb60e01b815260040160405180910390fd5b5f888152600560205260408120556001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146111cf57856111f1565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad385b6040516318457e6160e01b81529096506001600160a01b037f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee216906318457e6190611248908a908a908a9083908b9060040161224a565b5f604051808303815f87803b15801561125f575f80fd5b505af1158015611271573d5f803e3d5ffd5b50505050866001600160a01b0316887faf98ea774275cadfa3e477a7b52cba03e01197445a76bd5d0d561608708c3624836040516112b191815260200190565b60405180910390a35050505050505050565b6112d8335f356001600160e01b031916611936565b6112f45760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260086020526040808220805460ff19169055517f039bcf51833310242b8b7c6aa0fbabf1bf2b5e5270807ee020f1920ef200666b9190a250565b5f546001600160a01b03163314806113cd575060015460405163b700961360e01b81526001600160a01b039091169063b70096139061138e90339030906001600160e01b03195f3516906004016122a4565b602060405180830381865afa1580156113a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cd91906122d1565b6113d5575f80fd5b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b611435335f356001600160e01b031916611936565b6114515760405162461bcd60e51b81526004016107519061220d565b6004805460ff60a01b1916600160a01b1790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a1565b6114a3335f356001600160e01b031916611936565b6114bf5760405162461bcd60e51b81526004016107519061220d565b6103e861ffff821611156114e657604051636c5cde8760e01b815260040160405180910390fd5b6040805160608082018352851515808352851515602080850182815261ffff8881168789018181526001600160a01b038e165f818152600387528b902099518a549551925161ffff1990961690151561ff00191617610100921515929092029190911763ffff0000191662010000949093169390930291909117909655865193845290830191909152938101929092527fe08301321781ac43935a2099b2c3fd42de0a0ee87a519cac00e8c9cecd26ff12910160405180910390a250505050565b5f6115bd335f356001600160e01b031916611936565b6115d95760405162461bcd60e51b81526004016107519061220d565b6002546001146115fb5760405162461bcd60e51b8152600401610751906121e9565b600280555f611609866119de565b9050611619868686338786611b27565b9150856001600160a01b03167f6f9b974223f85a1ae805c33b8b519039e2435481d949db1110de151a94d587af8660405161165691815260200190565b60405180910390a2506001600255949350505050565b611681335f356001600160e01b031916611936565b61169d5760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f81815260076020526040808220805460ff19169055517fae893dda71e2eee548f8291f458cceae4bd22b56a79906928591e4420444c0e99190a250565b6001600160a01b0383165f9081526007602052604090205460ff168061172257506001600160a01b0382165f9081526008602052604090205460ff165b8061174457506001600160a01b0381165f9081526009602052604090205460ff165b1561177d57604051632821264f60e01b81526001600160a01b038085166004830152808416602483015282166044820152606401610751565b6001600160a01b0383165f908152600660205260409020544210156117b55760405163f64059db60e01b815260040160405180910390fd5b505050565b6117cf335f356001600160e01b031916611936565b6117eb5760405162461bcd60e51b81526004016107519061220d565b6001600160a01b0381165f818152600760209081526040808320805460ff199081169091556008835281842080548216905560099092528083208054909216909155517fae893dda71e2eee548f8291f458cceae4bd22b56a79906928591e4420444c0e99190a26040516001600160a01b038216907f039bcf51833310242b8b7c6aa0fbabf1bf2b5e5270807ee020f1920ef200666b905f90a26040516001600160a01b038216907f77cb944c14da76928795279d1519ce9150085a06e0a53c61d5a86fc4e0fd57c6905f90a250565b6118d0335f356001600160e01b031916611936565b6118ec5760405162461bcd60e51b81526004016107519061220d565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001545f906001600160a01b031680158015906119bd575060405163b700961360e01b81526001600160a01b0382169063b70096139061197e908790309088906004016122a4565b602060405180830381865afa158015611999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119bd91906122d1565b806119d457505f546001600160a01b038581169116145b9150505b92915050565b604080516060810182525f8082526020820181905291810191909152600454600160a01b900460ff1615611a255760405163e0f9e71d60e01b815260040160405180910390fd5b506001600160a01b0381165f908152600360209081526040918290208251606081018452905460ff8082161515808452610100830490911615159383019390935262010000900461ffff1692810192909252611a945760405163645fd19f60e11b815260040160405180910390fd5b919050565b5f60405163095ea7b360e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f511416151615611ae35750823b153d17155b80611b215760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610751565b50505050565b5f855f03611b485760405163259be69560e11b815260040160405180910390fd5b604051634104b9ed60e11b81526001600160a01b038881166004830152611bfe917f00000000000000000000000000000000000000000000000000000000000f4240917f00000000000000000000000072489268f65721f5c86024d9ad00307cec844c31169063820973da90602401602060405180830381865afa158015611bd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf69190612233565b889190611f6d565b90505f826040015161ffff1611611c155780611c38565b611c388260400151612710611c2a91906122ec565b829061ffff16612710611f6d565b905084811015611c5b5760405163097b2ad560e31b815260040160405180910390fd5b604051631ceb5d1960e11b81526001600160a01b037f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee216906339d6ba3290611caf9087908b908b908990889060040161224a565b5f604051808303815f87803b158015611cc6575f80fd5b505af1158015611cd8573d5f803e3d5ffd5b505050509695505050505050565b600480545f91908290611d01906001600160601b031661230e565b82546001600160601b039182166101009390930a838102920219161790915590508115611da557611d328242612333565b6001600160a01b038781165f81815260066020908152604091829020949094558051938401919091529087169082015260608101859052608081018490524260a082015260c0810183905260e00160408051601f1981840301815291815281516020928301205f84815260059093529120555b846001600160a01b0316866001600160a01b0316827fe96d7872363f475d18b2f5390caaa5eaa96b2d38e42c62afe4ac08ebd2b13c3a87874288604051611e05949392919093845260208401929092526040830152606082015260800190565b60405180910390a4505050505050565b60405163d505accf60e01b81523360048201526001600160a01b037f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee281166024830152604482018790526064820186905260ff8516608483015260a4820184905260c4820183905287169063d505accf9060e4015f604051808303815f87803b158015611ea0575f80fd5b505af1925050508015611eb1575060015b611f6557604051636eb1769f60e11b81523360048201526001600160a01b037f000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee28116602483015286919088169063dd62ed3e90604401602060405180830381865afa158015611f22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f469190612233565b1015611f65576040516301b8851f60e41b815260040160405180910390fd5b505050505050565b5f825f190484118302158202611f81575f80fd5b5091020490565b6001600160a01b0381168114611f9c575f80fd5b50565b5f60208284031215611faf575f80fd5b8135611fba81611f88565b9392505050565b5f805f60608486031215611fd3575f80fd5b8335611fde81611f88565b95602085013595506040909401359392505050565b5f60208284031215612003575f80fd5b813567ffffffffffffffff81168114611fba575f80fd5b5f805f805f805f60e0888a031215612030575f80fd5b873561203b81611f88565b9650602088013595506040880135945060608801359350608088013560ff81168114612065575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f805f8060808587031215612095575f80fd5b84356120a081611f88565b9350602085013592506040850135915060608501356120be81611f88565b939692955090935050565b5f805f805f805f60e0888a0312156120df575f80fd5b8735965060208801356120f181611f88565b9550604088013561210181611f88565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b8015158114611f9c575f80fd5b5f805f8060808587031215612149575f80fd5b843561215481611f88565b9350602085013561216481612129565b9250604085013561217481612129565b9150606085013561ffff811681146120be575f80fd5b5f6020828403121561219a575f80fd5b5035919050565b5f805f606084860312156121b3575f80fd5b83356121be81611f88565b925060208401356121ce81611f88565b915060408401356121de81611f88565b809150509250925092565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f60208284031215612243575f80fd5b5051919050565b6001600160a01b039586168152938516602085015260408401929092529092166060820152608081019190915260a00190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156119d8576119d861227d565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f602082840312156122e1575f80fd5b8151611fba81612129565b61ffff8281168282160390808211156123075761230761227d565b5092915050565b5f6001600160601b038083168181036123295761232961227d565b6001019392505050565b808201808211156119d8576119d861227d56fea26469706673582212209ec8f5f7b40a6a74d5dbe2b5a6bc2dd8eb04cf6bcafdbbdef38774b8dd683d1864736f6c63430008150033

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

    0000000000000000000000005f2f11ad8656439d5c14d9b351f8b09cdac2a02d000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee200000000000000000000000072489268f65721f5c86024d9ad00307cec844c31000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38

    -----Decoded View---------------
    Arg [0] : _owner (address): 0x5F2F11ad8656439d5C14d9B351f8b09cDaC2A02d
    Arg [1] : _vault (address): 0x303B726a2CA11353A8809E64e8ebAAEdE7F14EE2
    Arg [2] : _accountant (address): 0x72489268f65721f5C86024D9AD00307CeC844C31
    Arg [3] : _weth (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38

    -----Encoded View---------------
    4 Constructor Arguments found :
    Arg [0] : 0000000000000000000000005f2f11ad8656439d5c14d9b351f8b09cdac2a02d
    Arg [1] : 000000000000000000000000303b726a2ca11353a8809e64e8ebaaede7f14ee2
    Arg [2] : 00000000000000000000000072489268f65721f5c86024d9ad00307cec844c31
    Arg [3] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38


    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

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

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits
    [ 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.