ETH Price: $2,245.60 (+6.58%)

Contract

0xcF8ecdcBdb7A8A8574A8F71D4818C77b1f74Cf6e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Build And Enter ...119361072021-02-27 0:24:371463 days ago1614385477IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.24032797106
Build And Enter ...119361072021-02-27 0:24:371463 days ago1614385477IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.24032797106
Build And Enter ...105889092020-08-03 20:11:221670 days ago1596485482IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.0027555
Build And Enter ...102596772020-06-13 21:00:381721 days ago1592082038IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.0323643714.2
Build And Enter ...100404702020-05-10 19:59:091755 days ago1589140749IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.0250709911
Build And Enter ...100013202020-05-04 18:21:421761 days ago1588616502IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.016546857.26
Build And Enter ...99522392020-04-27 3:59:191769 days ago1587959959IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.017549697.7
Build And Enter ...99477432020-04-26 11:05:311769 days ago1587899131IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.0250709911
Build And Enter ...99327772020-04-24 3:31:511772 days ago1587699111IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.012535495.5
Build And Enter ...99222712020-04-22 12:26:361773 days ago1587558396IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.019304668.47000025
Build And Enter ...99186032020-04-21 22:49:351774 days ago1587509375IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.007521293.3
Build And Enter ...99051372020-04-19 21:02:401776 days ago1587330160IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.005014192.2
Build And Enter ...99005482020-04-19 4:09:351777 days ago1587269375IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.015270516.7
Build And Enter ...98780082020-04-15 16:11:091780 days ago1586967069IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.013789046.05000025
Build And Enter ...98766592020-04-15 11:13:471780 days ago1586949227IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.012535495.5
Build And Enter ...98674762020-04-14 1:10:061782 days ago1586826606IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.008022713.52
Build And Enter ...98593832020-04-12 19:17:111783 days ago1586719031IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.005014192.2
Build And Enter ...98422022020-04-10 3:45:351786 days ago1586490335IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.015042596.6
Build And Enter ...98404352020-04-09 21:24:001786 days ago1586467440IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.00108391.1
Build And Enter ...98381842020-04-09 13:09:121786 days ago1586437752IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.015042596.6
Build And Enter ...98364612020-04-09 6:34:451786 days ago1586414085IN
0xcF8ecdcB...b1f74Cf6e
0 ETH0.0077723.41

Latest 22 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
119361072021-02-27 0:24:371463 days ago1614385477
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
119361072021-02-27 0:24:371463 days ago1614385477
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
102596772020-06-13 21:00:381721 days ago1592082038
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
100404702020-05-10 19:59:091755 days ago1589140749
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
100013202020-05-04 18:21:421761 days ago1588616502
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99522392020-04-27 3:59:191769 days ago1587959959
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99477432020-04-26 11:05:311769 days ago1587899131
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99327772020-04-24 3:31:511772 days ago1587699111
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99222712020-04-22 12:26:361773 days ago1587558396
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99186032020-04-21 22:49:351774 days ago1587509375
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99051372020-04-19 21:02:401776 days ago1587330160
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
99005482020-04-19 4:09:351777 days ago1587269375
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98780082020-04-15 16:11:091780 days ago1586967069
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98766592020-04-15 11:13:471780 days ago1586949227
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98674762020-04-14 1:10:061782 days ago1586826606
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98593832020-04-12 19:17:111783 days ago1586719031
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98422022020-04-10 3:45:351786 days ago1586490335
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98404352020-04-09 21:24:001786 days ago1586467440
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98381842020-04-09 13:09:121786 days ago1586437752
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98364612020-04-09 6:34:451786 days ago1586414085
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98360932020-04-09 5:16:031787 days ago1586409363
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
98360932020-04-09 5:16:031787 days ago1586409363
0xcF8ecdcB...b1f74Cf6e
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DACProxyFactory

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-04-09
*/

// File: src/lib/BytesLib.sol

pragma solidity 0.5.16;

// https://github.com/GNSPS/solidity-bytes-utils/blob/b1b22d1e9c4de64defb811f4c65a391630f220d7/contracts/BytesLib.sol

contract BytesLibLite {
    // A lite version of the ByteLib, containing only the "slice" function we need

    function sliceToEnd(
        bytes memory _bytes,
        uint256 _start
    ) internal pure returns (bytes memory) {
        require(_start < _bytes.length, "bytes-read-out-of-bounds");

        return slice(
            _bytes,
            _start,
            _bytes.length - _start
        );
    }
    
    function slice(
        bytes memory _bytes,
        uint256 _start,
        uint256 _length
    )
        internal
        pure
        returns (bytes memory)
    {
        require(_bytes.length >= (_start + _length), "bytes-read-out-of-bounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function bytesToAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
        require(_bytes.length >= (_start + 20), "Read out of bounds");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }
}

// File: src/interfaces/IERC20.sol

pragma solidity 0.5.16;

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.5.5;

/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

// File: src/interfaces/ISafeERC20.sol

pragma solidity 0.5.16;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: src/interfaces/aave/IFlashLoanReceiver.sol

pragma solidity 0.5.16;

/**
* @title IFlashLoanReceiver interface
* @notice Interface for the Aave fee IFlashLoanReceiver.
* @author Aave
* @dev implement this interface to develop a flashloan-compatible flashLoanReceiver contract
**/
interface IFlashLoanReceiver {
    function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external;
}

// File: src/interfaces/aave/ILendingPoolAddressesProvider.sol

pragma solidity 0.5.16;

/**
@title ILendingPoolAddressesProvider interface
@notice provides the interface to fetch the LendingPoolCore address
 */

contract ILendingPoolAddressesProvider {

    function getLendingPool() public view returns (address);
    function setLendingPoolImpl(address _pool) public;

    function getLendingPoolCore() public view returns (address payable);
    function setLendingPoolCoreImpl(address _lendingPoolCore) public;

    function getLendingPoolConfigurator() public view returns (address);
    function setLendingPoolConfiguratorImpl(address _configurator) public;

    function getLendingPoolDataProvider() public view returns (address);
    function setLendingPoolDataProviderImpl(address _provider) public;

    function getLendingPoolParametersProvider() public view returns (address);
    function setLendingPoolParametersProviderImpl(address _parametersProvider) public;

    function getTokenDistributor() public view returns (address);
    function setTokenDistributor(address _tokenDistributor) public;

    function getFeeProvider() public view returns (address);
    function setFeeProviderImpl(address _feeProvider) public;

    function getLendingPoolLiquidationManager() public view returns (address);
    function setLendingPoolLiquidationManager(address _manager) public;

    function getLendingPoolManager() public view returns (address);
    function setLendingPoolManager(address _lendingPoolManager) public;

    function getPriceOracle() public view returns (address);
    function setPriceOracle(address _priceOracle) public;

    function getLendingRateOracle() public view returns (address);
    function setLendingRateOracle(address _lendingRateOracle) public;

}

// File: src/lib/aave/FlashLoanReceiverBase.sol

pragma solidity 0.5.16;





contract FlashLoanReceiverBase is IFlashLoanReceiver {
    using SafeMath for uint256;

    address constant ETHADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    ILendingPoolAddressesProvider public addressesProvider = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);

    function () external payable {    }

    function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {
        address payable core = addressesProvider.getLendingPoolCore();
        transferInternal(core,_reserve, _amount);
    }

    function transferInternal(address payable _destination, address _reserve, uint256  _amount) internal {
        if(_reserve == ETHADDRESS) {
            //solium-disable-next-line
            _destination.call.value(_amount)("");
            return;
        }

        IERC20(_reserve).transfer(_destination, _amount);
    }

    function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
        if(_reserve == ETHADDRESS) {

            return _target.balance;
        }

        return IERC20(_reserve).balanceOf(_target);
    }
}

// File: src/lib/dapphub/Auth.sol

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.16;

contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) public view returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    constructor() public {
        owner = msg.sender;
        emit LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        public
        auth
    {
        owner = owner_;
        emit LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        public
        auth
    {
        authority = authority_;
        emit LogSetAuthority(address(authority));
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig), "ds-auth-unauthorized");
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (address(authority) == address(0)) {
            return false;
        } else {
            return authority.canCall(src, address(this), sig);
        }
    }
}

// File: src/lib/dapphub/Note.sol

/// note.sol -- the `note' modifier, for logging calls as events

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.16;

contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
        uint256           wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;
        uint256 wad;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
            wad := callvalue
        }

        emit LogNote(msg.sig, msg.sender, foo, bar, wad, msg.data);

        _;
    }
}

// File: src/lib/dapphub/Proxy.sol

// proxy.sol - execute actions atomically through the proxy's identity

// Copyright (C) 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity >=0.5.0 <0.6.0;



// DSProxy
// Allows code execution using a persistant identity This can be very
// useful to execute a sequence of atomic actions. Since the owner of
// the proxy can be changed, this allows for dynamic ownership models
// i.e. a multisig
contract DSProxy is DSAuth, DSNote {
    DSProxyCache public cache;  // global cache for contracts

    constructor(address _cacheAddr) public {
        setCache(_cacheAddr);
    }

    function() external payable {
    }

    // use the proxy to execute calldata _data on contract _code
    function execute(bytes memory _code, bytes memory _data)
        public
        payable
        returns (address target, bytes memory response)
    {
        target = cache.read(_code);
        if (target == address(0)) {
            // deploy contract & store its address in cache
            target = cache.write(_code);
        }

        response = execute(target, _data);
    }

    function execute(address _target, bytes memory _data)
        public
        auth
        note
        payable
        returns (bytes memory response)
    {
        require(_target != address(0), "ds-proxy-target-address-required");

        // call contract in current context
        assembly {
            let succeeded := delegatecall(sub(gas, 5000), _target, add(_data, 0x20), mload(_data), 0, 0)
            let size := returndatasize

            response := mload(0x40)
            mstore(0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f))))
            mstore(response, size)
            returndatacopy(add(response, 0x20), 0, size)

            switch iszero(succeeded)
            case 1 {
                // throw if delegatecall failed
                revert(add(response, 0x20), size)
            }
        }
    }

    //set new cache
    function setCache(address _cacheAddr)
        public
        auth
        note
        returns (bool)
    {
        require(_cacheAddr != address(0), "ds-proxy-cache-address-required");
        cache = DSProxyCache(_cacheAddr);  // overwrite cache
        return true;
    }
}

// DSProxyFactory
// This factory deploys new proxy instances through build()
// Deployed proxy addresses are logged
contract DSProxyFactory {
    event Created(address indexed sender, address indexed owner, address proxy, address cache);
    mapping(address=>address) public proxies;
    DSProxyCache public cache;

    constructor() public {
        cache = new DSProxyCache();
    }

    // deploys a new proxy instance
    // sets owner of proxy to caller
    function build() public returns (address payable proxy) {
        proxy = build(msg.sender);
    }

    // deploys a new proxy instance
    // sets custom owner of proxy
    function build(address owner) public returns (address payable proxy) {
        proxy = address(new DSProxy(address(cache)));
        emit Created(msg.sender, owner, address(proxy), address(cache));
        DSProxy(proxy).setOwner(owner);
        proxies[owner] = proxy;
    }
}

// DSProxyCache
// This global cache stores addresses of contracts previously deployed
// by a proxy. This saves gas from repeat deployment of the same
// contracts and eliminates blockchain bloat.

// By default, all proxies deployed from the same factory store
// contracts in the same cache. The cache a proxy instance uses can be
// changed.  The cache uses the sha3 hash of a contract's bytecode to
// lookup the address
contract DSProxyCache {
    mapping(bytes32 => address) cache;

    function read(bytes memory _code) public view returns (address) {
        bytes32 hash = keccak256(_code);
        return cache[hash];
    }

    function write(bytes memory _code) public returns (address target) {
        assembly {
            target := create(0, add(_code, 0x20), mload(_code))
            switch iszero(extcodesize(target))
            case 1 {
                // throw if contract failed to deploy
                revert(0, 0)
            }
        }
        bytes32 hash = keccak256(_code);
        cache[hash] = target;
    }
}

// File: src/proxies/DACProxy.sol

/*
    Main contract to handle Aave flashloans on Compound Finance.
    (D)edge's (A)ave (C)ommon Proxy.
*/

pragma solidity 0.5.16;
pragma experimental ABIEncoderV2;





contract DACProxy is
    DSProxy(address(1)),
    FlashLoanReceiverBase,
    BytesLibLite
{
    // TODO: Change this value
    address payable constant protocolFeePayoutAddress1 = 0x773CCbFB422850617A5680D40B1260422d072f41;
    address payable constant protocolFeePayoutAddress2 = 0xAbcCB8f0a3c206Bb0468C52CCc20f3b81077417B;

    constructor(address _cacheAddr) public {
        setCache(_cacheAddr);
    }

    function() external payable {}

    // This is for Aave flashloans
    function executeOperation(
        address _reserve,
        uint256 _amount,
        uint256 _fee,
        bytes calldata _params
    ) external
        auth
    {
        // Assumes that once the action(s) are performed
        // we will have totalDebt would of _reserve to repay
        // aave and the protocol
        uint protocolFee = _fee.div(2);

        // Re-encodes new data 
        // Function signature should conform to:
        /* (
                // Note: for address, as abiEncoder pads it to 32 bytes our starting position is 12
                // due to addresses having 20 bytes in length
                address     - Address to call        | start: 12;  (20 bytes)
                bytes       - Function sig           | start: 32;  (4 bytes)
                uint        - Data of _amount        | start: 36;  (32 bytes)
                uint        - Data of _aaveFee       | start: 68;  (32 bytes)
                uint        - Data of _protocolFee   | start: 100; (32 bytes)
                bytes       - Data of _data          | start: 132; (dynamic length)
            )

            i.e.

            function myFunction(
                uint amount,
                uint aaveFee,
                uint protocolFee,
                bytes memory _data
            ) { ... }
        */
        address targetAddress = bytesToAddress(_params, 12);
        bytes memory fSig     = slice(_params, 32, 4);
        bytes memory data     = sliceToEnd(_params, 132);

        // Re-encodes function signature and injects new
        // _amount, _fee, and _protocolFee into _data
        bytes memory newData = abi.encodePacked(
            fSig,
            abi.encode(_amount),
            abi.encode(_fee),
            abi.encode(protocolFee),
            data
        );

        // Executes new target
        execute(targetAddress, newData);

        // Repays protocol fee
        if (_reserve == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
            protocolFeePayoutAddress1.call.value(protocolFee.div(2))("");
            protocolFeePayoutAddress2.call.value(protocolFee.div(2))("");
        } else {
            IERC20(_reserve).transfer(protocolFeePayoutAddress1, protocolFee.div(2));
            IERC20(_reserve).transfer(protocolFeePayoutAddress2, protocolFee.div(2));
        }

        // Repays aave
        transferFundsBackToPoolInternal(_reserve, _amount.add(_fee));
    }
}

// File: src/lib/dapphub/Guard.sol

// guard.sol -- simple whitelist implementation of DSAuthority

// Copyright (C) 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.16;


contract DSGuardEvents {
    event LogPermit(
        bytes32 indexed src,
        bytes32 indexed dst,
        bytes32 indexed sig
    );

    event LogForbid(
        bytes32 indexed src,
        bytes32 indexed dst,
        bytes32 indexed sig
    );
}

contract DSGuard is DSAuth, DSAuthority, DSGuardEvents {
    bytes32 constant public ANY = bytes32(uint(-1));

    mapping (bytes32 => mapping (bytes32 => mapping (bytes32 => bool))) acl;

    function canCall(
        address src_, address dst_, bytes4 sig
    ) public view returns (bool) {
        bytes32 src = bytes32(bytes20(src_));
        bytes32 dst = bytes32(bytes20(dst_));

        return acl[src][dst][sig]
            || acl[src][dst][ANY]
            || acl[src][ANY][sig]
            || acl[src][ANY][ANY]
            || acl[ANY][dst][sig]
            || acl[ANY][dst][ANY]
            || acl[ANY][ANY][sig]
            || acl[ANY][ANY][ANY];
    }

    function permit(bytes32 src, bytes32 dst, bytes32 sig) public auth {
        acl[src][dst][sig] = true;
        emit LogPermit(src, dst, sig);
    }

    function forbid(bytes32 src, bytes32 dst, bytes32 sig) public auth {
        acl[src][dst][sig] = false;
        emit LogForbid(src, dst, sig);
    }

    function permit(address src, address dst, bytes32 sig) public {
        permit(bytes32(bytes20(src)), bytes32(bytes20(dst)), sig);
    }
    function forbid(address src, address dst, bytes32 sig) public {
        forbid(bytes32(bytes20(src)), bytes32(bytes20(dst)), sig);
    }

}

contract DSGuardFactory {
    mapping (address => bool)  public  isGuard;

    function newGuard() public returns (DSGuard guard) {
        guard = new DSGuard();
        guard.setOwner(msg.sender);
        isGuard[address(guard)] = true;
    }
}

// File: src/interfaces/compound/IComptroller.sol

pragma solidity 0.5.16;

interface IComptroller {
    /**
     * @notice Marker function used for light validation when updating the comptroller of a market
     * @dev Implementations should simply return true.
     * @return true
     */
    function isComptroller() external view returns (bool);

    /*** Assets You Are In ***/

    function enterMarkets(address[] calldata cTokens) external returns (uint[] memory);
    function exitMarket(address cToken) external returns (uint);

    /*** Policy Hooks ***/

    function getAccountLiquidity(address account) external view returns (uint, uint, uint);
    function getAssetsIn(address account) external view returns (address[] memory);

    function mintAllowed(address cToken, address minter, uint mintAmount) external returns (uint);
    function mintVerify(address cToken, address minter, uint mintAmount, uint mintTokens) external;

    function redeemAllowed(address cToken, address redeemer, uint redeemTokens) external returns (uint);
    function redeemVerify(address cToken, address redeemer, uint redeemAmount, uint redeemTokens) external;

    function borrowAllowed(address cToken, address borrower, uint borrowAmount) external returns (uint);
    function borrowVerify(address cToken, address borrower, uint borrowAmount) external;

    function repayBorrowAllowed(
        address cToken,
        address payer,
        address borrower,
        uint repayAmount) external returns (uint);
    function repayBorrowVerify(
        address cToken,
        address payer,
        address borrower,
        uint repayAmount,
        uint borrowerIndex) external;

    function liquidateBorrowAllowed(
        address cTokenBorrowed,
        address cTokenCollateral,
        address liquidator,
        address borrower,
        uint repayAmount) external returns (uint);
    function liquidateBorrowVerify(
        address cTokenBorrowed,
        address cTokenCollateral,
        address liquidator,
        address borrower,
        uint repayAmount,
        uint seizeTokens) external;

    function seizeAllowed(
        address cTokenCollateral,
        address cTokenBorrowed,
        address liquidator,
        address borrower,
        uint seizeTokens) external returns (uint);
    function seizeVerify(
        address cTokenCollateral,
        address cTokenBorrowed,
        address liquidator,
        address borrower,
        uint seizeTokens) external;

    function transferAllowed(address cToken, address src, address dst, uint transferTokens) external returns (uint);
    function transferVerify(address cToken, address src, address dst, uint transferTokens) external;

    /*** Liquidity/Liquidation Calculations ***/

    function liquidateCalculateSeizeTokens(
        address cTokenBorrowed,
        address cTokenCollateral,
        uint repayAmount) external view returns (uint, uint);
}

// File: src/proxies/DACProxyFactory.sol

pragma solidity 0.5.16;




contract DACProxyFactory {
    event Created(address indexed sender, address indexed owner, address proxy, address cache);

    mapping(address=>address) public proxies;

    DSProxyCache public cache;
    DSGuardFactory public dsGuardFactory;

    constructor() public {
        cache = new DSProxyCache();
        dsGuardFactory = new DSGuardFactory();
    }

    // deploys a new proxy instance
    // sets owner of proxy to caller
    function build() public returns (address payable proxy) {
        proxy = build(msg.sender);
    }

    // deploys a new proxy instance
    // creates a new guard
    // sets custom owner of proxy
    function build(address owner) public returns (address payable) {
        // If user already has a proxy build, return that instead
        if (proxies[owner] != address(0)) {
            return address(uint160(proxies[owner]));
        }

        address payable proxy = address(new DACProxy(address(cache)));
        emit Created(msg.sender, owner, address(proxy), address(cache));

        DSGuard guard = dsGuardFactory.newGuard();
        guard.setOwner(proxy);  // Guard belongs to proxy

        DACProxy(proxy).setAuthority(guard);
        DACProxy(proxy).setOwner(owner);

        proxies[owner] = proxy;

        return proxy;
    }

    // Compound-specific code to enter markets upon proxy creation
    // So user has to perform less TX
    function buildAndEnterMarkets(
        address dedgeCompoundManager,
        bytes memory enterMarketCalldata
    ) public returns (address payable) {
        return buildAndEnterMarkets(msg.sender, dedgeCompoundManager, enterMarketCalldata);
    }

    function buildAndEnterMarkets(
        address owner,
        address dedgeCompoundManager,
        bytes memory enterMarketCalldata
    ) public returns (address payable) {
        // If user already has a proxy build, return that instead
        if (proxies[owner] != address(0)) {
            return address(uint160(proxies[owner]));
        }

        address payable proxy = address(new DACProxy(address(cache)));
        emit Created(msg.sender, owner, address(proxy), address(cache));

        DSGuard guard = dsGuardFactory.newGuard();
        guard.setOwner(proxy);  // Guard belongs to proxy

        // Enter markets via proxy
        DACProxy(proxy).execute(
            dedgeCompoundManager,
            enterMarketCalldata
        );

        DACProxy(proxy).setAuthority(guard);
        DACProxy(proxy).setOwner(owner);

        proxies[owner] = proxy;

        return proxy;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"cache","type":"address"}],"name":"Created","type":"event"},{"constant":false,"inputs":[],"name":"build","outputs":[{"internalType":"address payable","name":"proxy","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"build","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"dedgeCompoundManager","type":"address"},{"internalType":"bytes","name":"enterMarketCalldata","type":"bytes"}],"name":"buildAndEnterMarkets","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dedgeCompoundManager","type":"address"},{"internalType":"bytes","name":"enterMarketCalldata","type":"bytes"}],"name":"buildAndEnterMarkets","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cache","outputs":[{"internalType":"contract DSProxyCache","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dsGuardFactory","outputs":[{"internalType":"contract DSGuardFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proxies","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5060405161001d906100a8565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055604051610066906100b5565b604051809103906000f080158015610082573d6000803e3d6000fd5b50600280546001600160a01b0319166001600160a01b03929092169190911790556100c2565b610267806126e783390190565b610cb78061294e83390190565b612616806100d16000396000f3fe60806040523480156200001157600080fd5b5060043610620000885760003560e01c80638e1a55fc11620000635780638e1a55fc14620000df578063c455279114620000e9578063ddd2d6ac1462000100578063f3701da214620001175762000088565b80632e5c9848146200008d57806360c7d29514620000af5780636456568b14620000b9575b600080fd5b620000976200012e565b604051620000a6919062000a83565b60405180910390f35b620000976200013d565b620000d0620000ca3660046200089a565b6200014c565b604051620000a6919062000a20565b620000d06200049a565b620000d0620000fa36600462000871565b620004ac565b620000d06200011136600462000907565b620004c7565b620000d06200012836600462000871565b620004df565b6002546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b03838116600090815260208190526040812054909116156200019157506001600160a01b038084166000908152602081905260409020541662000493565b6001546040516000916001600160a01b031690620001af90620007a0565b620001bb919062000a20565b604051809103906000f080158015620001d8573d6000803e3d6000fd5b506001546040519192506001600160a01b038088169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620002239287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002ad919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af403590620002de90859060040162000a30565b600060405180830381600087803b158015620002f957600080fd5b505af11580156200030e573d6000803e3d6000fd5b5050604051631cff79cd60e01b81526001600160a01b0385169250631cff79cd915062000342908890889060040162000a5f565b600060405180830381600087803b1580156200035d57600080fd5b505af115801562000372573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200039c91908101906200095f565b50604051637a9e5e4b60e01b81526001600160a01b03831690637a9e5e4b90620003cb90849060040162000a83565b600060405180830381600087803b158015620003e657600080fd5b505af1158015620003fb573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200042d90899060040162000a20565b600060405180830381600087803b1580156200044857600080fd5b505af11580156200045d573d6000803e3d6000fd5b505050506001600160a01b03868116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b9392505050565b6000620004a733620004df565b905090565b6000602081905290815260409020546001600160a01b031681565b6000620004d63384846200014c565b90505b92915050565b6001600160a01b03818116600090815260208190526040812054909116156200052457506001600160a01b03808216600090815260208190526040902054166200079b565b6001546040516000916001600160a01b0316906200054290620007a0565b6200054e919062000a20565b604051809103906000f0801580156200056b573d6000803e3d6000fd5b506001546040519192506001600160a01b038086169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620005b69287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000640919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af4035906200067190859060040162000a30565b600060405180830381600087803b1580156200068c57600080fd5b505af1158015620006a1573d6000803e3d6000fd5b5050604051637a9e5e4b60e01b81526001600160a01b0385169250637a9e5e4b9150620006d390849060040162000a83565b600060405180830381600087803b158015620006ee57600080fd5b505af115801562000703573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200073590879060040162000a20565b600060405180830381600087803b1580156200075057600080fd5b505af115801562000765573d6000803e3d6000fd5b505050506001600160a01b03848116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b919050565b611a418062000b9383390190565b8035620004d98162000b6d565b600082601f830112620007cd57600080fd5b8135620007e4620007de8262000abb565b62000a93565b915080825260208301602083018583830111156200080157600080fd5b6200080e83828462000b24565b50505092915050565b600082601f8301126200082957600080fd5b81516200083a620007de8262000abb565b915080825260208301602083018583830111156200085757600080fd5b6200080e83828462000b30565b8051620004d98162000b87565b6000602082840312156200088457600080fd5b6000620008928484620007ae565b949350505050565b600080600060608486031215620008b057600080fd5b6000620008be8686620007ae565b9350506020620008d186828701620007ae565b925050604084013567ffffffffffffffff811115620008ef57600080fd5b620008fd86828701620007bb565b9150509250925092565b600080604083850312156200091b57600080fd5b6000620009298585620007ae565b925050602083013567ffffffffffffffff8111156200094757600080fd5b6200095585828601620007bb565b9150509250929050565b6000602082840312156200097257600080fd5b815167ffffffffffffffff8111156200098a57600080fd5b620008928482850162000817565b600060208284031215620009ab57600080fd5b600062000892848462000864565b620009c48162000b17565b82525050565b620009c48162000af1565b6000620009e28262000ae4565b620009ee818562000ae8565b935062000a0081856020860162000b30565b62000a0b8162000b63565b9093019392505050565b620009c48162000afe565b60208101620004d98284620009ca565b60208101620004d98284620009b9565b6040810162000a508285620009b9565b620004936020830184620009ca565b6040810162000a6f8285620009ca565b8181036020830152620008928184620009d5565b60208101620004d9828462000a15565b60405181810167ffffffffffffffff8111828210171562000ab357600080fd5b604052919050565b600067ffffffffffffffff82111562000ad357600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000620004d98262000b0b565b6000620004d98262000af1565b6001600160a01b031690565b6000620004d98262000afe565b82818337506000910152565b60005b8381101562000b4d57818101518382015260200162000b33565b8381111562000b5d576000848401525b50505050565b601f01601f191690565b62000b788162000af1565b811462000b8457600080fd5b50565b62000b788162000afe56fe6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c81790553480156200003757600080fd5b5060405162001a4138038062001a418339810160408190526200005a91620002a3565b600180546001600160a01b0319163390811782556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a2620000ab816001600160e01b03620000ca16565b50620000c29050816001600160e01b03620000ca16565b5050620004ae565b6000620000ec336001600160e01b03198335166001600160e01b036200019f16565b620001145760405162461bcd60e51b81526004016200010b90620003ea565b60405180910390fd5b60405160043590602435903490829084903390600080356001600160e01b031916916200014591879136906200040e565b60405180910390a46001600160a01b038516620001765760405162461bcd60e51b81526004016200010b90620003fc565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b60006001600160a01b038316301415620001bc5750600162000283565b6001546001600160a01b0384811691161415620001dc5750600162000283565b6000546001600160a01b0316620001f65750600062000283565b60005460405163b700961360e01b81526001600160a01b039091169063b7009613906200022c90869030908790600401620003bc565b60206040518083038186803b1580156200024557600080fd5b505afa1580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002809190810190620002cc565b90505b92915050565b8051620002838162000489565b80516200028381620004a3565b600060208284031215620002b657600080fd5b6000620002c4848462000289565b949350505050565b600060208284031215620002df57600080fd5b6000620002c4848462000296565b620002f88162000445565b82525050565b620002f88162000457565b60006200031783856200043c565b93506200032683858462000473565b62000331836200047f565b9093019392505050565b60006200034a6014836200043c565b7f64732d617574682d756e617574686f72697a6564000000000000000000000000815260200192915050565b600062000385601f836200043c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b620002f88162000470565b60608101620003cc8286620002ed565b620003db6020830185620002ed565b620002c46040830184620002fe565b6020808252810162000283816200033b565b60208082528101620002838162000376565b604081016200041e8286620003b1565b81810360208301526200043381848662000309565b95945050505050565b90815260200190565b6000620002838262000464565b151590565b6001600160e01b03191690565b6001600160a01b031690565b90565b82818337506000910152565b601f01601f191690565b620004948162000445565b8114620004a057600080fd5b50565b620004948162000452565b61158380620004be6000396000f3fe6080604052600436106100915760003560e01c80638da5cb5b116100595780638da5cb5b1461013f578063948f507614610161578063bf7e214f1461018e578063c72c4d10146101a3578063ee872558146101b857610091565b806313af4035146100935780631cff79cd146100b35780631f6a1eb9146100dc57806360c7d295146100fd5780637a9e5e4b1461011f575b005b34801561009f57600080fd5b506100916100ae366004610f07565b6101d8565b6100c66100c1366004610f4b565b610263565b6040516100d39190611372565b60405180910390f35b6100ef6100ea366004611039565b610347565b6040516100d3929190611344565b34801561010957600080fd5b50610112610475565b6040516100d39190611383565b34801561012b57600080fd5b5061009161013a36600461106f565b610484565b34801561014b57600080fd5b50610154610502565b6040516100d391906112f3565b34801561016d57600080fd5b5061018161017c366004610f07565b610511565b6040516100d39190611364565b34801561019a57600080fd5b506101126105cb565b3480156101af57600080fd5b506101126105da565b3480156101c457600080fd5b506100916101d3366004610f9d565b6105e9565b6101ee336000356001600160e01b031916610a21565b6102135760405162461bcd60e51b815260040161020a90611391565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b606061027b336000356001600160e01b031916610a21565b6102975760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b031916916102c691879136906113ff565b60405180910390a46001600160a01b0386166102f45760405162461bcd60e51b815260040161020a906113c1565b600080865160208801896113885a03f43d6040519550601f19601f6020830101168601604052808652806000602088013e8115600181146103345761033b565b8160208801fd5b50505050505092915050565b6002546040516322fd145760e21b81526000916060916001600160a01b0390911690638bf4515c9061037d908790600401611372565b60206040518083038186803b15801561039557600080fd5b505afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103cd9190810190610f2d565b91506001600160a01b03821661046257600254604051633f6861d960e11b81526001600160a01b0390911690637ed0c3b29061040d908790600401611372565b602060405180830381600087803b15801561042757600080fd5b505af115801561043b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061045f9190810190610f2d565b91505b61046c8284610263565b90509250929050565b6002546001600160a01b031681565b61049a336000356001600160e01b031916610a21565b6104b65760405162461bcd60e51b815260040161020a90611391565b600080546001600160a01b0319166001600160a01b03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b6001546001600160a01b031681565b6000610529336000356001600160e01b031916610a21565b6105455760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b0319169161057491879136906113ff565b60405180910390a46001600160a01b0385166105a25760405162461bcd60e51b815260040161020a906113e1565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b6000546001600160a01b031681565b6003546001600160a01b031681565b6105ff336000356001600160e01b031916610a21565b61061b5760405162461bcd60e51b815260040161020a90611391565b600061062e84600263ffffffff610aff16565b9050600061067484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600c9250610b41915050565b905060606106bd85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506020925060049150610b779050565b9050606061070386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060849250610c0c915050565b90506060828960405160200161071991906113f1565b6040516020818303038152906040528960405160200161073991906113f1565b6040516020818303038152906040528760405160200161075991906113f1565b60408051601f198184030181529082905261077b9493929187906020016112a1565b60405160208183030381529060405290506107968482610263565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038b1614156108b15773773ccbfb422850617a5680d40b1260422d072f416107e286600263ffffffff610aff16565b6040516107ee906112e8565b60006040518083038185875af1925050503d806000811461082b576040519150601f19603f3d011682016040523d82523d6000602084013e610830565b606091505b5073abccb8f0a3c206bb0468c52ccc20f3b81077417b915061085b905086600263ffffffff610aff16565b604051610867906112e8565b60006040518083038185875af1925050503d80600081146108a4576040519150601f19603f3d011682016040523d82523d6000602084013e6108a9565b606091505b5050506109fc565b6001600160a01b038a1663a9059cbb73773ccbfb422850617a5680d40b1260422d072f416108e688600263ffffffff610aff16565b6040518363ffffffff1660e01b8152600401610903929190611301565b602060405180830381600087803b15801561091d57600080fd5b505af1158015610931573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610955919081019061101b565b506001600160a01b038a1663a9059cbb73abccb8f0a3c206bb0468c52ccc20f3b81077417b61098b88600263ffffffff610aff16565b6040518363ffffffff1660e01b81526004016109a8929190611301565b602060405180830381600087803b1580156109c257600080fd5b505af11580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109fa919081019061101b565b505b610a158a610a108b8b63ffffffff610c3c16565b610c61565b50505050505050505050565b60006001600160a01b038316301415610a3c57506001610af9565b6001546001600160a01b0384811691161415610a5a57506001610af9565b6000546001600160a01b0316610a7257506000610af9565b60005460405163b700961360e01b81526001600160a01b039091169063b700961390610aa69086903090879060040161131c565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610af6919081019061101b565b90505b92915050565b6000610af683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610cf0565b60008160140183511015610b675760405162461bcd60e51b815260040161020a906113b1565b500160200151600160601b900490565b606081830184511015610b9c5760405162461bcd60e51b815260040161020a906113d1565b606082158015610bb757604051915060208201604052610c01565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610bf0578051835260209283019201610bd8565b5050858452601f01601f1916604052505b5090505b9392505050565b606082518210610c2e5760405162461bcd60e51b815260040161020a906113d1565b610af6838384865103610b77565b600082820183811015610af65760405162461bcd60e51b815260040161020a906113a1565b6003546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b158015610ca657600080fd5b505afa158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cde9190810190610f2d565b9050610ceb818484610d27565b505050565b60008183610d115760405162461bcd60e51b815260040161020a9190611372565b506000838581610d1d57fe5b0495945050505050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610dad57826001600160a01b031681604051610d63906112e8565b60006040518083038185875af1925050503d8060008114610da0576040519150601f19603f3d011682016040523d82523d6000602084013e610da5565b606091505b505050610ceb565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90610ddb9086908590600401611301565b602060405180830381600087803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e2d919081019061101b565b50505050565b8035610af98161150e565b8051610af98161150e565b8051610af981611525565b60008083601f840112610e6657600080fd5b50813567ffffffffffffffff811115610e7e57600080fd5b602083019150836001820283011115610e9657600080fd5b9250929050565b600082601f830112610eae57600080fd5b8135610ec1610ebc82611450565b611429565b91508082526020830160208301858383011115610edd57600080fd5b610ee88382846114cc565b50505092915050565b8035610af98161152e565b8035610af981611537565b600060208284031215610f1957600080fd5b6000610f258484610e33565b949350505050565b600060208284031215610f3f57600080fd5b6000610f258484610e3e565b60008060408385031215610f5e57600080fd5b6000610f6a8585610e33565b925050602083013567ffffffffffffffff811115610f8757600080fd5b610f9385828601610e9d565b9150509250929050565b600080600080600060808688031215610fb557600080fd5b6000610fc18888610e33565b9550506020610fd288828901610efc565b9450506040610fe388828901610efc565b935050606086013567ffffffffffffffff81111561100057600080fd5b61100c88828901610e54565b92509250509295509295909350565b60006020828403121561102d57600080fd5b6000610f258484610e49565b6000806040838503121561104c57600080fd5b823567ffffffffffffffff81111561106357600080fd5b610f6a85828601610e9d565b60006020828403121561108157600080fd5b6000610f258484610ef1565b611096816114c1565b82525050565b6110968161148a565b61109681611495565b6110968161149a565b60006110c3838561147c565b93506110d08385846114cc565b6110d983611504565b9093019392505050565b60006110ee82611478565b6110f8818561147c565b93506111088185602086016114d8565b6110d981611504565b600061111c82611478565b6111268185611485565b93506111368185602086016114d8565b9290920192915050565b611096816114a7565b600061115660148361147c565b73191ccb585d5d1a0b5d5b985d5d1a1bdc9a5e995960621b815260200192915050565b6000611186601b8361147c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006111bf60128361147c565b7152656164206f7574206f6620626f756e647360701b815260200192915050565b60006111ed60208361147c565b7f64732d70726f78792d7461726765742d616464726573732d7265717569726564815260200192915050565b6000610af9600083611485565b600061123360188361147c565b7f62797465732d726561642d6f75742d6f662d626f756e64730000000000000000815260200192915050565b600061126c601f8361147c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b611096816114be565b60006112ad8288611111565b91506112b98287611111565b91506112c58286611111565b91506112d18285611111565b91506112dd8284611111565b979650505050505050565b6000610af982611219565b60208101610af9828461109c565b6040810161130f828561108d565b610c056020830184611298565b6060810161132a828661109c565b611337602083018561109c565b610f2560408301846110ae565b60408101611352828561109c565b8181036020830152610f2581846110e3565b60208101610af982846110a5565b60208082528101610af681846110e3565b60208101610af98284611140565b60208082528101610af981611149565b60208082528101610af981611179565b60208082528101610af9816111b2565b60208082528101610af9816111e0565b60208082528101610af981611226565b60208082528101610af98161125f565b60208101610af98284611298565b6040810161140d8286611298565b81810360208301526114208184866110b7565b95945050505050565b60405181810167ffffffffffffffff8111828210171561144857600080fd5b604052919050565b600067ffffffffffffffff82111561146757600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b6000610af9826114b2565b151590565b6001600160e01b03191690565b6000610af98261148a565b6001600160a01b031690565b90565b6000610af9826114a7565b82818337506000910152565b60005b838110156114f35781810151838201526020016114db565b83811115610e2d5750506000910152565b601f01601f191690565b6115178161148a565b811461152257600080fd5b50565b61151781611495565b611517816114a7565b611517816114be56fea365627a7a72315820a6b84d2d655704c44f5c72b00369357f2858993b7c2449cd7549f151ddacbefc6c6578706572696d656e74616cf564736f6c63430005100040a365627a7a723158202c82190e78029d2dbfee1661e7c94645a505c836d3d2469471b8eea8136182fa6c6578706572696d656e74616cf564736f6c63430005100040608060405234801561001057600080fd5b50610247806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80637ed0c3b21461003b5780638bf4515c14610064575b600080fd5b61004e610049366004610138565b610077565b60405161005b9190610184565b60405180910390f35b61004e610072366004610138565b6100c2565b60008151602083016000f09050803b156001811461003657508151602092830120600090815291829052604090912080546001600160a01b0319166001600160a01b03831617905590565b805160209182012060009081529081905260409020546001600160a01b031690565b600082601f8301126100f557600080fd5b8135610108610103826101bf565b610198565b9150808252602083016020830185838301111561012457600080fd5b61012f8382846101f8565b50505092915050565b60006020828403121561014a57600080fd5b813567ffffffffffffffff81111561016157600080fd5b61016d848285016100e4565b949350505050565b61017e816101e7565b82525050565b602081016101928284610175565b92915050565b60405181810167ffffffffffffffff811182821017156101b757600080fd5b604052919050565b600067ffffffffffffffff8211156101d657600080fd5b506020601f91909101601f19160190565b60006001600160a01b038216610192565b8281833750600091015256fea365627a7a72315820c3b5a839bbdfaed6259e68fe5779780fa1c8e2118f4278cc8ddced160c91afd86c6578706572696d656e74616cf564736f6c63430005100040608060405234801561001057600080fd5b50610c97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063489c12021461003b57806365688cc914610064575b600080fd5b61004e61004936600461015e565b610079565b60405161005b91906101b3565b60405180910390f35b61006c61008e565b60405161005b91906101c1565b60006020819052908152604090205460ff1681565b600060405161009c90610140565b604051809103906000f0801580156100b8573d6000803e3d6000fd5b506040516313af403560e01b81529091506001600160a01b038216906313af4035906100e89033906004016101a5565b600060405180830381600087803b15801561010257600080fd5b505af1158015610116573d6000803e3d6000fd5b5050506001600160a01b0382166000908152602081905260409020805460ff191660011790555090565b610a408061021583390190565b8035610158816101fd565b92915050565b60006020828403121561017057600080fd5b600061017c848461014d565b949350505050565b61018d816101eb565b82525050565b61018d816101da565b61018d816101f2565b602081016101588284610184565b602081016101588284610193565b60208101610158828461019c565b6000610158826101df565b151590565b6001600160a01b031690565b6000610158825b6000610158826101cf565b610206816101cf565b811461021157600080fd5b5056fe60806040819052600180546001600160a01b03191633908117909155907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a26109ef806100516000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a8542f6611610066578063a8542f661461010f578063b700961314610124578063bf7e214f14610144578063cbeea68c14610159578063f0217ce51461016c5761009e565b806313af4035146100a35780632bc3217d146100b857806379d88d87146100cb5780637a9e5e4b146100de5780638da5cb5b146100f1575b600080fd5b6100b66100b136600461073a565b61017f565b005b6100b66100c6366004610760565b61020a565b6100b66100d936600461080e565b610234565b6100b66100ec366004610840565b6102bf565b6100f961033d565b60405161010691906108c1565b60405180910390f35b61011761034c565b6040516101069190610905565b6101376101323660046107ad565b610352565b60405161010691906108f7565b61014c610567565b6040516101069190610913565b6100b6610167366004610760565b610576565b6100b661017a36600461080e565b610597565b610195336000356001600160e01b031916610625565b6101ba5760405162461bcd60e51b81526004016101b190610921565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b61022f8360601b6001600160601b0319168360601b6001600160601b03191683610234565b505050565b61024a336000356001600160e01b031916610625565b6102665760405162461bcd60e51b81526004016101b190610921565b60008381526002602090815260408083208584528252808320848452909152808220805460ff19169055518291849186917f95ba64c95d85e67ac83a0476c4a62ac2cf8ab2d0407545b8c9d79c3eefa6282991a4505050565b6102d5336000356001600160e01b031916610625565b6102f15760405162461bcd60e51b81526004016101b190610921565b600080546001600160a01b0319166001600160a01b03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b6001546001600160a01b031681565b60001981565b6bffffffffffffffffffffffff19606084811b821660008181526002602090815260408083209488901b9095168083529381528482206001600160e01b03198716835290529283205490919060ff16806103cf575060008281526002602090815260408083208484528252808320600019845290915290205460ff165b8061040757506000828152600260209081526040808320600019845282528083206001600160e01b03198816845290915290205460ff165b80610432575060008281526002602090815260408083206000198452825280832090915290205460ff165b8061047f575060008181527f38b5b2ceac7637132d27514ffcf440b705287635075af7b8bd5adcaa6a4cc5bb602090815260408083206001600160e01b03198816845290915290205460ff165b806104c4575060008181527f38b5b2ceac7637132d27514ffcf440b705287635075af7b8bd5adcaa6a4cc5bb60209081526040808320600019845290915290205460ff165b8061050757506001600160e01b0319841660009081527f47fa60fbc027ac3984ea309688a33182f4193c478b40ba8d294eb2cd3ddc4d97602052604090205460ff165b8061055d57506000196000527f47fa60fbc027ac3984ea309688a33182f4193c478b40ba8d294eb2cd3ddc4d976020527ff423d1317b37667cd26005728bffa7c8b0499e133951fcf8e814d4fc5f4c98f65460ff165b9695505050505050565b6000546001600160a01b031681565b61022f8360601b6001600160601b0319168360601b6001600160601b031916835b6105ad336000356001600160e01b031916610625565b6105c95760405162461bcd60e51b81526004016101b190610921565b60008381526002602090815260408083208584528252808320848452909152808220805460ff19166001179055518291849186917f6f50375045128971c5469d343039ba7b8e30a5b190453737b28bda6f7a30677191a4505050565b60006001600160a01b038316301415610640575060016106fd565b6001546001600160a01b038481169116141561065e575060016106fd565b6000546001600160a01b0316610676575060006106fd565b60005460405163b700961360e01b81526001600160a01b039091169063b7009613906106aa908690309087906004016108cf565b60206040518083038186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106fa91908101906107f0565b90505b92915050565b80356106fd81610971565b80516106fd81610988565b80356106fd81610991565b80356106fd8161099a565b80356106fd816109a3565b60006020828403121561074c57600080fd5b60006107588484610703565b949350505050565b60008060006060848603121561077557600080fd5b60006107818686610703565b935050602061079286828701610703565b92505060406107a386828701610719565b9150509250925092565b6000806000606084860312156107c257600080fd5b60006107ce8686610703565b93505060206107df86828701610703565b92505060406107a386828701610724565b60006020828403121561080257600080fd5b6000610758848461070e565b60008060006060848603121561082357600080fd5b600061082f8686610719565b935050602061079286828701610719565b60006020828403121561085257600080fd5b6000610758848461072f565b6108678161093a565b82525050565b61086781610945565b6108678161094a565b6108678161094d565b6108678161095a565b600061089e601483610931565b73191ccb585d5d1a0b5d5b985d5d1a1bdc9a5e995960621b815260200192915050565b602081016106fd828461085e565b606081016108dd828661085e565b6108ea602083018561085e565b610758604083018461087f565b602081016106fd828461086d565b602081016106fd8284610876565b602081016106fd8284610888565b602080825281016106fd81610891565b90815260200190565b60006106fd82610965565b151590565b90565b6001600160e01b03191690565b60006106fd8261093a565b6001600160a01b031690565b61097a8161093a565b811461098557600080fd5b50565b61097a81610945565b61097a8161094a565b61097a8161094d565b61097a8161095a56fea365627a7a72315820ba54699f795869872328ff49d813a3d8b10d917826dfb66dd5c8a4e5a5f790706c6578706572696d656e74616cf564736f6c63430005100040a365627a7a72315820a3b657af318a650499d8f24d4e7e6f5b5480637a37a5e65c2fb1895ba4f9021a6c6578706572696d656e74616cf564736f6c63430005100040

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620000885760003560e01c80638e1a55fc11620000635780638e1a55fc14620000df578063c455279114620000e9578063ddd2d6ac1462000100578063f3701da214620001175762000088565b80632e5c9848146200008d57806360c7d29514620000af5780636456568b14620000b9575b600080fd5b620000976200012e565b604051620000a6919062000a83565b60405180910390f35b620000976200013d565b620000d0620000ca3660046200089a565b6200014c565b604051620000a6919062000a20565b620000d06200049a565b620000d0620000fa36600462000871565b620004ac565b620000d06200011136600462000907565b620004c7565b620000d06200012836600462000871565b620004df565b6002546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b03838116600090815260208190526040812054909116156200019157506001600160a01b038084166000908152602081905260409020541662000493565b6001546040516000916001600160a01b031690620001af90620007a0565b620001bb919062000a20565b604051809103906000f080158015620001d8573d6000803e3d6000fd5b506001546040519192506001600160a01b038088169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620002239287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002ad919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af403590620002de90859060040162000a30565b600060405180830381600087803b158015620002f957600080fd5b505af11580156200030e573d6000803e3d6000fd5b5050604051631cff79cd60e01b81526001600160a01b0385169250631cff79cd915062000342908890889060040162000a5f565b600060405180830381600087803b1580156200035d57600080fd5b505af115801562000372573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200039c91908101906200095f565b50604051637a9e5e4b60e01b81526001600160a01b03831690637a9e5e4b90620003cb90849060040162000a83565b600060405180830381600087803b158015620003e657600080fd5b505af1158015620003fb573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200042d90899060040162000a20565b600060405180830381600087803b1580156200044857600080fd5b505af11580156200045d573d6000803e3d6000fd5b505050506001600160a01b03868116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b9392505050565b6000620004a733620004df565b905090565b6000602081905290815260409020546001600160a01b031681565b6000620004d63384846200014c565b90505b92915050565b6001600160a01b03818116600090815260208190526040812054909116156200052457506001600160a01b03808216600090815260208190526040902054166200079b565b6001546040516000916001600160a01b0316906200054290620007a0565b6200054e919062000a20565b604051809103906000f0801580156200056b573d6000803e3d6000fd5b506001546040519192506001600160a01b038086169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620005b69287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000640919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af4035906200067190859060040162000a30565b600060405180830381600087803b1580156200068c57600080fd5b505af1158015620006a1573d6000803e3d6000fd5b5050604051637a9e5e4b60e01b81526001600160a01b0385169250637a9e5e4b9150620006d390849060040162000a83565b600060405180830381600087803b158015620006ee57600080fd5b505af115801562000703573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200073590879060040162000a20565b600060405180830381600087803b1580156200075057600080fd5b505af115801562000765573d6000803e3d6000fd5b505050506001600160a01b03848116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b919050565b611a418062000b9383390190565b8035620004d98162000b6d565b600082601f830112620007cd57600080fd5b8135620007e4620007de8262000abb565b62000a93565b915080825260208301602083018583830111156200080157600080fd5b6200080e83828462000b24565b50505092915050565b600082601f8301126200082957600080fd5b81516200083a620007de8262000abb565b915080825260208301602083018583830111156200085757600080fd5b6200080e83828462000b30565b8051620004d98162000b87565b6000602082840312156200088457600080fd5b6000620008928484620007ae565b949350505050565b600080600060608486031215620008b057600080fd5b6000620008be8686620007ae565b9350506020620008d186828701620007ae565b925050604084013567ffffffffffffffff811115620008ef57600080fd5b620008fd86828701620007bb565b9150509250925092565b600080604083850312156200091b57600080fd5b6000620009298585620007ae565b925050602083013567ffffffffffffffff8111156200094757600080fd5b6200095585828601620007bb565b9150509250929050565b6000602082840312156200097257600080fd5b815167ffffffffffffffff8111156200098a57600080fd5b620008928482850162000817565b600060208284031215620009ab57600080fd5b600062000892848462000864565b620009c48162000b17565b82525050565b620009c48162000af1565b6000620009e28262000ae4565b620009ee818562000ae8565b935062000a0081856020860162000b30565b62000a0b8162000b63565b9093019392505050565b620009c48162000afe565b60208101620004d98284620009ca565b60208101620004d98284620009b9565b6040810162000a508285620009b9565b620004936020830184620009ca565b6040810162000a6f8285620009ca565b8181036020830152620008928184620009d5565b60208101620004d9828462000a15565b60405181810167ffffffffffffffff8111828210171562000ab357600080fd5b604052919050565b600067ffffffffffffffff82111562000ad357600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000620004d98262000b0b565b6000620004d98262000af1565b6001600160a01b031690565b6000620004d98262000afe565b82818337506000910152565b60005b8381101562000b4d57818101518382015260200162000b33565b8381111562000b5d576000848401525b50505050565b601f01601f191690565b62000b788162000af1565b811462000b8457600080fd5b50565b62000b788162000afe56fe6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c81790553480156200003757600080fd5b5060405162001a4138038062001a418339810160408190526200005a91620002a3565b600180546001600160a01b0319163390811782556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a2620000ab816001600160e01b03620000ca16565b50620000c29050816001600160e01b03620000ca16565b5050620004ae565b6000620000ec336001600160e01b03198335166001600160e01b036200019f16565b620001145760405162461bcd60e51b81526004016200010b90620003ea565b60405180910390fd5b60405160043590602435903490829084903390600080356001600160e01b031916916200014591879136906200040e565b60405180910390a46001600160a01b038516620001765760405162461bcd60e51b81526004016200010b90620003fc565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b60006001600160a01b038316301415620001bc5750600162000283565b6001546001600160a01b0384811691161415620001dc5750600162000283565b6000546001600160a01b0316620001f65750600062000283565b60005460405163b700961360e01b81526001600160a01b039091169063b7009613906200022c90869030908790600401620003bc565b60206040518083038186803b1580156200024557600080fd5b505afa1580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002809190810190620002cc565b90505b92915050565b8051620002838162000489565b80516200028381620004a3565b600060208284031215620002b657600080fd5b6000620002c4848462000289565b949350505050565b600060208284031215620002df57600080fd5b6000620002c4848462000296565b620002f88162000445565b82525050565b620002f88162000457565b60006200031783856200043c565b93506200032683858462000473565b62000331836200047f565b9093019392505050565b60006200034a6014836200043c565b7f64732d617574682d756e617574686f72697a6564000000000000000000000000815260200192915050565b600062000385601f836200043c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b620002f88162000470565b60608101620003cc8286620002ed565b620003db6020830185620002ed565b620002c46040830184620002fe565b6020808252810162000283816200033b565b60208082528101620002838162000376565b604081016200041e8286620003b1565b81810360208301526200043381848662000309565b95945050505050565b90815260200190565b6000620002838262000464565b151590565b6001600160e01b03191690565b6001600160a01b031690565b90565b82818337506000910152565b601f01601f191690565b620004948162000445565b8114620004a057600080fd5b50565b620004948162000452565b61158380620004be6000396000f3fe6080604052600436106100915760003560e01c80638da5cb5b116100595780638da5cb5b1461013f578063948f507614610161578063bf7e214f1461018e578063c72c4d10146101a3578063ee872558146101b857610091565b806313af4035146100935780631cff79cd146100b35780631f6a1eb9146100dc57806360c7d295146100fd5780637a9e5e4b1461011f575b005b34801561009f57600080fd5b506100916100ae366004610f07565b6101d8565b6100c66100c1366004610f4b565b610263565b6040516100d39190611372565b60405180910390f35b6100ef6100ea366004611039565b610347565b6040516100d3929190611344565b34801561010957600080fd5b50610112610475565b6040516100d39190611383565b34801561012b57600080fd5b5061009161013a36600461106f565b610484565b34801561014b57600080fd5b50610154610502565b6040516100d391906112f3565b34801561016d57600080fd5b5061018161017c366004610f07565b610511565b6040516100d39190611364565b34801561019a57600080fd5b506101126105cb565b3480156101af57600080fd5b506101126105da565b3480156101c457600080fd5b506100916101d3366004610f9d565b6105e9565b6101ee336000356001600160e01b031916610a21565b6102135760405162461bcd60e51b815260040161020a90611391565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b606061027b336000356001600160e01b031916610a21565b6102975760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b031916916102c691879136906113ff565b60405180910390a46001600160a01b0386166102f45760405162461bcd60e51b815260040161020a906113c1565b600080865160208801896113885a03f43d6040519550601f19601f6020830101168601604052808652806000602088013e8115600181146103345761033b565b8160208801fd5b50505050505092915050565b6002546040516322fd145760e21b81526000916060916001600160a01b0390911690638bf4515c9061037d908790600401611372565b60206040518083038186803b15801561039557600080fd5b505afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103cd9190810190610f2d565b91506001600160a01b03821661046257600254604051633f6861d960e11b81526001600160a01b0390911690637ed0c3b29061040d908790600401611372565b602060405180830381600087803b15801561042757600080fd5b505af115801561043b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061045f9190810190610f2d565b91505b61046c8284610263565b90509250929050565b6002546001600160a01b031681565b61049a336000356001600160e01b031916610a21565b6104b65760405162461bcd60e51b815260040161020a90611391565b600080546001600160a01b0319166001600160a01b03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b6001546001600160a01b031681565b6000610529336000356001600160e01b031916610a21565b6105455760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b0319169161057491879136906113ff565b60405180910390a46001600160a01b0385166105a25760405162461bcd60e51b815260040161020a906113e1565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b6000546001600160a01b031681565b6003546001600160a01b031681565b6105ff336000356001600160e01b031916610a21565b61061b5760405162461bcd60e51b815260040161020a90611391565b600061062e84600263ffffffff610aff16565b9050600061067484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600c9250610b41915050565b905060606106bd85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506020925060049150610b779050565b9050606061070386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060849250610c0c915050565b90506060828960405160200161071991906113f1565b6040516020818303038152906040528960405160200161073991906113f1565b6040516020818303038152906040528760405160200161075991906113f1565b60408051601f198184030181529082905261077b9493929187906020016112a1565b60405160208183030381529060405290506107968482610263565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038b1614156108b15773773ccbfb422850617a5680d40b1260422d072f416107e286600263ffffffff610aff16565b6040516107ee906112e8565b60006040518083038185875af1925050503d806000811461082b576040519150601f19603f3d011682016040523d82523d6000602084013e610830565b606091505b5073abccb8f0a3c206bb0468c52ccc20f3b81077417b915061085b905086600263ffffffff610aff16565b604051610867906112e8565b60006040518083038185875af1925050503d80600081146108a4576040519150601f19603f3d011682016040523d82523d6000602084013e6108a9565b606091505b5050506109fc565b6001600160a01b038a1663a9059cbb73773ccbfb422850617a5680d40b1260422d072f416108e688600263ffffffff610aff16565b6040518363ffffffff1660e01b8152600401610903929190611301565b602060405180830381600087803b15801561091d57600080fd5b505af1158015610931573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610955919081019061101b565b506001600160a01b038a1663a9059cbb73abccb8f0a3c206bb0468c52ccc20f3b81077417b61098b88600263ffffffff610aff16565b6040518363ffffffff1660e01b81526004016109a8929190611301565b602060405180830381600087803b1580156109c257600080fd5b505af11580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109fa919081019061101b565b505b610a158a610a108b8b63ffffffff610c3c16565b610c61565b50505050505050505050565b60006001600160a01b038316301415610a3c57506001610af9565b6001546001600160a01b0384811691161415610a5a57506001610af9565b6000546001600160a01b0316610a7257506000610af9565b60005460405163b700961360e01b81526001600160a01b039091169063b700961390610aa69086903090879060040161131c565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610af6919081019061101b565b90505b92915050565b6000610af683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610cf0565b60008160140183511015610b675760405162461bcd60e51b815260040161020a906113b1565b500160200151600160601b900490565b606081830184511015610b9c5760405162461bcd60e51b815260040161020a906113d1565b606082158015610bb757604051915060208201604052610c01565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610bf0578051835260209283019201610bd8565b5050858452601f01601f1916604052505b5090505b9392505050565b606082518210610c2e5760405162461bcd60e51b815260040161020a906113d1565b610af6838384865103610b77565b600082820183811015610af65760405162461bcd60e51b815260040161020a906113a1565b6003546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b158015610ca657600080fd5b505afa158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cde9190810190610f2d565b9050610ceb818484610d27565b505050565b60008183610d115760405162461bcd60e51b815260040161020a9190611372565b506000838581610d1d57fe5b0495945050505050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610dad57826001600160a01b031681604051610d63906112e8565b60006040518083038185875af1925050503d8060008114610da0576040519150601f19603f3d011682016040523d82523d6000602084013e610da5565b606091505b505050610ceb565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90610ddb9086908590600401611301565b602060405180830381600087803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e2d919081019061101b565b50505050565b8035610af98161150e565b8051610af98161150e565b8051610af981611525565b60008083601f840112610e6657600080fd5b50813567ffffffffffffffff811115610e7e57600080fd5b602083019150836001820283011115610e9657600080fd5b9250929050565b600082601f830112610eae57600080fd5b8135610ec1610ebc82611450565b611429565b91508082526020830160208301858383011115610edd57600080fd5b610ee88382846114cc565b50505092915050565b8035610af98161152e565b8035610af981611537565b600060208284031215610f1957600080fd5b6000610f258484610e33565b949350505050565b600060208284031215610f3f57600080fd5b6000610f258484610e3e565b60008060408385031215610f5e57600080fd5b6000610f6a8585610e33565b925050602083013567ffffffffffffffff811115610f8757600080fd5b610f9385828601610e9d565b9150509250929050565b600080600080600060808688031215610fb557600080fd5b6000610fc18888610e33565b9550506020610fd288828901610efc565b9450506040610fe388828901610efc565b935050606086013567ffffffffffffffff81111561100057600080fd5b61100c88828901610e54565b92509250509295509295909350565b60006020828403121561102d57600080fd5b6000610f258484610e49565b6000806040838503121561104c57600080fd5b823567ffffffffffffffff81111561106357600080fd5b610f6a85828601610e9d565b60006020828403121561108157600080fd5b6000610f258484610ef1565b611096816114c1565b82525050565b6110968161148a565b61109681611495565b6110968161149a565b60006110c3838561147c565b93506110d08385846114cc565b6110d983611504565b9093019392505050565b60006110ee82611478565b6110f8818561147c565b93506111088185602086016114d8565b6110d981611504565b600061111c82611478565b6111268185611485565b93506111368185602086016114d8565b9290920192915050565b611096816114a7565b600061115660148361147c565b73191ccb585d5d1a0b5d5b985d5d1a1bdc9a5e995960621b815260200192915050565b6000611186601b8361147c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006111bf60128361147c565b7152656164206f7574206f6620626f756e647360701b815260200192915050565b60006111ed60208361147c565b7f64732d70726f78792d7461726765742d616464726573732d7265717569726564815260200192915050565b6000610af9600083611485565b600061123360188361147c565b7f62797465732d726561642d6f75742d6f662d626f756e64730000000000000000815260200192915050565b600061126c601f8361147c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b611096816114be565b60006112ad8288611111565b91506112b98287611111565b91506112c58286611111565b91506112d18285611111565b91506112dd8284611111565b979650505050505050565b6000610af982611219565b60208101610af9828461109c565b6040810161130f828561108d565b610c056020830184611298565b6060810161132a828661109c565b611337602083018561109c565b610f2560408301846110ae565b60408101611352828561109c565b8181036020830152610f2581846110e3565b60208101610af982846110a5565b60208082528101610af681846110e3565b60208101610af98284611140565b60208082528101610af981611149565b60208082528101610af981611179565b60208082528101610af9816111b2565b60208082528101610af9816111e0565b60208082528101610af981611226565b60208082528101610af98161125f565b60208101610af98284611298565b6040810161140d8286611298565b81810360208301526114208184866110b7565b95945050505050565b60405181810167ffffffffffffffff8111828210171561144857600080fd5b604052919050565b600067ffffffffffffffff82111561146757600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b6000610af9826114b2565b151590565b6001600160e01b03191690565b6000610af98261148a565b6001600160a01b031690565b90565b6000610af9826114a7565b82818337506000910152565b60005b838110156114f35781810151838201526020016114db565b83811115610e2d5750506000910152565b601f01601f191690565b6115178161148a565b811461152257600080fd5b50565b61151781611495565b611517816114a7565b611517816114be56fea365627a7a72315820a6b84d2d655704c44f5c72b00369357f2858993b7c2449cd7549f151ddacbefc6c6578706572696d656e74616cf564736f6c63430005100040a365627a7a723158202c82190e78029d2dbfee1661e7c94645a505c836d3d2469471b8eea8136182fa6c6578706572696d656e74616cf564736f6c63430005100040

Deployed Bytecode Sourcemap

39804:2624:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39804:2624:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40016:36;;;:::i;:::-;;;;;;;;;;;;;;;;39984:25;;;:::i;41501:924::-;;;;;;;;;:::i;:::-;;;;;;;;40258:100;;;:::i;39935:40::-;;;;;;;;;:::i;41240:253::-;;;;;;;;;:::i;40466:659::-;;;;;;;;;:::i;40016:36::-;;;-1:-1:-1;;;;;40016:36:0;;:::o;39984:25::-;;;-1:-1:-1;;;;;39984:25:0;;:::o;41501:924::-;-1:-1:-1;;;;;41759:14:0;;;41660:15;41759:14;;;;;;;;;;;41660:15;;41759:14;:28;41755:100;;-1:-1:-1;;;;;;41827:14:0;;;:7;:14;;;;;;;;;;;;41804:39;;41755:100;41920:5;;41899:28;;41867:21;;-1:-1:-1;;;;;41920:5:0;;41899:28;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;41995:5:0;;41944:58;;41867:61;;-1:-1:-1;;;;;;41944:58:0;;;;41952:10;;41944:58;;;;41867:61;;41995:5;;;;41944:58;;;;;;;;;;42031:14;;:25;;;-1:-1:-1;;;42031:25:0;;;;42015:13;;-1:-1:-1;;;;;42031:14:0;;:23;;:25;;;;;;;;;;;;;;42015:13;42031:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;42031:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42031:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42031:25:0;;;;;;;;;42067:21;;-1:-1:-1;;;42067:21:0;;42015:41;;-1:-1:-1;;;;;;42067:14:0;;;;;:21;;42082:5;;42067:21;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42067:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42164:103:0;;-1:-1:-1;;;42164:103:0;;-1:-1:-1;;;;;42164:23:0;;;-1:-1:-1;42164:23:0;;-1:-1:-1;42164:103:0;;42202:20;;42237:19;;42164:103;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42164:103:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42164:103:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;42164:103:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;42164:103:0;;;;;;;;;-1:-1:-1;42280:35:0;;-1:-1:-1;;;42280:35:0;;-1:-1:-1;;;;;42280:28:0;;;;;:35;;42309:5;;42280:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42280:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42326:31:0;;-1:-1:-1;;;42326:31:0;;-1:-1:-1;;;;;42326:24:0;;;-1:-1:-1;42326:24:0;;-1:-1:-1;42326:31:0;;42351:5;;42326:31;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42326:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;42370:14:0;;;:7;:14;;;;;;;;;;:22;;-1:-1:-1;;;;;;42370:22:0;;;;;;;;;;-1:-1:-1;42370:22:0;-1:-1:-1;41501:924:0;;;;;;:::o;40258:100::-;40291:21;40333:17;40339:10;40333:5;:17::i;:::-;40325:25;;40258:100;:::o;39935:40::-;;;;;;;;;;;;;-1:-1:-1;;;;;39935:40:0;;:::o;41240:253::-;41375:15;41410:75;41431:10;41443:20;41465:19;41410:20;:75::i;:::-;41403:82;;41240:253;;;;;:::o;40466:659::-;-1:-1:-1;;;;;40611:14:0;;;40512:15;40611:14;;;;;;;;;;;40512:15;;40611:14;:28;40607:100;;-1:-1:-1;;;;;;40679:14:0;;;:7;:14;;;;;;;;;;;;40656:39;;40607:100;40772:5;;40751:28;;40719:21;;-1:-1:-1;;;;;40772:5:0;;40751:28;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;40847:5:0;;40796:58;;40719:61;;-1:-1:-1;;;;;;40796:58:0;;;;40804:10;;40796:58;;;;40719:61;;40847:5;;;;40796:58;;;;;;;;;;40883:14;;:25;;;-1:-1:-1;;;40883:25:0;;;;40867:13;;-1:-1:-1;;;;;40883:14:0;;:23;;:25;;;;;;;;;;;;;;40867:13;40883:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;40883:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40883:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40883:25:0;;;;;;;;;40919:21;;-1:-1:-1;;;40919:21:0;;40867:41;;-1:-1:-1;;;;;;40919:14:0;;;;;:21;;40934:5;;40919:21;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40919:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40980:35:0;;-1:-1:-1;;;40980:35:0;;-1:-1:-1;;;;;40980:28:0;;;-1:-1:-1;40980:28:0;;-1:-1:-1;40980:35:0;;41009:5;;40980:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40980:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41026:31:0;;-1:-1:-1;;;41026:31:0;;-1:-1:-1;;;;;41026:24:0;;;-1:-1:-1;41026:24:0;;-1:-1:-1;41026:31:0;;41051:5;;41026:31;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41026:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;41070:14:0;;;:7;:14;;;;;;;;;;:22;;-1:-1:-1;;;;;;41070:22:0;;;;;;;;;;-1:-1:-1;41070:22:0;-1:-1:-1;40466:659:0;;;;:::o;39804:2624::-;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;143:440;;244:3;237:4;229:6;225:17;221:27;211:2;;262:1;259;252:12;211:2;299:6;286:20;321:64;336:48;377:6;336:48;;;321:64;;;312:73;;405:6;398:5;391:21;441:4;433:6;429:17;474:4;467:5;463:16;509:3;500:6;495:3;491:16;488:25;485:2;;;526:1;523;516:12;485:2;536:41;570:6;565:3;560;536:41;;;204:379;;;;;;;;592:442;;704:3;697:4;689:6;685:17;681:27;671:2;;722:1;719;712:12;671:2;752:6;746:13;774:64;789:48;830:6;789:48;;774:64;765:73;;858:6;851:5;844:21;894:4;886:6;882:17;927:4;920:5;916:16;962:3;953:6;948:3;944:16;941:25;938:2;;;979:1;976;969:12;938:2;989:39;1021:6;1016:3;1011;989:39;;1042:166;1136:13;;1154:49;1136:13;1154:49;;1215:241;;1319:2;1307:9;1298:7;1294:23;1290:32;1287:2;;;1335:1;1332;1325:12;1287:2;1370:1;1387:53;1432:7;1412:9;1387:53;;;1377:63;1281:175;-1:-1;;;;1281:175;1463:595;;;;1610:2;1598:9;1589:7;1585:23;1581:32;1578:2;;;1626:1;1623;1616:12;1578:2;1661:1;1678:53;1723:7;1703:9;1678:53;;;1668:63;;1640:97;1768:2;1786:53;1831:7;1822:6;1811:9;1807:22;1786:53;;;1776:63;;1747:98;1904:2;1893:9;1889:18;1876:32;1928:18;1920:6;1917:30;1914:2;;;1960:1;1957;1950:12;1914:2;1980:62;2034:7;2025:6;2014:9;2010:22;1980:62;;;1970:72;;1855:193;1572:486;;;;;;2065:470;;;2195:2;2183:9;2174:7;2170:23;2166:32;2163:2;;;2211:1;2208;2201:12;2163:2;2246:1;2263:53;2308:7;2288:9;2263:53;;;2253:63;;2225:97;2381:2;2370:9;2366:18;2353:32;2405:18;2397:6;2394:30;2391:2;;;2437:1;2434;2427:12;2391:2;2457:62;2511:7;2502:6;2491:9;2487:22;2457:62;;;2447:72;;2332:193;2157:378;;;;;;2542:360;;2666:2;2654:9;2645:7;2641:23;2637:32;2634:2;;;2682:1;2679;2672:12;2634:2;2717:24;;2761:18;2750:30;;2747:2;;;2793:1;2790;2783:12;2747:2;2813:73;2878:7;2869:6;2858:9;2854:22;2813:73;;2909:295;;3040:2;3028:9;3019:7;3015:23;3011:32;3008:2;;;3056:1;3053;3046:12;3008:2;3091:1;3108:80;3180:7;3160:9;3108:80;;3211:142;3302:45;3341:5;3302:45;;;3297:3;3290:58;3284:69;;;3360:137;3459:32;3485:5;3459:32;;3624:343;;3734:38;3766:5;3734:38;;;3784:70;3847:6;3842:3;3784:70;;;3777:77;;3859:52;3904:6;3899:3;3892:4;3885:5;3881:16;3859:52;;;3932:29;3954:6;3932:29;;;3923:39;;;;3714:253;-1:-1;;;3714:253;3974:172;4080:60;4134:5;4080:60;;4493:213;4611:2;4596:18;;4625:71;4600:9;4669:6;4625:71;;4713:229;4839:2;4824:18;;4853:79;4828:9;4905:6;4853:79;;5201:340;5355:2;5340:18;;5369:79;5344:9;5421:6;5369:79;;;5459:72;5527:2;5516:9;5512:18;5503:6;5459:72;;5548:408;5712:2;5697:18;;5726:71;5701:9;5770:6;5726:71;;;5845:9;5839:4;5835:20;5830:2;5819:9;5815:18;5808:48;5870:76;5941:4;5932:6;5870:76;;5963:259;6104:2;6089:18;;6118:94;6093:9;6185:6;6118:94;;6743:256;6805:2;6799:9;6831:17;;;6906:18;6891:34;;6927:22;;;6888:62;6885:2;;;6963:1;6960;6953:12;6885:2;6979;6972:22;6783:216;;-1:-1;6783:216;7006:321;;7149:18;7141:6;7138:30;7135:2;;;7181:1;7178;7171:12;7135:2;-1:-1;7312:4;7248;7225:17;;;;-1:-1;;7221:33;7302:15;;7072:255;7334:121;7421:12;;7392:63;7463:162;7565:19;;;7614:4;7605:14;;7558:67;7633:91;;7695:24;7713:5;7695:24;;7837:107;;7915:24;7933:5;7915:24;;7951:121;-1:-1;;;;;8013:54;;7996:76;8079:129;;8166:37;8197:5;8166:37;;9368:145;9449:6;9444:3;9439;9426:30;-1:-1;9505:1;9487:16;;9480:27;9419:94;9522:268;9587:1;9594:101;9608:6;9605:1;9602:13;9594:101;;;9675:11;;;9669:18;9656:11;;;9649:39;9630:2;9623:10;9594:101;;;9710:6;9707:1;9704:13;9701:2;;;9775:1;9766:6;9761:3;9757:16;9750:27;9701:2;9571:219;;;;;9798:97;9886:2;9866:14;-1:-1;;9862:28;;9846:49;9903:117;9972:24;9990:5;9972:24;;;9965:5;9962:35;9952:2;;10011:1;10008;10001:12;9952:2;9946:74;;10027:149;10112:40;10146:5;10112:40;

Swarm Source

bzzr://a3b657af318a650499d8f24d4e7e6f5b5480637a37a5e65c2fb1895ba4f9021a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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