Contract 0x4C153BFaD26628BdbaFECBCD160A0790b1b8F212 3

Contract Overview

Balance:
0 Ether

Token:
Txn Hash Method
Index
From
To
Value
0xfcb72c70ab9ccbe23572aa177ce6bece46e8f8eb06ea5c6da08fdef671d3662eDrip1114952021-11-20 18:53:40224 days 9 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000012120.00002
0xe5792b067014abb7e5bac9e7e5196c3d57da9401aef75e6959af3c6ce9e80f51Drain1114932021-11-20 18:50:24224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000009770.00001
0xbff01e18f787d3282f872e032c1ebb06033613a14d5c922e550441604d730d9fDrip1114582021-11-20 18:45:04224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000064760.00002
0x755f46859874296360afb152124a6db9ded73f1c5b97ee5c00af06d1da41845eDrip1114352021-11-20 18:41:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x0edf49cc61a59d090685d275df88055d6a2473fb2b491b3a9427b2eefd711dd6Drip1114332021-11-20 18:41:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xf59b34a00bfff7fb6246aa47763f0d32f67bd28d34f3e5526b0a2fc1823b7b22Drip1114312021-11-20 18:41:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xa37a237ea591a8350985a07735509e9bcf34c4be83910d14d3db638b56eccb86Drip1113922021-11-20 18:38:40224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xb2b3448fad057942d00a6163203a616ecf2765eb3721998500e397e27b46fb07Drip1113912021-11-20 18:38:40224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x0b88aef7ec5fad84f67c152e956cbd83f2f88a288c083904a21ee102f3bd61f3Drip1113862021-11-20 18:38:40224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000064760.00002
0x71fff1db34b88ab9e50199622e169b33c2f36228e7b9749b37038737fe5a7fe9Drip1112732021-11-20 18:28:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x1e619cd9ab042da7e1ae51cd4dfbbcf5487d93383e4d6ac5f25342e9a4c3bfe8Drip1112722021-11-20 18:28:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000064760.00002
0xc551408645f9c7a61d2a2b22fa8a566d0d5bb9463e31cd2f5dcc3459ea672571Drip1112132021-11-20 18:25:40224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xc9f841f9e1a944478ef9fe4deb293c56298743494b4054045628d444e43690dfDrip1112102021-11-20 18:25:40224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xf4b90419572db8baeac03c4cc4e0c38ef31ca6bb7e2349a6770ad2cc6fb94225Drip1112072021-11-20 18:25:40224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x8786134686d76f74aab7dfd9e561ad18e13ee8ce27df36a96bdfcd2670b9f3cdDrip1111872021-11-20 18:22:36224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xd5ae7c600905263afb133a371338dcaf4e3059e2ae83eaf245296dbf2bcf0794Drip1110362021-11-20 18:14:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x4a952f03e68fb94c975151870115b9cdc1e68c65da5661f193646dc3af76f428Drip1110172021-11-20 18:08:28224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xa2a1874111e03d1f04950897e6f4568873250842095cd78b4d09763da4af93a3Drip1110062021-11-20 18:03:52224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0xf6bad381f0c273ca0ba9a15ca6d340dbca368faf55d236996be3f0cc7fcc9576Drip1109722021-11-20 17:54:04224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000059760.00002
0x6c616275636ecf0f5f376a4a8ffb458be92ef588611afa4f83fb2556b29a9e59Drip1109712021-11-20 17:54:04224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000064760.00002
0x5215f2984a50bfac0cbdc27e604f9e8ea24a24403bb05126896cbcbf0c15f2a2Drip1109692021-11-20 17:54:04224 days 10 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x6b381fe5324ff13c6c484ea18bc9d4e59a7a6b4552304dd060827d91d6a3a96eDrip1109542021-11-20 17:44:24224 days 11 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000059760.00002
0xf889782a96773fae9ea75cdcdc24015681282895b605409c66db7f7303982692Drip1109532021-11-20 17:44:24224 days 11 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x546ed0936e46317ddde1d075cdeadbd9d66d0938d183e191c5f2952583285bd6Drip1109502021-11-20 17:44:24224 days 11 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000055760.00002
0x6436aa15caed2f77d177b332625027859deb269cbda76fa4853f09e04eed21d1Drip1109472021-11-20 17:44:24224 days 11 hrs ago0x4d1e1d5ccb02fe1409e131d8112234b6c1bd2011 IN  0x4c153bfad26628bdbafecbcd160a0790b1b8f2120 Ether0.0000000064760.00002
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xfcb72c70ab9ccbe23572aa177ce6bece46e8f8eb06ea5c6da08fdef671d3662e1114952021-11-20 18:53:40224 days 9 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x671edb4d7eea84c41c6fa65e977b06e3f8ee459a5 Ether
0xe5792b067014abb7e5bac9e7e5196c3d57da9401aef75e6959af3c6ce9e80f511114932021-11-20 18:50:24224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0xe5792b067014abb7e5bac9e7e5196c3d57da9401aef75e6959af3c6ce9e80f511114932021-11-20 18:50:24224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0xe5792b067014abb7e5bac9e7e5196c3d57da9401aef75e6959af3c6ce9e80f511114932021-11-20 18:50:24224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0xe5792b067014abb7e5bac9e7e5196c3d57da9401aef75e6959af3c6ce9e80f511114932021-11-20 18:50:24224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0xe5792b067014abb7e5bac9e7e5196c3d57da9401aef75e6959af3c6ce9e80f511114932021-11-20 18:50:24224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b12,435 Ether
0xbff01e18f787d3282f872e032c1ebb06033613a14d5c922e550441604d730d9f1114582021-11-20 18:45:04224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0xbff01e18f787d3282f872e032c1ebb06033613a14d5c922e550441604d730d9f1114582021-11-20 18:45:04224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0xbff01e18f787d3282f872e032c1ebb06033613a14d5c922e550441604d730d9f1114582021-11-20 18:45:04224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x402a5f0e42b0134abec851b2656f31f7ee7a0ee45 Ether
0x755f46859874296360afb152124a6db9ded73f1c5b97ee5c00af06d1da41845e1114352021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0x755f46859874296360afb152124a6db9ded73f1c5b97ee5c00af06d1da41845e1114352021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0x755f46859874296360afb152124a6db9ded73f1c5b97ee5c00af06d1da41845e1114352021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x31e42e8f93bcbf9e154c5d112b1f2af0a1f0eff35 Ether
0x0edf49cc61a59d090685d275df88055d6a2473fb2b491b3a9427b2eefd711dd61114332021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0x0edf49cc61a59d090685d275df88055d6a2473fb2b491b3a9427b2eefd711dd61114332021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0x0edf49cc61a59d090685d275df88055d6a2473fb2b491b3a9427b2eefd711dd61114332021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x31e42e8f93bcbf9e154c5d112b1f2af0a1f0eff35 Ether
0xf59b34a00bfff7fb6246aa47763f0d32f67bd28d34f3e5526b0a2fc1823b7b221114312021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0xf59b34a00bfff7fb6246aa47763f0d32f67bd28d34f3e5526b0a2fc1823b7b221114312021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0xf59b34a00bfff7fb6246aa47763f0d32f67bd28d34f3e5526b0a2fc1823b7b221114312021-11-20 18:41:52224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x31e42e8f93bcbf9e154c5d112b1f2af0a1f0eff35 Ether
0xa37a237ea591a8350985a07735509e9bcf34c4be83910d14d3db638b56eccb861113922021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0xa37a237ea591a8350985a07735509e9bcf34c4be83910d14d3db638b56eccb861113922021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0xa37a237ea591a8350985a07735509e9bcf34c4be83910d14d3db638b56eccb861113922021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x31e42e8f93bcbf9e154c5d112b1f2af0a1f0eff35 Ether
0xb2b3448fad057942d00a6163203a616ecf2765eb3721998500e397e27b46fb071113912021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
0xb2b3448fad057942d00a6163203a616ecf2765eb3721998500e397e27b46fb071113912021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xda10009cbd5d07dd0cecc66161fc93d7c9000da10 Ether
0xb2b3448fad057942d00a6163203a616ecf2765eb3721998500e397e27b46fb071113912021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f2120x31e42e8f93bcbf9e154c5d112b1f2af0a1f0eff35 Ether
0x0b88aef7ec5fad84f67c152e956cbd83f2f88a288c083904a21ee102f3bd61f31113862021-11-20 18:38:40224 days 10 hrs ago 0x4c153bfad26628bdbafecbcd160a0790b1b8f212 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultiFaucet

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at kovan-optimistic.etherscan.io on 2021-11-10
*/

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

// File: @openzeppelin/contracts/utils/Strings.sol
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * 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[EIP 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);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 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);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/interfaces/IERC20.sol
interface IERC20 {
  /// @notice ERC0 transfer tokens
  function transfer(address recipient, uint256 amount) external returns (bool);
  /// @notice ERC20 balance of address
  function balanceOf(address account) external view returns (uint256);
}

/// @title MultiFaucet
/// @author Anish Agnihotri
/// @notice Drips ETH, DAI, wETH, and mints NFTs
contract MultiFaucet is ERC721 {

    /// ============ Immutable storage ============

    /// @notice DAI ERC20 token
    IERC20 public immutable DAI;
    /// @notice wETH ERC20 token
    IERC20 public immutable WETH;
    /// @notice Number of ERC721 NFTs to mint
    uint256 public constant NFT_COUNT = 5;
    /// @notice ETH to disperse
    uint256 public constant ETH_AMOUNT = 5 ether;
    /// @notice DAI to disperse
    uint256 public constant DAI_AMOUNT = 5_000e18;
    /// @notice wETH to disperse
    uint256 public constant WETH_AMOUNT = 5e18;

    /// ============ Mutable storage ============

    /// @notice Default NFT uri
    string public URI;
    /// @notice Count of minted NFTs
    uint256 public nftsMinted;
    /// @notice Address of faucet super operator
    address public superOperator;
    /// @notice Addresses of approved faucet operators
    mapping(address => bool) public approvedOperators;

    /// ============ Modifiers ============

    /// @notice Requires sender to be contract super operator
    modifier isSuperOperator() {
        // Ensure sender is super operator
        require(msg.sender == superOperator, "Not super operator");
        _;
    }

    /// @notice Requires sender to be contract approved operator
    modifier isApprovedOperator() {
        // Ensure sender is in approved operators or is super operator
        require(
            approvedOperators[msg.sender] || superOperator == msg.sender, 
            "Not approved operator"
        );
        _;
    }

    /// ============ Events ============

    /// @notice Emitted after faucet drips to a recipient
    /// @param recipient address dripped to
    event FaucetDripped(address indexed recipient);

    /// @notice Emitted after faucet drained to a recipient
    /// @param recipient address drained to
    event FaucetDrained(address indexed recipient);

    /// @notice Emitted after operator status is updated
    /// @param operator address being updated
    /// @param status new operator status
    event OperatorUpdated(address indexed operator, bool status);

    /// @notice Emitted after super operator is updated
    /// @param old address of super operator
    /// @param operator new address of super operator
    event SuperOperatorUpdated(address indexed old, address indexed operator);

    /// ============ Constructor ============

    /// @notice Creates a new MultiFaucet contract
    /// @param _DAI address of DAI contract
    /// @param _WETH address of wETH contract
    /// @param _URI string of token URI
    constructor(address _DAI, address _WETH, string memory _URI) 
        ERC721("MultiFaucet NFT", "MFNFT") 
    {
        DAI = IERC20(_DAI);
        WETH = IERC20(_WETH);
        URI = _URI;
        superOperator = msg.sender;
    }

    /// ============ Functions ============

    /// @notice Drips and mints tokens to recipient
    /// @param _recipient to drip tokens to
    function drip(address _recipient) external isApprovedOperator {
        // Drip Ether
        (bool sent,) = _recipient.call{value: ETH_AMOUNT}("");
        require(sent, "Failed dripping ETH");

        // Drip DAI
        require(DAI.transfer(_recipient, DAI_AMOUNT), "Failed dripping DAI");

        // Drip wETH
        require(WETH.transfer(_recipient, WETH_AMOUNT), "Failed dripping wETH");

        // Mint NFTs
        for (uint256 i = 1; i <= NFT_COUNT; i++) {
            _mint(_recipient, nftsMinted + i);
        }
        nftsMinted += NFT_COUNT;

        emit FaucetDripped(_recipient);
    }

    /// @notice Returns number of available drips by token
    /// @return ethDrips — available Ether drips
    /// @return daiDrips — available DAI drips
    /// @return wethDrips — available wETH drips
    function availableDrips() public view 
        returns (uint256 ethDrips, uint256 daiDrips, uint256 wethDrips) 
    {
        ethDrips = address(this).balance / ETH_AMOUNT;
        daiDrips = DAI.balanceOf(address(this)) / DAI_AMOUNT;
        wethDrips = WETH.balanceOf(address(this)) / WETH_AMOUNT;
    }

    /// @notice Allows super operator to drain contract of tokens
    /// @param _recipient to send drained tokens to
    function drain(address _recipient) external isSuperOperator {
        // Drain all Ether
        (bool sent,) = _recipient.call{value: address(this).balance}("");
        require(sent, "Failed draining ETH");

        // Drain all DAI
        uint256 daiBalance = DAI.balanceOf(address(this));
        require(DAI.transfer(_recipient, daiBalance), "Failed draining DAI");

        // Drain all wETH
        uint256 wethBalance = WETH.balanceOf(address(this));
        require(WETH.transfer(_recipient, wethBalance), "Failed dripping wETH");

        emit FaucetDrained(_recipient);
    }

    /// @notice Allows super operator to update approved drip operator status
    /// @param _operator address to update
    /// @param _status of operator to toggle (true == allowed to drip)
    function updateApprovedOperator(address _operator, bool _status) 
        external 
        isSuperOperator 
    {
        approvedOperators[_operator] = _status;
        emit OperatorUpdated(_operator, _status);
    }

    /// @notice Allows super operator to update super operator
    /// @param _operator address to update
    function updateSuperOperator(address _operator) 
        external 
        isSuperOperator 
    {
        address old = superOperator;
        superOperator = _operator;
        emit SuperOperatorUpdated(old, superOperator);
    }

    /// @notice Override internal ERC721 function to return single image per NFT
    /// @param tokenId of ERC721 NFT
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        // OpenZeppelin check: ensure token exists
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return URI;
    }

    /// @notice Allows super operator to update NFT uri
    /// @param _URI of collection
    function updateTokenURI(string memory _URI) external isSuperOperator {
        URI = _URI;
    }

    /// @notice Allows receiving ETH
    receive() external payable {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_DAI","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"string","name":"_URI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"address","name":"recipient","type":"address"}],"name":"FaucetDrained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"FaucetDripped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"old","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"SuperOperatorUpdated","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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedOperators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableDrips","outputs":[{"internalType":"uint256","name":"ethDrips","type":"uint256"},{"internalType":"uint256","name":"daiDrips","type":"uint256"},{"internalType":"uint256","name":"wethDrips","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"drain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"drip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","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":"tokenId","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":"tokenId","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":[],"name":"superOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateApprovedOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"updateSuperOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b506040516200306b3803806200306b8339810160408190526200003491620001b0565b604080518082018252600f81526e135d5b1d1a51985d58d95d08139195608a1b602080830191825283518085019094526005845264135193919560da1b9084015281519192916200008891600091620000ed565b5080516200009e906001906020840190620000ed565b5050506001600160601b0319606084811b821660805283901b1660a0528051620000d0906006906020840190620000ed565b5050600880546001600160a01b0319163317905550620003079050565b828054620000fb90620002b4565b90600052602060002090601f0160209004810192826200011f57600085556200016a565b82601f106200013a57805160ff19168380011785556200016a565b828001600101855582156200016a579182015b828111156200016a5782518255916020019190600101906200014d565b50620001789291506200017c565b5090565b5b808211156200017857600081556001016200017d565b80516001600160a01b0381168114620001ab57600080fd5b919050565b600080600060608486031215620001c657600080fd5b620001d18462000193565b92506020620001e281860162000193565b60408601519093506001600160401b03808211156200020057600080fd5b818701915087601f8301126200021557600080fd5b8151818111156200022a576200022a620002f1565b604051601f8201601f19908116603f01168101908382118183101715620002555762000255620002f1565b816040528281528a868487010111156200026e57600080fd5b600093505b8284101562000292578484018601518185018701529285019262000273565b82841115620002a45760008684830101525b8096505050505050509250925092565b600181811c90821680620002c957607f821691505b60208210811415620002eb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c612d006200036b600039600081816104bc01528181610c460152818161118d01528181611bf50152611cd301526000818161053001528181610b720152818161105801528181611a020152611ae00152612d006000f3fe6080604052600436106101c65760003560e01c806377caec8d116100f7578063ad5c464811610095578063e0bab4c411610064578063e0bab4c41461051e578063e985e9c514610552578063ece53132146105a8578063ff721aba146105c857600080fd5b8063ad5c4648146104aa578063b88d4fde146104de578063c14033ba146103ee578063c87b56dd146104fe57600080fd5b806395d89b41116100d157806395d89b411461042857806398cd61531461043d578063998748b31461045d578063a22cb4651461048a57600080fd5b806377caec8d146103ce57806383464e22146103ee578063929398f51461040a57600080fd5b80633a891d3b116101645780636352211e1161013e5780636352211e1461035957806367a5cd06146103795780636e99fddf1461039957806370a08231146103ae57600080fd5b80633a891d3b146102f557806342842e0e1461031557806360df19e01461033557600080fd5b8063095ea7b3116101a0578063095ea7b31461026e5780631141d7de1461029057806323b872dd146102a557806324cf0771146102c557600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc1461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed3660046129ba565b6105f8565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6106dd565b6040516101fe9190612b23565b34801561023557600080fd5b50610249610244366004612a3d565b61076f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561027a57600080fd5b5061028e610289366004612973565b61084e565b005b34801561029c57600080fd5b5061021c6109db565b3480156102b157600080fd5b5061028e6102c0366004612884565b610a69565b3480156102d157600080fd5b506102da610b0a565b604080519384526020840192909252908201526060016101fe565b34801561030157600080fd5b5061028e61031036600461282f565b610cd1565b34801561032157600080fd5b5061028e610330366004612884565b610dc9565b34801561034157600080fd5b5061034b60075481565b6040519081526020016101fe565b34801561036557600080fd5b50610249610374366004612a3d565b610de4565b34801561038557600080fd5b5061028e61039436600461282f565b610e96565b3480156103a557600080fd5b5061034b600581565b3480156103ba57600080fd5b5061034b6103c936600461282f565b611301565b3480156103da57600080fd5b5061028e6103e936600461293c565b6113cf565b3480156103fa57600080fd5b5061034b674563918244f4000081565b34801561041657600080fd5b5061034b69010f0cf064dd5920000081565b34801561043457600080fd5b5061021c6114da565b34801561044957600080fd5b5061028e6104583660046129f4565b6114e9565b34801561046957600080fd5b506008546102499073ffffffffffffffffffffffffffffffffffffffff1681565b34801561049657600080fd5b5061028e6104a536600461293c565b611581565b3480156104b657600080fd5b506102497f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ea57600080fd5b5061028e6104f93660046128c0565b611698565b34801561050a57600080fd5b5061021c610519366004612a3d565b611740565b34801561052a57600080fd5b506102497f000000000000000000000000000000000000000000000000000000000000000081565b34801561055e57600080fd5b506101f261056d366004612851565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105b457600080fd5b5061028e6105c336600461282f565b611886565b3480156105d457600080fd5b506101f26105e336600461282f565b60096020526000908152604090205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061068b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106d757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080546106ec90612ba0565b80601f016020809104026020016040519081016040528092919081815260200182805461071890612ba0565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061085982610de4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161081c565b3373ffffffffffffffffffffffffffffffffffffffff821614806109405750610940813361056d565b6109cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161081c565b6109d68383611dfe565b505050565b600680546109e890612ba0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1490612ba0565b8015610a615780601f10610a3657610100808354040283529160200191610a61565b820191906000526020600020905b815481529060010190602001808311610a4457829003601f168201915b505050505081565b610a733382611e9e565b610aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161081c565b6109d683838361200e565b60008080610b20674563918244f4000047612b4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935069010f0cf064dd592000009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bec9190612a56565b610bf69190612b4e565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909250674563918244f400009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610c8857600080fd5b505afa158015610c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc09190612a56565b610cca9190612b4e565b9050909192565b60085473ffffffffffffffffffffffffffffffffffffffff163314610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f74207375706572206f70657261746f720000000000000000000000000000604482015260640161081c565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fa54ed2c79346f09f07a1eca5171ee4aaa02f18a4eb359995c0e529940259f9bf90600090a35050565b6109d683838360405180602001604052806000815250611698565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161081c565b3360009081526009602052604090205460ff1680610ecb575060085473ffffffffffffffffffffffffffffffffffffffff1633145b610f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420617070726f766564206f70657261746f720000000000000000000000604482015260640161081c565b60008173ffffffffffffffffffffffffffffffffffffffff16674563918244f4000060405160006040518083038185875af1925050503d8060008114610f93576040519150601f19603f3d011682016040523d82523d6000602084013e610f98565b606091505b5050905080611003576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4661696c6564206472697070696e672045544800000000000000000000000000604482015260640161081c565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015269010f0cf064dd5920000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561109c57600080fd5b505af11580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d4919061299d565b61113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4661696c6564206472697070696e672044414900000000000000000000000000604482015260640161081c565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152674563918244f4000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b1580156111d157600080fd5b505af11580156111e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611209919061299d565b61126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c6564206472697070696e672077455448000000000000000000000000604482015260640161081c565b60015b600581116112a357611291838260075461128c9190612b36565b612275565b8061129b81612bf4565b915050611272565b506005600760008282546112b79190612b36565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f15b77122e87b6c2a7a9afcd86d718fe489828e6fd4d686aef3b823179ab04dbf90600090a25050565b600073ffffffffffffffffffffffffffffffffffffffff82166113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161081c565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60085473ffffffffffffffffffffffffffffffffffffffff163314611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f74207375706572206f70657261746f720000000000000000000000000000604482015260640161081c565b73ffffffffffffffffffffffffffffffffffffffff821660008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d910160405180910390a25050565b6060600180546106ec90612ba0565b60085473ffffffffffffffffffffffffffffffffffffffff16331461156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f74207375706572206f70657261746f720000000000000000000000000000604482015260640161081c565b805161157d9060069060208401906126d9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216331415611601576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161081c565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116a23383611e9e565b61172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161081c565b61173a84848484612437565b50505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff166117f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161081c565b6006805461180190612ba0565b80601f016020809104026020016040519081016040528092919081815260200182805461182d90612ba0565b801561187a5780601f1061184f5761010080835404028352916020019161187a565b820191906000526020600020905b81548152906001019060200180831161185d57829003601f168201915b50505050509050919050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f74207375706572206f70657261746f720000000000000000000000000000604482015260640161081c565b60008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611961576040519150601f19603f3d011682016040523d82523d6000602084013e611966565b606091505b50509050806119d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4661696c656420647261696e696e672045544800000000000000000000000000604482015260640161081c565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611a5957600080fd5b505afa158015611a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a919190612a56565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b158015611b2657600080fd5b505af1158015611b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5e919061299d565b611bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4661696c656420647261696e696e672044414900000000000000000000000000604482015260640161081c565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611c4c57600080fd5b505afa158015611c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c849190612a56565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b158015611d1957600080fd5b505af1158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d51919061299d565b611db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c6564206472697070696e672077455448000000000000000000000000604482015260640161081c565b60405173ffffffffffffffffffffffffffffffffffffffff8516907f7c8fc2d32492ea30dc289f81f32ebd6e1bcb12644f56039a3a274a924decc4a190600090a250505050565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611e5882610de4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16611f4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161081c565b6000611f5a83610de4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc957508373ffffffffffffffffffffffffffffffffffffffff16611fb18461076f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612006575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661202e82610de4565b73ffffffffffffffffffffffffffffffffffffffff16146120d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161081c565b73ffffffffffffffffffffffffffffffffffffffff8216612173576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161081c565b61217e600082611dfe565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054600192906121b4908490612b89565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906121ef908490612b36565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff82166122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161081c565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161081c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906123b4908490612b36565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61244284848461200e565b61244e848484846124da565b61173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161081c565b600073ffffffffffffffffffffffffffffffffffffffff84163b156126ce576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612551903390899088908890600401612ada565b602060405180830381600087803b15801561256b57600080fd5b505af19250505080156125b9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526125b6918101906129d7565b60015b612683573d8080156125e7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ec565b606091505b50805161267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161081c565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612006565b506001949350505050565b8280546126e590612ba0565b90600052602060002090601f016020900481019282612707576000855561274d565b82601f1061272057805160ff191683800117855561274d565b8280016001018555821561274d579182015b8281111561274d578251825591602001919060010190612732565b5061275992915061275d565b5090565b5b80821115612759576000815560010161275e565b600067ffffffffffffffff8084111561278d5761278d612c5c565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156127d3576127d3612c5c565b816040528093508581528686860111156127ec57600080fd5b858560208301376000602087830101525050509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461282a57600080fd5b919050565b60006020828403121561284157600080fd5b61284a82612806565b9392505050565b6000806040838503121561286457600080fd5b61286d83612806565b915061287b60208401612806565b90509250929050565b60008060006060848603121561289957600080fd5b6128a284612806565b92506128b060208501612806565b9150604084013590509250925092565b600080600080608085870312156128d657600080fd5b6128df85612806565b93506128ed60208601612806565b925060408501359150606085013567ffffffffffffffff81111561291057600080fd5b8501601f8101871361292157600080fd5b61293087823560208401612772565b91505092959194509250565b6000806040838503121561294f57600080fd5b61295883612806565b9150602083013561296881612c8b565b809150509250929050565b6000806040838503121561298657600080fd5b61298f83612806565b946020939093013593505050565b6000602082840312156129af57600080fd5b815161284a81612c8b565b6000602082840312156129cc57600080fd5b813561284a81612c9c565b6000602082840312156129e957600080fd5b815161284a81612c9c565b600060208284031215612a0657600080fd5b813567ffffffffffffffff811115612a1d57600080fd5b8201601f81018413612a2e57600080fd5b61200684823560208401612772565b600060208284031215612a4f57600080fd5b5035919050565b600060208284031215612a6857600080fd5b5051919050565b6000815180845260005b81811015612a9557602081850181015186830182015201612a79565b81811115612aa7576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b196080830184612a6f565b9695505050505050565b60208152600061284a6020830184612a6f565b60008219821115612b4957612b49612c2d565b500190565b600082612b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082821015612b9b57612b9b612c2d565b500390565b600181811c90821680612bb457607f821691505b60208210811415612bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c2657612c26612c2d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114612c9957600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612c9957600080fdfea2646970667358221220e5783d01d170388ae9b2a48069699ce420a976a56bb022a2d0176264722836aa64736f6c63430008070033000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bc6f6b680bc61e30db47721c6d1c5cde19c1300d0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e696f2f697066732f62616679626569656b6c37797636683773663367723333736764616663647134666d636561343737726e777a796372626935766e673665347a6a6900000000000000000000000000000000

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

000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bc6f6b680bc61e30db47721c6d1c5cde19c1300d0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e696f2f697066732f62616679626569656b6c37797636683773663367723333736764616663647134666d636561343737726e777a796372626935766e673665347a6a6900000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _DAI (address): 0xda10009cbd5d07dd0cecc66161fc93d7c9000da1
Arg [1] : _WETH (address): 0xbc6f6b680bc61e30db47721c6d1c5cde19c1300d
Arg [2] : _URI (string): https://ipfs.io/ipfs/bafybeiekl7yv6h7sf3gr33sgdafcdq4fmcea477rnwzycrbi5vng6e4zji

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1
Arg [1] : 000000000000000000000000bc6f6b680bc61e30db47721c6d1c5cde19c1300d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f62616679626569656b6c37
Arg [5] : 797636683773663367723333736764616663647134666d636561343737726e77
Arg [6] : 7a796372626935766e673665347a6a6900000000000000000000000000000000


Deployed ByteCode Sourcemap

32920:6344:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20398:305;;;;;;;;;;-1:-1:-1;20398:305:0;;;;;:::i;:::-;;:::i;:::-;;;6491:14:1;;6484:22;6466:41;;6454:2;6439:18;20398:305:0;;;;;;;;21343:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22902:221::-;;;;;;;;;;-1:-1:-1;22902:221:0;;;;;:::i;:::-;;:::i;:::-;;;5453:42:1;5441:55;;;5423:74;;5411:2;5396:18;22902:221:0;5277:226:1;22425:411:0;;;;;;;;;;-1:-1:-1;22425:411:0;;;;;:::i;:::-;;:::i;:::-;;33582:17;;;;;;;;;;;;;:::i;23792:339::-;;;;;;;;;;-1:-1:-1;23792:339:0;;;;;:::i;:::-;;:::i;36784:311::-;;;;;;;;;;;;;:::i;:::-;;;;15424:25:1;;;15480:2;15465:18;;15458:34;;;;15508:18;;;15501:34;15412:2;15397:18;36784:311:0;15222:319:1;38367:237:0;;;;;;;;;;-1:-1:-1;38367:237:0;;;;;:::i;:::-;;:::i;24202:185::-;;;;;;;;;;-1:-1:-1;24202:185:0;;;;;:::i;:::-;;:::i;33644:25::-;;;;;;;;;;;;;;;;;;;15186::1;;;15174:2;15159:18;33644:25:0;15040:177:1;21037:239:0;;;;;;;;;;-1:-1:-1;21037:239:0;;;;;:::i;:::-;;:::i;35938:624::-;;;;;;;;;;-1:-1:-1;35938:624:0;;;;;:::i;:::-;;:::i;33198:37::-;;;;;;;;;;;;33234:1;33198:37;;20767:208;;;;;;;;;;-1:-1:-1;20767:208:0;;;;;:::i;:::-;;:::i;38027:224::-;;;;;;;;;;-1:-1:-1;38027:224:0;;;;;:::i;:::-;;:::i;33445:42::-;;;;;;;;;;;;33483:4;33445:42;;33359:45;;;;;;;;;;;;33396:8;33359:45;;21512:104;;;;;;;;;;;;;:::i;39088:98::-;;;;;;;;;;-1:-1:-1;39088:98:0;;;;;:::i;:::-;;:::i;33726:28::-;;;;;;;;;;-1:-1:-1;33726:28:0;;;;;;;;23195:295;;;;;;;;;;-1:-1:-1;23195:295:0;;;;;:::i;:::-;;:::i;33116:28::-;;;;;;;;;;;;;;;24458:328;;;;;;;;;;-1:-1:-1;24458:328:0;;;;;:::i;:::-;;:::i;38732:256::-;;;;;;;;;;-1:-1:-1;38732:256:0;;;;;:::i;:::-;;:::i;33048:27::-;;;;;;;;;;;;;;;23561:164;;;;;;;;;;-1:-1:-1;23561:164:0;;;;;:::i;:::-;23682:25;;;;23658:4;23682:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23561:164;37223:601;;;;;;;;;;-1:-1:-1;37223:601:0;;;;;:::i;:::-;;:::i;33817:49::-;;;;;;;;;;-1:-1:-1;33817:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20398:305;20500:4;20537:40;;;20552:25;20537:40;;:105;;-1:-1:-1;20594:48:0;;;20609:33;20594:48;20537:105;:158;;;-1:-1:-1;13609:25:0;13594:40;;;;20659:36;20517:178;20398:305;-1:-1:-1;;20398:305:0:o;21343:100::-;21397:13;21430:5;21423:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21343:100;:::o;22902:221::-;22978:7;26385:16;;;:7;:16;;;;;;:30;:16;22998:73;;;;;;;12485:2:1;22998:73:0;;;12467:21:1;12524:2;12504:18;;;12497:30;12563:34;12543:18;;;12536:62;12634:14;12614:18;;;12607:42;12666:19;;22998:73:0;;;;;;;;;-1:-1:-1;23091:24:0;;;;:15;:24;;;;;;;;;22902:221::o;22425:411::-;22506:13;22522:23;22537:7;22522:14;:23::i;:::-;22506:39;;22570:5;22564:11;;:2;:11;;;;22556:57;;;;;;;13724:2:1;22556:57:0;;;13706:21:1;13763:2;13743:18;;;13736:30;13802:34;13782:18;;;13775:62;13873:3;13853:18;;;13846:31;13894:19;;22556:57:0;13522:397:1;22556:57:0;2779:10;22648:21;;;;;:62;;-1:-1:-1;22673:37:0;22690:5;2779:10;23561:164;:::i;22673:37::-;22626:168;;;;;;;10182:2:1;22626:168:0;;;10164:21:1;10221:2;10201:18;;;10194:30;10260:34;10240:18;;;10233:62;10331:26;10311:18;;;10304:54;10375:19;;22626:168:0;9980:420:1;22626:168:0;22807:21;22816:2;22820:7;22807:8;:21::i;:::-;22495:341;22425:411;;:::o;33582:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23792:339::-;23987:41;2779:10;24020:7;23987:18;:41::i;:::-;23979:103;;;;;;;14126:2:1;23979:103:0;;;14108:21:1;14165:2;14145:18;;;14138:30;14204:34;14184:18;;;14177:62;14275:19;14255:18;;;14248:47;14312:19;;23979:103:0;13924:413:1;23979:103:0;24095:28;24105:4;24111:2;24115:7;24095:9;:28::i;36784:311::-;36841:16;;;36924:34;33312:7;36924:21;:34;:::i;:::-;36980:28;;;;;37002:4;36980:28;;;5423:74:1;36913:45:0;;-1:-1:-1;33396:8:0;;36980:13;:3;:13;;;;5396:18:1;;36980:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;37044:29;;;;;37067:4;37044:29;;;5423:74:1;36969:52:0;;-1:-1:-1;33483:4:0;;37044:14;:4;:14;;;;5396:18:1;;37044:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;37032:55;;36784:311;;;:::o;38367:237::-;34089:13;;;;34075:10;:27;34067:58;;;;;;;7538:2:1;34067:58:0;;;7520:21:1;7577:2;7557:18;;;7550:30;7616:20;7596:18;;;7589:48;7654:18;;34067:58:0;7336:342:1;34067:58:0;38491:13:::1;::::0;;::::1;38515:25:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;38556:40:::1;::::0;38491:13;::::1;::::0;38515:25;38491:13;;38556:40:::1;::::0;38477:11:::1;::::0;38556:40:::1;38466:138;38367:237:::0;:::o;24202:185::-;24340:39;24357:4;24363:2;24367:7;24340:39;;;;;;;;;;;;:16;:39::i;21037:239::-;21109:7;21145:16;;;:7;:16;;;;;;;;21180:19;21172:73;;;;;;;11018:2:1;21172:73:0;;;11000:21:1;11057:2;11037:18;;;11030:30;11096:34;11076:18;;;11069:62;11167:11;11147:18;;;11140:39;11196:19;;21172:73:0;10816:405:1;35938:624:0;34372:10;34354:29;;;;:17;:29;;;;;;;;;:60;;-1:-1:-1;34387:13:0;;:27;:13;34404:10;34387:27;34354:60;34332:132;;;;;;;14892:2:1;34332:132:0;;;14874:21:1;14931:2;14911:18;;;14904:30;14970:23;14950:18;;;14943:51;15011:18;;34332:132:0;14690:345:1;34332:132:0;36035:9:::1;36049:10;:15;;33312:7;36049:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36034:53;;;36106:4;36098:36;;;::::0;::::1;::::0;;14544:2:1;36098:36:0::1;::::0;::::1;14526:21:1::0;14583:2;14563:18;;;14556:30;14622:21;14602:18;;;14595:49;14661:18;;36098:36:0::1;14342:343:1::0;36098:36:0::1;36176;::::0;;;;:12:::1;6216:55:1::0;;;36176:36:0::1;::::0;::::1;6198:74:1::0;33396:8:0::1;6288:18:1::0;;;6281:34;36176:3:0::1;:12;::::0;::::1;::::0;6171:18:1;;36176:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36168:68;;;::::0;::::1;::::0;;12137:2:1;36168:68:0::1;::::0;::::1;12119:21:1::0;12176:2;12156:18;;;12149:30;12215:21;12195:18;;;12188:49;12254:18;;36168:68:0::1;11935:343:1::0;36168:68:0::1;36279:38;::::0;;;;:13:::1;6216:55:1::0;;;36279:38:0::1;::::0;::::1;6198:74:1::0;33483:4:0::1;6288:18:1::0;;;6281:34;36279:4:0::1;:13;::::0;::::1;::::0;6171:18:1;;36279:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36271:71;;;::::0;::::1;::::0;;9833:2:1;36271:71:0::1;::::0;::::1;9815:21:1::0;9872:2;9852:18;;;9845:30;9911:22;9891:18;;;9884:50;9951:18;;36271:71:0::1;9631:344:1::0;36271:71:0::1;36394:1;36377:101;33234:1;36397;:14;36377:101;;36433:33;36439:10;36464:1;36451:10;;:14;;;;:::i;:::-;36433:5;:33::i;:::-;36413:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36377:101;;;;33234:1;36488:10;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36529:25:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;36000:562;35938:624:::0;:::o;20767:208::-;20839:7;20867:19;;;20859:74;;;;;;;10607:2:1;20859:74:0;;;10589:21:1;10646:2;10626:18;;;10619:30;10685:34;10665:18;;;10658:62;10756:12;10736:18;;;10729:40;10786:19;;20859:74:0;10405:406:1;20859:74:0;-1:-1:-1;20951:16:0;;;;;;:9;:16;;;;;;;20767:208::o;38027:224::-;34089:13;;;;34075:10;:27;34067:58;;;;;;;7538:2:1;34067:58:0;;;7520:21:1;7577:2;7557:18;;;7550:30;7616:20;7596:18;;;7589:48;7654:18;;34067:58:0;7336:342:1;34067:58:0;38154:28:::1;::::0;::::1;;::::0;;;:17:::1;:28;::::0;;;;;;;;:38;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;38208:35;;6466:41:1;;;38208:35:0::1;::::0;6439:18:1;38208:35:0::1;;;;;;;38027:224:::0;;:::o;21512:104::-;21568:13;21601:7;21594:14;;;;;:::i;39088:98::-;34089:13;;;;34075:10;:27;34067:58;;;;;;;7538:2:1;34067:58:0;;;7520:21:1;7577:2;7557:18;;;7550:30;7616:20;7596:18;;;7589:48;7654:18;;34067:58:0;7336:342:1;34067:58:0;39168:10;;::::1;::::0;:3:::1;::::0;:10:::1;::::0;::::1;::::0;::::1;:::i;:::-;;39088:98:::0;:::o;23195:295::-;23298:24;;;2779:10;23298:24;;23290:62;;;;;;;9066:2:1;23290:62:0;;;9048:21:1;9105:2;9085:18;;;9078:30;9144:27;9124:18;;;9117:55;9189:18;;23290:62:0;8864:349:1;23290:62:0;2779:10;23365:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;23434:48;;6466:41:1;;;23365:42:0;;2779:10;23434:48;;6439:18:1;23434:48:0;;;;;;;23195:295;;:::o;24458:328::-;24633:41;2779:10;24666:7;24633:18;:41::i;:::-;24625:103;;;;;;;14126:2:1;24625:103:0;;;14108:21:1;14165:2;14145:18;;;14138:30;14204:34;14184:18;;;14177:62;14275:19;14255:18;;;14248:47;14312:19;;24625:103:0;13924:413:1;24625:103:0;24739:39;24753:4;24759:2;24763:7;24772:5;24739:13;:39::i;:::-;24458:328;;;;:::o;38732:256::-;26361:4;26385:16;;;:7;:16;;;;;;38805:13;;26385:30;:16;38883:76;;;;;;;13308:2:1;38883:76:0;;;13290:21:1;13347:2;13327:18;;;13320:30;13386:34;13366:18;;;13359:62;13457:17;13437:18;;;13430:45;13492:19;;38883:76:0;13106:411:1;38883:76:0;38977:3;38970:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38732:256;;;:::o;37223:601::-;34089:13;;;;34075:10;:27;34067:58;;;;;;;7538:2:1;34067:58:0;;;7520:21:1;7577:2;7557:18;;;7550:30;7616:20;7596:18;;;7589:48;7654:18;;34067:58:0;7336:342:1;34067:58:0;37323:9:::1;37337:10;:15;;37360:21;37337:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37322:64;;;37405:4;37397:36;;;::::0;::::1;::::0;;7190:2:1;37397:36:0::1;::::0;::::1;7172:21:1::0;7229:2;7209:18;;;7202:30;7268:21;7248:18;;;7241:49;7307:18;;37397:36:0::1;6988:343:1::0;37397:36:0::1;37493:28;::::0;;;;37515:4:::1;37493:28;::::0;::::1;5423:74:1::0;37472:18:0::1;::::0;37493:3:::1;:13;;::::0;::::1;::::0;5396:18:1;;37493:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37540:36;::::0;;;;:12:::1;6216:55:1::0;;;37540:36:0::1;::::0;::::1;6198:74:1::0;6288:18;;;6281:34;;;37472:49:0;;-1:-1:-1;37540:3:0::1;:12:::0;;::::1;::::0;::::1;::::0;6171:18:1;;37540:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37532:68;;;::::0;::::1;::::0;;11428:2:1;37532:68:0::1;::::0;::::1;11410:21:1::0;11467:2;11447:18;;;11440:30;11506:21;11486:18;;;11479:49;11545:18;;37532:68:0::1;11226:343:1::0;37532:68:0::1;37662:29;::::0;;;;37685:4:::1;37662:29;::::0;::::1;5423:74:1::0;37640:19:0::1;::::0;37662:4:::1;:14;;::::0;::::1;::::0;5396:18:1;;37662:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37710:38;::::0;;;;:13:::1;6216:55:1::0;;;37710:38:0::1;::::0;::::1;6198:74:1::0;6288:18;;;6281:34;;;37640:51:0;;-1:-1:-1;37710:4:0::1;:13:::0;;::::1;::::0;::::1;::::0;6171:18:1;;37710:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37702:71;;;::::0;::::1;::::0;;9833:2:1;37702:71:0::1;::::0;::::1;9815:21:1::0;9872:2;9852:18;;;9845:30;9911:22;9891:18;;;9884:50;9951:18;;37702:71:0::1;9631:344:1::0;37702:71:0::1;37791:25;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;37283:541;;;37223:601:::0;:::o;30278:174::-;30353:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;30407:23;30353:24;30407:14;:23::i;:::-;30398:46;;;;;;;;;;;;30278:174;;:::o;26590:348::-;26683:4;26385:16;;;:7;:16;;;;;;:30;:16;26700:73;;;;;;;9420:2:1;26700:73:0;;;9402:21:1;9459:2;9439:18;;;9432:30;9498:34;9478:18;;;9471:62;9569:14;9549:18;;;9542:42;9601:19;;26700:73:0;9218:408:1;26700:73:0;26784:13;26800:23;26815:7;26800:14;:23::i;:::-;26784:39;;26853:5;26842:16;;:7;:16;;;:51;;;;26886:7;26862:31;;:20;26874:7;26862:11;:20::i;:::-;:31;;;26842:51;:87;;;-1:-1:-1;23682:25:0;;;;23658:4;23682:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26897:32;26834:96;26590:348;-1:-1:-1;;;;26590:348:0:o;29582:578::-;29741:4;29714:31;;:23;29729:7;29714:14;:23::i;:::-;:31;;;29706:85;;;;;;;12898:2:1;29706:85:0;;;12880:21:1;12937:2;12917:18;;;12910:30;12976:34;12956:18;;;12949:62;13047:11;13027:18;;;13020:39;13076:19;;29706:85:0;12696:405:1;29706:85:0;29810:16;;;29802:65;;;;;;;8661:2:1;29802:65:0;;;8643:21:1;8700:2;8680:18;;;8673:30;8739:34;8719:18;;;8712:62;8810:6;8790:18;;;8783:34;8834:19;;29802:65:0;8459:400:1;29802:65:0;29984:29;30001:1;30005:7;29984:8;:29::i;:::-;30026:15;;;;;;;:9;:15;;;;;:20;;30045:1;;30026:15;:20;;30045:1;;30026:20;:::i;:::-;;;;-1:-1:-1;;30057:13:0;;;;;;;:9;:13;;;;;:18;;30074:1;;30057:13;:18;;30074:1;;30057:18;:::i;:::-;;;;-1:-1:-1;;30086:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;30125:27;;30086:16;;30125:27;;;;;;;29582:578;;;:::o;28274:382::-;28354:16;;;28346:61;;;;;;;11776:2:1;28346:61:0;;;11758:21:1;;;11795:18;;;11788:30;11854:34;11834:18;;;11827:62;11906:18;;28346:61:0;11574:356:1;28346:61:0;26361:4;26385:16;;;:7;:16;;;;;;:30;:16;:30;28418:58;;;;;;;8304:2:1;28418:58:0;;;8286:21:1;8343:2;8323:18;;;8316:30;8382;8362:18;;;8355:58;8430:18;;28418:58:0;8102:352:1;28418:58:0;28547:13;;;;;;;:9;:13;;;;;:18;;28564:1;;28547:13;:18;;28564:1;;28547:18;:::i;:::-;;;;-1:-1:-1;;28576:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;28615:33;;28576:16;;;28615:33;;28576:16;;28615:33;28274:382;;:::o;25668:315::-;25825:28;25835:4;25841:2;25845:7;25825:9;:28::i;:::-;25872:48;25895:4;25901:2;25905:7;25914:5;25872:22;:48::i;:::-;25864:111;;;;;;;7885:2:1;25864:111:0;;;7867:21:1;7924:2;7904:18;;;7897:30;7963:34;7943:18;;;7936:62;8034:20;8014:18;;;8007:48;8072:19;;25864:111:0;7683:414:1;31017:799:0;31172:4;31193:13;;;3969:20;4017:8;31189:620;;31229:72;;;;;:36;;;;;;:72;;2779:10;;31280:4;;31286:7;;31295:5;;31229:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31229:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31225:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31471:13:0;;31467:272;;31514:60;;;;;7885:2:1;31514:60:0;;;7867:21:1;7924:2;7904:18;;;7897:30;7963:34;7943:18;;;7936:62;8034:20;8014:18;;;8007:48;8072:19;;31514:60:0;7683:414:1;31467:272:0;31689:6;31683:13;31674:6;31670:2;31666:15;31659:38;31225:529;31352:51;;31362:41;31352:51;;-1:-1:-1;31345:58:0;;31189:620;-1:-1:-1;31793:4:0;31017:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;194:66;339:24;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:72;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:45;;;591:1;588;581:12;550:45;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;14:690;;;;;:::o;709:196::-;777:20;;837:42;826:54;;816:65;;806:93;;895:1;892;885:12;806:93;709:196;;;:::o;910:186::-;969:6;1022:2;1010:9;1001:7;997:23;993:32;990:52;;;1038:1;1035;1028:12;990:52;1061:29;1080:9;1061:29;:::i;:::-;1051:39;910:186;-1:-1:-1;;;910:186:1:o;1101:260::-;1169:6;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:52;;;1246:1;1243;1236:12;1198:52;1269:29;1288:9;1269:29;:::i;:::-;1259:39;;1317:38;1351:2;1340:9;1336:18;1317:38;:::i;:::-;1307:48;;1101:260;;;;;:::o;1366:328::-;1443:6;1451;1459;1512:2;1500:9;1491:7;1487:23;1483:32;1480:52;;;1528:1;1525;1518:12;1480:52;1551:29;1570:9;1551:29;:::i;:::-;1541:39;;1599:38;1633:2;1622:9;1618:18;1599:38;:::i;:::-;1589:48;;1684:2;1673:9;1669:18;1656:32;1646:42;;1366:328;;;;;:::o;1699:666::-;1794:6;1802;1810;1818;1871:3;1859:9;1850:7;1846:23;1842:33;1839:53;;;1888:1;1885;1878:12;1839:53;1911:29;1930:9;1911:29;:::i;:::-;1901:39;;1959:38;1993:2;1982:9;1978:18;1959:38;:::i;:::-;1949:48;;2044:2;2033:9;2029:18;2016:32;2006:42;;2099:2;2088:9;2084:18;2071:32;2126:18;2118:6;2115:30;2112:50;;;2158:1;2155;2148:12;2112:50;2181:22;;2234:4;2226:13;;2222:27;-1:-1:-1;2212:55:1;;2263:1;2260;2253:12;2212:55;2286:73;2351:7;2346:2;2333:16;2328:2;2324;2320:11;2286:73;:::i;:::-;2276:83;;;1699:666;;;;;;;:::o;2370:315::-;2435:6;2443;2496:2;2484:9;2475:7;2471:23;2467:32;2464:52;;;2512:1;2509;2502:12;2464:52;2535:29;2554:9;2535:29;:::i;:::-;2525:39;;2614:2;2603:9;2599:18;2586:32;2627:28;2649:5;2627:28;:::i;:::-;2674:5;2664:15;;;2370:315;;;;;:::o;2690:254::-;2758:6;2766;2819:2;2807:9;2798:7;2794:23;2790:32;2787:52;;;2835:1;2832;2825:12;2787:52;2858:29;2877:9;2858:29;:::i;:::-;2848:39;2934:2;2919:18;;;;2906:32;;-1:-1:-1;;;2690:254:1:o;2949:245::-;3016:6;3069:2;3057:9;3048:7;3044:23;3040:32;3037:52;;;3085:1;3082;3075:12;3037:52;3117:9;3111:16;3136:28;3158:5;3136:28;:::i;3199:245::-;3257:6;3310:2;3298:9;3289:7;3285:23;3281:32;3278:52;;;3326:1;3323;3316:12;3278:52;3365:9;3352:23;3384:30;3408:5;3384:30;:::i;3449:249::-;3518:6;3571:2;3559:9;3550:7;3546:23;3542:32;3539:52;;;3587:1;3584;3577:12;3539:52;3619:9;3613:16;3638:30;3662:5;3638:30;:::i;3703:450::-;3772:6;3825:2;3813:9;3804:7;3800:23;3796:32;3793:52;;;3841:1;3838;3831:12;3793:52;3881:9;3868:23;3914:18;3906:6;3903:30;3900:50;;;3946:1;3943;3936:12;3900:50;3969:22;;4022:4;4014:13;;4010:27;-1:-1:-1;4000:55:1;;4051:1;4048;4041:12;4000:55;4074:73;4139:7;4134:2;4121:16;4116:2;4112;4108:11;4074:73;:::i;4158:180::-;4217:6;4270:2;4258:9;4249:7;4245:23;4241:32;4238:52;;;4286:1;4283;4276:12;4238:52;-1:-1:-1;4309:23:1;;4158:180;-1:-1:-1;4158:180:1:o;4343:184::-;4413:6;4466:2;4454:9;4445:7;4441:23;4437:32;4434:52;;;4482:1;4479;4472:12;4434:52;-1:-1:-1;4505:16:1;;4343:184;-1:-1:-1;4343:184:1:o;4532:530::-;4573:3;4611:5;4605:12;4638:6;4633:3;4626:19;4663:1;4673:162;4687:6;4684:1;4681:13;4673:162;;;4749:4;4805:13;;;4801:22;;4795:29;4777:11;;;4773:20;;4766:59;4702:12;4673:162;;;4853:6;4850:1;4847:13;4844:87;;;4919:1;4912:4;4903:6;4898:3;4894:16;4890:27;4883:38;4844:87;-1:-1:-1;4976:2:1;4964:15;4981:66;4960:88;4951:98;;;;5051:4;4947:109;;4532:530;-1:-1:-1;;4532:530:1:o;5508:511::-;5702:4;5731:42;5812:2;5804:6;5800:15;5789:9;5782:34;5864:2;5856:6;5852:15;5847:2;5836:9;5832:18;5825:43;;5904:6;5899:2;5888:9;5884:18;5877:34;5947:3;5942:2;5931:9;5927:18;5920:31;5968:45;6008:3;5997:9;5993:19;5985:6;5968:45;:::i;:::-;5960:53;5508:511;-1:-1:-1;;;;;;5508:511:1:o;6764:219::-;6913:2;6902:9;6895:21;6876:4;6933:44;6973:2;6962:9;6958:18;6950:6;6933:44;:::i;15546:128::-;15586:3;15617:1;15613:6;15610:1;15607:13;15604:39;;;15623:18;;:::i;:::-;-1:-1:-1;15659:9:1;;15546:128::o;15679:274::-;15719:1;15745;15735:189;;15780:77;15777:1;15770:88;15881:4;15878:1;15871:15;15909:4;15906:1;15899:15;15735:189;-1:-1:-1;15938:9:1;;15679:274::o;15958:125::-;15998:4;16026:1;16023;16020:8;16017:34;;;16031:18;;:::i;:::-;-1:-1:-1;16068:9:1;;15958:125::o;16088:437::-;16167:1;16163:12;;;;16210;;;16231:61;;16285:4;16277:6;16273:17;16263:27;;16231:61;16338:2;16330:6;16327:14;16307:18;16304:38;16301:218;;;16375:77;16372:1;16365:88;16476:4;16473:1;16466:15;16504:4;16501:1;16494:15;16301:218;;16088:437;;;:::o;16530:195::-;16569:3;16600:66;16593:5;16590:77;16587:103;;;16670:18;;:::i;:::-;-1:-1:-1;16717:1:1;16706:13;;16530:195::o;16730:184::-;16782:77;16779:1;16772:88;16879:4;16876:1;16869:15;16903:4;16900:1;16893:15;16919:184;16971:77;16968:1;16961:88;17068:4;17065:1;17058:15;17092:4;17089:1;17082:15;17108:118;17194:5;17187:13;17180:21;17173:5;17170:32;17160:60;;17216:1;17213;17206:12;17160:60;17108:118;:::o;17231:177::-;17316:66;17309:5;17305:78;17298:5;17295:89;17285:117;;17398:1;17395;17388:12

Swarm Source

ipfs://e5783d01d170388ae9b2a48069699ce420a976a56bb022a2d0176264722836aa
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading