ETH Price: $3,821.93 (+0.50%)
Gas: 7 Gwei

Contract

0xc21F107933612eCF5677894d45fc060767479A9b
 
Transaction Hash
Method
Block
From
To
Value
Permit198127302024-05-06 18:08:3527 days ago1715018915IN
0xc21F1079...767479A9b
0 ETH0.000343846.33059992
Permit187120282023-12-04 9:12:35181 days ago1701681155IN
0xc21F1079...767479A9b
0 ETH0.0021066638.79530864
Permit187120152023-12-04 9:09:59181 days ago1701680999IN
0xc21F1079...767479A9b
0 ETH0.0020190437.17361382
Permit187119892023-12-04 9:04:47181 days ago1701680687IN
0xc21F1079...767479A9b
0 ETH0.001867634.3852785
Permit187118532023-12-04 8:37:35181 days ago1701679055IN
0xc21F1079...767479A9b
0 ETH0.0012149432.64753573
Permit187118462023-12-04 8:36:11181 days ago1701678971IN
0xc21F1079...767479A9b
0 ETH0.0014270838.34815603
Permit187118412023-12-04 8:35:11181 days ago1701678911IN
0xc21F1079...767479A9b
0 ETH0.0020177337.14951631
Approve183118712023-10-09 8:58:23237 days ago1696841903IN
0xc21F1079...767479A9b
0 ETH0.000224419.25684161
Withdraw182733022023-10-03 23:33:11243 days ago1696375991IN
0xc21F1079...767479A9b
0 ETH0.002026618.26297572
Withdraw182732962023-10-03 23:31:59243 days ago1696375919IN
0xc21F1079...767479A9b
0 ETH0.002105188.58544056
Redeem182732902023-10-03 23:30:35243 days ago1696375835IN
0xc21F1079...767479A9b
0 ETH0.002214539.031762
Redeem173440132023-05-26 14:58:59373 days ago1685113139IN
0xc21F1079...767479A9b
0 ETH0.0076059731.64067552
Transfer173439802023-05-26 14:52:23373 days ago1685112743IN
0xc21F1079...767479A9b
0 ETH0.0016930133.01699677
Redeem169309712023-03-29 5:47:59431 days ago1680068879IN
0xc21F1079...767479A9b
0 ETH0.0067319326.68554275
Claim Rewards168948872023-03-24 4:08:47437 days ago1679630927IN
0xc21F1079...767479A9b
0 ETH0.0007927713.5852223
Approve168948812023-03-24 4:07:35437 days ago1679630855IN
0xc21F1079...767479A9b
0 ETH0.0006513414.09022337
Redeem167629462023-03-05 15:00:11455 days ago1678028411IN
0xc21F1079...767479A9b
0 ETH0.0071708127.84675346
Redeem166052052023-02-11 11:25:23477 days ago1676114723IN
0xc21F1079...767479A9b
0 ETH0.0040772715.83420717
Redeem165178592023-01-30 6:30:23489 days ago1675060223IN
0xc21F1079...767479A9b
0 ETH0.0038811615.07330797
Redeem164610322023-01-22 8:04:35497 days ago1674374675IN
0xc21F1079...767479A9b
0 ETH0.0037187515.46914945
Redeem164591352023-01-22 1:43:23498 days ago1674351803IN
0xc21F1079...767479A9b
0 ETH0.0041488616.1129748
Redeem164509322023-01-20 22:14:47499 days ago1674252887IN
0xc21F1079...767479A9b
0 ETH0.0068985126.79179345
Redeem164482182023-01-20 13:08:47499 days ago1674220127IN
0xc21F1079...767479A9b
0 ETH0.0040947618.79037267
Approve164388502023-01-19 5:45:23500 days ago1674107123IN
0xc21F1079...767479A9b
0 ETH0.0007816516.8
Redeem164361092023-01-18 20:34:35501 days ago1674074075IN
0xc21F1079...767479A9b
0 ETH0.006937228.85861358
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
157744522022-10-18 10:40:11593 days ago1666089611  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AaveV2ERC4626

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-30
*/

// File: contracts/ILendingPool.sol


pragma solidity ^0.8.4;

// Aave lending pool interface
// Documentation: https://docs.aave.com/developers/the-core-protocol/lendingpool/ilendingpool
// refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.
interface ILendingPool {
    struct ReserveConfigurationMap {
        //bit 0-15: LTV
        //bit 16-31: Liq. threshold
        //bit 32-47: Liq. bonus
        //bit 48-55: Decimals
        //bit 56: Reserve is active
        //bit 57: reserve is frozen
        //bit 58: borrowing is enabled
        //bit 59: stable rate borrowing enabled
        //bit 60-63: reserved
        //bit 64-79: reserve factor
        uint256 data;
    }

    struct ReserveData {
        ReserveConfigurationMap configuration;
        //the liquidity index. Expressed in ray
        uint128 liquidityIndex;
        //variable borrow index. Expressed in ray
        uint128 variableBorrowIndex;
        //the current supply rate. Expressed in ray
        uint128 currentLiquidityRate;
        //the current variable borrow rate. Expressed in ray
        uint128 currentVariableBorrowRate;
        //the current stable borrow rate. Expressed in ray
        uint128 currentStableBorrowRate;
        uint40 lastUpdateTimestamp;
        //tokens addresses
        address aTokenAddress;
        address stableDebtTokenAddress;
        address variableDebtTokenAddress;
        //address of the interest rate strategy
        address interestRateStrategyAddress;
        //the id of the reserve. Represents the position in the list of the active reserves
        uint8 id;
    }

    /**
     * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.
     * - E.g. User deposits 100 USDC and gets in return 100 aUSDC
     * @param asset The address of the underlying asset to deposit
     * @param amount The amount to be deposited
     * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user
     * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens
     * is a different wallet
     * @param referralCode Code used to register the integrator originating the operation, for potential rewards.
     * 0 if the action is executed directly by the user, without any middle-man
     *
     */
    function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external;

    /**
     * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned
     * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC
     * @param asset The address of the underlying asset to withdraw
     * @param amount The underlying amount to be withdrawn
     * - Send the value type(uint256).max in order to withdraw the whole aToken balance
     * @param to Address that will receive the underlying, same as msg.sender if the user
     * wants to receive it on his own wallet, or a different address if the beneficiary is a
     * different wallet
     * @return The final amount withdrawn
     *
     */
    function withdraw(address asset, uint256 amount, address to) external returns (uint256);

    /**
     * @dev Returns the state and configuration of the reserve
     * @param asset The address of the underlying asset of the reserve
     * @return The state of the reserve
     *
     */
    function getReserveData(address asset) external view returns (ReserveData memory);

    function paused() external view returns (bool);
}
// File: contracts/IAaveMining.sol


pragma solidity ^0.8.4;

interface IAaveMining {
    function claimRewards(address[] calldata assets, uint256 amount, address to) external returns (uint256);
}
// File: contracts/FixedPointMathLib.sol


pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * y in z for now.
            z := mul(x, y)

            // Equivalent to require(denominator != 0 && (x == 0 || (x * y) / x == y))
            if iszero(and(iszero(iszero(denominator)), or(iszero(x), eq(div(z, x), y)))) {
                revert(0, 0)
            }

            // Divide z by the denominator.
            z := div(z, denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * y in z for now.
            z := mul(x, y)

            // Equivalent to require(denominator != 0 && (x == 0 || (x * y) / x == y))
            if iszero(and(iszero(iszero(denominator)), or(iszero(x), eq(div(z, x), y)))) {
                revert(0, 0)
            }

            // First, divide z - 1 by the denominator and add 1.
            // We allow z - 1 to underflow if z is 0, because we multiply the
            // end result by 0 if z is zero, ensuring we return 0 if z is zero.
            z := mul(iszero(iszero(z)), add(div(sub(z, 1), denominator), 1))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}
// File: contracts/ERC20.sol


pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}
// File: contracts/SafeTransferLib.sol


pragma solidity >=0.8.0;


/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}
// File: contracts/ERC4626.sol


pragma solidity >=0.8.0;




/// @notice Minimal ERC4626 tokenized Vault implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/mixins/ERC4626.sol)
abstract contract ERC4626 is ERC20 {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;

    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);

    event Withdraw(
        address indexed caller,
        address indexed receiver,
        address indexed owner,
        uint256 assets,
        uint256 shares
    );

    /*//////////////////////////////////////////////////////////////
                               IMMUTABLES
    //////////////////////////////////////////////////////////////*/

    ERC20 public immutable asset;

    constructor(
        ERC20 _asset,
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol, _asset.decimals()) {
        asset = _asset;
    }

    /*//////////////////////////////////////////////////////////////
                        DEPOSIT/WITHDRAWAL LOGIC
    //////////////////////////////////////////////////////////////*/

    function deposit(uint256 assets, address receiver) public virtual returns (uint256 shares) {
        // Check for rounding error since we round down in previewDeposit.
        require((shares = previewDeposit(assets)) != 0, "ZERO_SHARES");

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }

    function mint(uint256 shares, address receiver) public virtual returns (uint256 assets) {
        assets = previewMint(shares); // No need to check for rounding error, previewMint rounds up.

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }

    function withdraw(
        uint256 assets,
        address receiver,
        address owner
    ) public virtual returns (uint256 shares) {
        shares = previewWithdraw(assets); // No need to check for rounding error, previewWithdraw rounds up.

        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }

    function redeem(
        uint256 shares,
        address receiver,
        address owner
    ) public virtual returns (uint256 assets) {
        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        // Check for rounding error since we round down in previewRedeem.
        require((assets = previewRedeem(shares)) != 0, "ZERO_ASSETS");

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }

    /*//////////////////////////////////////////////////////////////
                            ACCOUNTING LOGIC
    //////////////////////////////////////////////////////////////*/

    function totalAssets() public view virtual returns (uint256);

    function convertToShares(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets());
    }

    function convertToAssets(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply);
    }

    function previewDeposit(uint256 assets) public view virtual returns (uint256) {
        return convertToShares(assets);
    }

    function previewMint(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply);
    }

    function previewWithdraw(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivUp(supply, totalAssets());
    }

    function previewRedeem(uint256 shares) public view virtual returns (uint256) {
        return convertToAssets(shares);
    }

    /*//////////////////////////////////////////////////////////////
                     DEPOSIT/WITHDRAWAL LIMIT LOGIC
    //////////////////////////////////////////////////////////////*/

    function maxDeposit(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxMint(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxWithdraw(address owner) public view virtual returns (uint256) {
        return convertToAssets(balanceOf[owner]);
    }

    function maxRedeem(address owner) public view virtual returns (uint256) {
        return balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                          INTERNAL HOOKS LOGIC
    //////////////////////////////////////////////////////////////*/

    function beforeWithdraw(uint256 assets, uint256 shares) internal virtual {}

    function afterDeposit(uint256 assets, uint256 shares) internal virtual {}
}
// File: contracts/AaveV2ERC4626.sol


pragma solidity ^0.8.13;






/// @title AaveV2ERC4626
/// @author zefram.eth
/// @notice ERC4626 wrapper for Aave V2
/// @dev Important security note: due to Aave using a rebasing model for aTokens,
/// this contract cannot independently keep track of the deposited funds, so it is possible
/// for an attacker to directly transfer aTokens to this contract, increase the vault share
/// price atomically, and then exploit an external lending market that uses this contract
/// as collateral.
contract AaveV2ERC4626 is ERC4626 {
    /// -----------------------------------------------------------------------
    /// Libraries usage
    /// -----------------------------------------------------------------------

    using SafeTransferLib for ERC20;

    /// -----------------------------------------------------------------------
    /// Events
    /// -----------------------------------------------------------------------

    event ClaimRewards(uint256 amount);

    /// -----------------------------------------------------------------------
    /// Constants
    /// -----------------------------------------------------------------------

    uint256 internal constant ACTIVE_MASK = 1 << 56;
    uint256 internal constant FROZEN_MASK = 1 << 57;

    /// -----------------------------------------------------------------------
    /// Immutable params
    /// -----------------------------------------------------------------------

    /// @notice The Aave aToken contract
    ERC20 public immutable aToken;

    /// @notice The Aave liquidity mining contract
    IAaveMining public immutable aaveMining;

    /// @notice The address that will receive the liquidity mining rewards (if any)
    address public immutable rewardRecipient;

    /// @notice The Aave LendingPool contract
    ILendingPool public immutable lendingPool;

    /// -----------------------------------------------------------------------
    /// Constructor
    /// -----------------------------------------------------------------------

    constructor(
        ERC20 asset_,
        ERC20 aToken_,
        IAaveMining aaveMining_,
        address rewardRecipient_,
        ILendingPool lendingPool_
    ) ERC4626(asset_, _vaultName(asset_), _vaultSymbol(asset_)) {
        aToken = aToken_;
        aaveMining = aaveMining_;
        lendingPool = lendingPool_;
        rewardRecipient = rewardRecipient_;
    }

    /// -----------------------------------------------------------------------
    /// Aave liquidity mining
    /// -----------------------------------------------------------------------

    /// @notice Claims liquidity mining rewards from Aave and sends it to rewardRecipient
    function claimRewards() external {
        address[] memory assets = new address[](1);
        assets[0] = address(aToken);
        uint256 amount = aaveMining.claimRewards(assets, type(uint256).max, rewardRecipient);
        emit ClaimRewards(amount);
    }

    /// -----------------------------------------------------------------------
    /// ERC4626 overrides
    /// -----------------------------------------------------------------------

    function withdraw(uint256 assets, address receiver, address owner)
        public
        virtual
        override
        returns (uint256 shares)
    {
        shares = previewWithdraw(assets); // No need to check for rounding error, previewWithdraw rounds up.

        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) {
                allowance[owner][msg.sender] = allowed - shares;
            }
        }

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        // withdraw assets directly from Aave
        lendingPool.withdraw(address(asset), assets, receiver);
    }

    function redeem(uint256 shares, address receiver, address owner) public virtual override returns (uint256 assets) {
        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) {
                allowance[owner][msg.sender] = allowed - shares;
            }
        }

        // Check for rounding error since we round down in previewRedeem.
        require((assets = previewRedeem(shares)) != 0, "ZERO_ASSETS");

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        // withdraw assets directly from Aave
        lendingPool.withdraw(address(asset), assets, receiver);
    }

    function totalAssets() public view virtual override returns (uint256) {
        // aTokens use rebasing to accrue interest, so the total assets is just the aToken balance
        return aToken.balanceOf(address(this));
    }

    function afterDeposit(uint256 assets, uint256 /*shares*/ ) internal virtual override {
        /// -----------------------------------------------------------------------
        /// Deposit assets into Aave
        /// -----------------------------------------------------------------------

        // approve to lendingPool
        asset.safeApprove(address(lendingPool), assets);

        // deposit into lendingPool
        lendingPool.deposit(address(asset), assets, address(this), 0);
    }

    function maxDeposit(address) public view virtual override returns (uint256) {
        // check if pool is paused
        if (lendingPool.paused()) {
            return 0;
        }

        // check if asset is paused
        uint256 configData = lendingPool.getReserveData(address(asset)).configuration.data;
        if (!(_getActive(configData) && !_getFrozen(configData))) {
            return 0;
        }

        return type(uint256).max;
    }

    function maxMint(address) public view virtual override returns (uint256) {
        // check if pool is paused
        if (lendingPool.paused()) {
            return 0;
        }

        // check if asset is paused
        uint256 configData = lendingPool.getReserveData(address(asset)).configuration.data;
        if (!(_getActive(configData) && !_getFrozen(configData))) {
            return 0;
        }

        return type(uint256).max;
    }

    function maxWithdraw(address owner) public view virtual override returns (uint256) {
        // check if pool is paused
        if (lendingPool.paused()) {
            return 0;
        }

        // check if asset is paused
        uint256 configData = lendingPool.getReserveData(address(asset)).configuration.data;
        if (!_getActive(configData)) {
            return 0;
        }

        uint256 cash = asset.balanceOf(address(aToken));
        uint256 assetsBalance = convertToAssets(balanceOf[owner]);
        return cash < assetsBalance ? cash : assetsBalance;
    }

    function maxRedeem(address owner) public view virtual override returns (uint256) {
        // check if pool is paused
        if (lendingPool.paused()) {
            return 0;
        }

        // check if asset is paused
        uint256 configData = lendingPool.getReserveData(address(asset)).configuration.data;
        if (!_getActive(configData)) {
            return 0;
        }

        uint256 cash = asset.balanceOf(address(aToken));
        uint256 cashInShares = convertToShares(cash);
        uint256 shareBalance = balanceOf[owner];
        return cashInShares < shareBalance ? cashInShares : shareBalance;
    }

    /// -----------------------------------------------------------------------
    /// ERC20 metadata generation
    /// -----------------------------------------------------------------------

    function _vaultName(ERC20 asset_) internal view virtual returns (string memory vaultName) {
        vaultName = string.concat("ERC4626-Wrapped Aave v2 ", asset_.symbol());
    }

    function _vaultSymbol(ERC20 asset_) internal view virtual returns (string memory vaultSymbol) {
        vaultSymbol = string.concat("wa2", asset_.symbol());
    }

    /// -----------------------------------------------------------------------
    /// Internal functions
    /// -----------------------------------------------------------------------

    function _getActive(uint256 configData) internal pure returns (bool) {
        return (configData & ACTIVE_MASK) != 0;
    }

    function _getFrozen(uint256 configData) internal pure returns (bool) {
        return (configData & FROZEN_MASK) != 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ERC20","name":"asset_","type":"address"},{"internalType":"contract ERC20","name":"aToken_","type":"address"},{"internalType":"contract IAaveMining","name":"aaveMining_","type":"address"},{"internalType":"address","name":"rewardRecipient_","type":"address"},{"internalType":"contract ILendingPool","name":"lendingPool_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aToken","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aaveMining","outputs":[{"internalType":"contract IAaveMining","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lendingPool","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6101806040523480156200001257600080fd5b5060405162002f5c38038062002f5c8339810160408190526200003591620002e2565b8462000041816200011d565b6200004c87620001b0565b8181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b3919062000362565b6000620000c1848262000433565b506001620000d0838262000433565b5060ff81166080524660a052620000e66200022d565b60c0525050506001600160a01b0392831660e0525050938416610100529183166101205290821661016052166101405250620006cf565b6060816001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200015e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000188919081019062000525565b6040516020016200019a9190620005dd565b6040516020818303038152906040529050919050565b6060816001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620001f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200021b919081019062000525565b6040516020016200019a919062000624565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405162000261919062000651565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b0381168114620002df57600080fd5b50565b600080600080600060a08688031215620002fb57600080fd5b85516200030881620002c9565b60208701519095506200031b81620002c9565b60408701519094506200032e81620002c9565b60608701519093506200034181620002c9565b60808701519092506200035481620002c9565b809150509295509295909350565b6000602082840312156200037557600080fd5b815160ff811681146200038757600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003b957607f821691505b602082108103620003da57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042e57600081815260208120601f850160051c81016020861015620004095750805b601f850160051c820191505b818110156200042a5782815560010162000415565b5050505b505050565b81516001600160401b038111156200044f576200044f6200038e565b6200046781620004608454620003a4565b84620003e0565b602080601f8311600181146200049f5760008415620004865750858301515b600019600386901b1c1916600185901b1785556200042a565b600085815260208120601f198616915b82811015620004d057888601518255948401946001909101908401620004af565b5085821015620004ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b838110156200051c57818101518382015260200162000502565b50506000910152565b6000602082840312156200053857600080fd5b81516001600160401b03808211156200055057600080fd5b818401915084601f8301126200056557600080fd5b8151818111156200057a576200057a6200038e565b604051601f8201601f19908116603f01168101908382118183101715620005a557620005a56200038e565b81604052828152876020848701011115620005bf57600080fd5b620005d2836020830160208801620004ff565b979650505050505050565b7f455243343632362d57726170706564204161766520763220000000000000000081526000825162000617816018850160208701620004ff565b9190910160180192915050565b623bb09960e91b81526000825162000644816003850160208701620004ff565b9190910160030192915050565b60008083546200066181620003a4565b600182811680156200067c57600181146200069257620006c3565b60ff1984168752821515830287019450620006c3565b8760005260208060002060005b85811015620006ba5781548a8201529084019082016200069f565b50505082870194505b50929695505050505050565b60805160a05160c05160e0516101005161012051610140516101605161276a620007f26000396000818161042301528181610a8a01528181610b8c01528181611081015281816112f70152818161134a0152818161144c0152818161191b01528181611a1d01528181611e380152611ed601526000818161028e01526109dc015260008181610520015261098b0152600081816103fc015281816105730152818161090b015281816115130152611ae401526000818161034101528181610b6101528181610cf501528181610dab0152818161104a015281816112c0015281816114210152818161153e015281816119f201528181611b0f01528181611e160152611e9a015260006108c501526000610895015260006102f6015261276a6000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c80637ecebe001161012a578063ba087652116100bd578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e146104dd578063ef8b30f714610508578063f71b865d1461051b57600080fd5b8063d505accf146104b7578063d905777e146104ca57600080fd5b8063ba0876521461047e578063c63d75b614610363578063c6e6f59214610491578063ce96cb77146104a457600080fd5b8063a59a9973116100f9578063a59a99731461041e578063a9059cbb14610445578063b3d7f6b914610458578063b460af941461046b57600080fd5b80637ecebe00146103bc57806394bf804d146103dc57806395d89b41146103ef578063a0c1f15e146103f757600080fd5b8063313ce567116101a2578063402d267d11610171578063402d267d146103635780634cdad506146103765780636e553f651461038957806370a082311461039c57600080fd5b8063313ce567146102f15780633644e5151461032a578063372500ab1461033257806338d52e0f1461033c57600080fd5b80630a28a477116101de5780630a28a4771461027657806317f333401461028957806318160ddd146102d557806323b872dd146102de57600080fd5b806301e1d1141461021057806306fdde031461022b57806307a2d13a14610240578063095ea7b314610253575b600080fd5b610218610542565b6040519081526020015b60405180910390f35b6102336105f8565b6040516102229190612083565b61021861024e3660046120ef565b610686565b61026661026136600461212d565b6106b3565b6040519015158152602001610222565b6102186102843660046120ef565b61072d565b6102b07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610222565b61021860025481565b6102666102ec366004612159565b61074d565b6103187f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610222565b610218610891565b61033a6108e7565b005b6102b07f000000000000000000000000000000000000000000000000000000000000000081565b61021861037136600461219a565b610a86565b6102186103843660046120ef565b610c54565b6102186103973660046121b7565b610c5f565b6102186103aa36600461219a565b60036020526000908152604090205481565b6102186103ca36600461219a565b60056020526000908152604090205481565b6102186103ea3660046121b7565b610d84565b610233610e3a565b6102b07f000000000000000000000000000000000000000000000000000000000000000081565b6102b07f000000000000000000000000000000000000000000000000000000000000000081565b61026661045336600461212d565b610e47565b6102186104663660046120ef565b610ecc565b6102186104793660046121e7565b610eeb565b61021861048c3660046121e7565b6110f7565b61021861049f3660046120ef565b611326565b6102186104b236600461219a565b611346565b61033a6104c5366004612238565b6115f8565b6102186104d836600461219a565b611917565b6102186104eb3660046122a9565b600460209081526000928352604080842090915290825290205481565b6102186105163660046120ef565b611bcb565b6102b07f000000000000000000000000000000000000000000000000000000000000000081565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156105cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f391906122d7565b905090565b60008054610605906122f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610631906122f0565b801561067e5780601f106106535761010080835404028352916020019161067e565b820191906000526020600020905b81548152906001019060200180831161066157829003601f168201915b505050505081565b60025460009080156106aa576106a561069d610542565b849083611bd6565b6106ac565b825b9392505050565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061071b9086815260200190565b60405180910390a35060015b92915050565b60025460009080156106aa576106a581610745610542565b859190611bf5565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107e1576107af8382612372565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604081208054859290610816908490612372565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061087e9087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146108c2576105f3611c23565b507f000000000000000000000000000000000000000000000000000000000000000090565b604080516001808252818301909252600091602080830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061093d5761093d612385565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f3111e7b30000000000000000000000000000000000000000000000000000000081526000917f00000000000000000000000000000000000000000000000000000000000000001690633111e7b390610a049085907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff907f0000000000000000000000000000000000000000000000000000000000000000906004016123b4565b6020604051808303816000875af1158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4791906122d7565b90507fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b281604051610a7a91815260200190565b60405180910390a15050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b179190612432565b15610b2457506000919050565b6040517f35ea6a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906335ea6a759060240161018060405180830381865afa158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa919061255e565b51519050670100000000000000811615158015610c1f57506702000000000000008116155b610c2c5750600092915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92915050565b600061072782610686565b6000610c6a83611bcb565b905080600003610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f53484152455300000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610d1d73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333086611cbd565b610d278282611d83565b604080518481526020810183905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36107278382611dfc565b6000610d8f83610ecc565b9050610dd373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084611cbd565b610ddd8284611d83565b604080518281526020810185905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36107278184611dfc565b60018054610605906122f0565b33600090815260036020526040812080548391908390610e68908490612372565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061071b9086815260200190565b60025460009080156106aa576106a5610ee3610542565b849083611bf5565b6000610ef68461072d565b90503373ffffffffffffffffffffffffffffffffffffffff831614610fab5773ffffffffffffffffffffffffffffffffffffffff821660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fa957610f778282612372565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020555b505b610fb58282611f36565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a46040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820186905284811660448301527f000000000000000000000000000000000000000000000000000000000000000016906369328dec906064015b6020604051808303816000875af11580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef91906122d7565b509392505050565b60003373ffffffffffffffffffffffffffffffffffffffff8316146111ac5773ffffffffffffffffffffffffffffffffffffffff821660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111aa576111788582612372565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020555b505b6111b584610c54565b905080600003611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f4153534554530000000000000000000000000000000000000000006044820152606401610cd2565b61122b8285611f36565b604080518281526020810186905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a46040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820183905284811660448301527f000000000000000000000000000000000000000000000000000000000000000016906369328dec906064016110ac565b60025460009080156106aa576106a58161133e610542565b859190611bd6565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d79190612432565b156113e457506000919050565b6040517f35ea6a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906335ea6a759060240161018060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba919061255e565b5151905067010000000000000081166114d65750600092915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab91906122d7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040812054919250906115de90610686565b90508082106115ed57806115ef565b815b95945050505050565b42841015611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610cd2565b6000600161166e610891565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156117c0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061183b57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610cd2565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a89190612432565b156119b557506000919050565b6040517f35ea6a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906335ea6a759060240161018060405180830381865afa158015611a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8b919061255e565b515190506701000000000000008116611aa75750600092915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7c91906122d7565b90506000611b8982611326565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260036020526040902054909150808210611bbf5780611bc1565b815b9695505050505050565b600061072782611326565b828202811515841585830485141716611bee57600080fd5b0492915050565b828202811515841585830485141716611c0d57600080fd5b6001826001830304018115150290509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611c55919061264b565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080611d7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610cd2565b5050505050565b8060026000828254611d959190612721565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b611e5d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000084611fc4565b6040517fe8eda9df00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052306044830152600060648301527f0000000000000000000000000000000000000000000000000000000000000000169063e8eda9df90608401600060405180830381600087803b158015611f1a57600080fd5b505af1158015611f2e573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290611f6b908490612372565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611df0565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d116001600051141617169150508061207d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152606401610cd2565b50505050565b600060208083528351808285015260005b818110156120b057858101830151858201604001528201612094565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561210157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461212a57600080fd5b50565b6000806040838503121561214057600080fd5b823561214b81612108565b946020939093013593505050565b60008060006060848603121561216e57600080fd5b833561217981612108565b9250602084013561218981612108565b929592945050506040919091013590565b6000602082840312156121ac57600080fd5b81356106ac81612108565b600080604083850312156121ca57600080fd5b8235915060208301356121dc81612108565b809150509250929050565b6000806000606084860312156121fc57600080fd5b83359250602084013561220e81612108565b9150604084013561221e81612108565b809150509250925092565b60ff8116811461212a57600080fd5b600080600080600080600060e0888a03121561225357600080fd5b873561225e81612108565b9650602088013561226e81612108565b95506040880135945060608801359350608088013561228c81612229565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156122bc57600080fd5b82356122c781612108565b915060208301356121dc81612108565b6000602082840312156122e957600080fd5b5051919050565b600181811c9082168061230457607f821691505b60208210810361233d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072757610727612343565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b606080825284519082018190526000906020906080840190828801845b8281101561240357815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016123d1565b505050908301949094525073ffffffffffffffffffffffffffffffffffffffff91909116604090910152919050565b60006020828403121561244457600080fd5b815180151581146106ac57600080fd5b604051610180810167ffffffffffffffff8111828210171561249f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6000602082840312156124b757600080fd5b6040516020810181811067ffffffffffffffff82111715612501577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529151825250919050565b80516fffffffffffffffffffffffffffffffff8116811461252e57600080fd5b919050565b805164ffffffffff8116811461252e57600080fd5b805161252e81612108565b805161252e81612229565b6000610180828403121561257157600080fd5b612579612454565b61258384846124a5565b81526125916020840161250e565b60208201526125a26040840161250e565b60408201526125b36060840161250e565b60608201526125c46080840161250e565b60808201526125d560a0840161250e565b60a08201526125e660c08401612533565b60c08201526125f760e08401612548565b60e082015261010061260a818501612548565b9082015261012061261c848201612548565b9082015261014061262e848201612548565b90820152610160612640848201612553565b908201529392505050565b600080835481600182811c91508083168061266757607f831692505b6020808410820361269f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156126b357600181146126e657612713565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650612713565b60008a81526020902060005b8681101561270b5781548b8201529085019083016126f2565b505084890196505b509498975050505050505050565b808201808211156107275761072761234356fea26469706673582212203b72e70b523f1ce223646dbd355589c171940436c1af0e5ebfb8a82d2e84ea5964736f6c63430008100033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b50000000000000000000000009a8fee232dcf73060af348a1b62cdb0a19852d130000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061020b5760003560e01c80637ecebe001161012a578063ba087652116100bd578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e146104dd578063ef8b30f714610508578063f71b865d1461051b57600080fd5b8063d505accf146104b7578063d905777e146104ca57600080fd5b8063ba0876521461047e578063c63d75b614610363578063c6e6f59214610491578063ce96cb77146104a457600080fd5b8063a59a9973116100f9578063a59a99731461041e578063a9059cbb14610445578063b3d7f6b914610458578063b460af941461046b57600080fd5b80637ecebe00146103bc57806394bf804d146103dc57806395d89b41146103ef578063a0c1f15e146103f757600080fd5b8063313ce567116101a2578063402d267d11610171578063402d267d146103635780634cdad506146103765780636e553f651461038957806370a082311461039c57600080fd5b8063313ce567146102f15780633644e5151461032a578063372500ab1461033257806338d52e0f1461033c57600080fd5b80630a28a477116101de5780630a28a4771461027657806317f333401461028957806318160ddd146102d557806323b872dd146102de57600080fd5b806301e1d1141461021057806306fdde031461022b57806307a2d13a14610240578063095ea7b314610253575b600080fd5b610218610542565b6040519081526020015b60405180910390f35b6102336105f8565b6040516102229190612083565b61021861024e3660046120ef565b610686565b61026661026136600461212d565b6106b3565b6040519015158152602001610222565b6102186102843660046120ef565b61072d565b6102b07f0000000000000000000000009a8fee232dcf73060af348a1b62cdb0a19852d1381565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610222565b61021860025481565b6102666102ec366004612159565b61074d565b6103187f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610222565b610218610891565b61033a6108e7565b005b6102b07f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61021861037136600461219a565b610a86565b6102186103843660046120ef565b610c54565b6102186103973660046121b7565b610c5f565b6102186103aa36600461219a565b60036020526000908152604090205481565b6102186103ca36600461219a565b60056020526000908152604090205481565b6102186103ea3660046121b7565b610d84565b610233610e3a565b6102b07f000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e81565b6102b07f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a981565b61026661045336600461212d565b610e47565b6102186104663660046120ef565b610ecc565b6102186104793660046121e7565b610eeb565b61021861048c3660046121e7565b6110f7565b61021861049f3660046120ef565b611326565b6102186104b236600461219a565b611346565b61033a6104c5366004612238565b6115f8565b6102186104d836600461219a565b611917565b6102186104eb3660046122a9565b600460209081526000928352604080842090915290825290205481565b6102186105163660046120ef565b611bcb565b6102b07f000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b581565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e73ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156105cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f391906122d7565b905090565b60008054610605906122f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610631906122f0565b801561067e5780601f106106535761010080835404028352916020019161067e565b820191906000526020600020905b81548152906001019060200180831161066157829003601f168201915b505050505081565b60025460009080156106aa576106a561069d610542565b849083611bd6565b6106ac565b825b9392505050565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061071b9086815260200190565b60405180910390a35060015b92915050565b60025460009080156106aa576106a581610745610542565b859190611bf5565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107e1576107af8382612372565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604081208054859290610816908490612372565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061087e9087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146108c2576105f3611c23565b507f33cb4a4e1a4ae7bb132bba805a966093af8d47f3a6b5d1e949ab0c2c37ef019590565b604080516001808252818301909252600091602080830190803683370190505090507f000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e8160008151811061093d5761093d612385565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f3111e7b30000000000000000000000000000000000000000000000000000000081526000917f000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b51690633111e7b390610a049085907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff907f0000000000000000000000009a8fee232dcf73060af348a1b62cdb0a19852d13906004016123b4565b6020604051808303816000875af1158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4791906122d7565b90507fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b281604051610a7a91815260200190565b60405180910390a15050565b60007f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a973ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b179190612432565b15610b2457506000919050565b6040517f35ea6a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660048301526000917f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9909116906335ea6a759060240161018060405180830381865afa158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa919061255e565b51519050670100000000000000811615158015610c1f57506702000000000000008116155b610c2c5750600092915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92915050565b600061072782610686565b6000610c6a83611bcb565b905080600003610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f53484152455300000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610d1d73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333086611cbd565b610d278282611d83565b604080518481526020810183905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36107278382611dfc565b6000610d8f83610ecc565b9050610dd373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333084611cbd565b610ddd8284611d83565b604080518281526020810185905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36107278184611dfc565b60018054610605906122f0565b33600090815260036020526040812080548391908390610e68908490612372565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061071b9086815260200190565b60025460009080156106aa576106a5610ee3610542565b849083611bf5565b6000610ef68461072d565b90503373ffffffffffffffffffffffffffffffffffffffff831614610fab5773ffffffffffffffffffffffffffffffffffffffff821660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fa957610f778282612372565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020555b505b610fb58282611f36565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a46040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660048301526024820186905284811660448301527f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a916906369328dec906064015b6020604051808303816000875af11580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef91906122d7565b509392505050565b60003373ffffffffffffffffffffffffffffffffffffffff8316146111ac5773ffffffffffffffffffffffffffffffffffffffff821660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111aa576111788582612372565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020555b505b6111b584610c54565b905080600003611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f4153534554530000000000000000000000000000000000000000006044820152606401610cd2565b61122b8285611f36565b604080518281526020810186905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a46040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660048301526024820183905284811660448301527f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a916906369328dec906064016110ac565b60025460009080156106aa576106a58161133e610542565b859190611bd6565b60007f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a973ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d79190612432565b156113e457506000919050565b6040517f35ea6a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660048301526000917f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9909116906335ea6a759060240161018060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba919061255e565b5151905067010000000000000081166114d65750600092915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e811660048301526000917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2909116906370a0823190602401602060405180830381865afa158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab91906122d7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040812054919250906115de90610686565b90508082106115ed57806115ef565b815b95945050505050565b42841015611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610cd2565b6000600161166e610891565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156117c0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061183b57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610cd2565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a973ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a89190612432565b156119b557506000919050565b6040517f35ea6a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660048301526000917f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9909116906335ea6a759060240161018060405180830381865afa158015611a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8b919061255e565b515190506701000000000000008116611aa75750600092915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e811660048301526000917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2909116906370a0823190602401602060405180830381865afa158015611b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7c91906122d7565b90506000611b8982611326565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260036020526040902054909150808210611bbf5780611bc1565b815b9695505050505050565b600061072782611326565b828202811515841585830485141716611bee57600080fd5b0492915050565b828202811515841585830485141716611c0d57600080fd5b6001826001830304018115150290509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611c55919061264b565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080611d7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610cd2565b5050505050565b8060026000828254611d959190612721565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b611e5d73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2167f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a984611fc4565b6040517fe8eda9df00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116600483015260248201849052306044830152600060648301527f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9169063e8eda9df90608401600060405180830381600087803b158015611f1a57600080fd5b505af1158015611f2e573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290611f6b908490612372565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611df0565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d116001600051141617169150508061207d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152606401610cd2565b50505050565b600060208083528351808285015260005b818110156120b057858101830151858201604001528201612094565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561210157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461212a57600080fd5b50565b6000806040838503121561214057600080fd5b823561214b81612108565b946020939093013593505050565b60008060006060848603121561216e57600080fd5b833561217981612108565b9250602084013561218981612108565b929592945050506040919091013590565b6000602082840312156121ac57600080fd5b81356106ac81612108565b600080604083850312156121ca57600080fd5b8235915060208301356121dc81612108565b809150509250929050565b6000806000606084860312156121fc57600080fd5b83359250602084013561220e81612108565b9150604084013561221e81612108565b809150509250925092565b60ff8116811461212a57600080fd5b600080600080600080600060e0888a03121561225357600080fd5b873561225e81612108565b9650602088013561226e81612108565b95506040880135945060608801359350608088013561228c81612229565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156122bc57600080fd5b82356122c781612108565b915060208301356121dc81612108565b6000602082840312156122e957600080fd5b5051919050565b600181811c9082168061230457607f821691505b60208210810361233d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072757610727612343565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b606080825284519082018190526000906020906080840190828801845b8281101561240357815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016123d1565b505050908301949094525073ffffffffffffffffffffffffffffffffffffffff91909116604090910152919050565b60006020828403121561244457600080fd5b815180151581146106ac57600080fd5b604051610180810167ffffffffffffffff8111828210171561249f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6000602082840312156124b757600080fd5b6040516020810181811067ffffffffffffffff82111715612501577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529151825250919050565b80516fffffffffffffffffffffffffffffffff8116811461252e57600080fd5b919050565b805164ffffffffff8116811461252e57600080fd5b805161252e81612108565b805161252e81612229565b6000610180828403121561257157600080fd5b612579612454565b61258384846124a5565b81526125916020840161250e565b60208201526125a26040840161250e565b60408201526125b36060840161250e565b60608201526125c46080840161250e565b60808201526125d560a0840161250e565b60a08201526125e660c08401612533565b60c08201526125f760e08401612548565b60e082015261010061260a818501612548565b9082015261012061261c848201612548565b9082015261014061262e848201612548565b90820152610160612640848201612553565b908201529392505050565b600080835481600182811c91508083168061266757607f831692505b6020808410820361269f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156126b357600181146126e657612713565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650612713565b60008a81526020902060005b8681101561270b5781548b8201529085019083016126f2565b505084890196505b509498975050505050505050565b808201808211156107275761072761234356fea26469706673582212203b72e70b523f1ce223646dbd355589c171940436c1af0e5ebfb8a82d2e84ea5964736f6c63430008100033

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

000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b50000000000000000000000009a8fee232dcf73060af348a1b62cdb0a19852d130000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9

-----Decoded View---------------
Arg [0] : asset_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : aToken_ (address): 0x030bA81f1c18d280636F32af80b9AAd02Cf0854e
Arg [2] : aaveMining_ (address): 0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5
Arg [3] : rewardRecipient_ (address): 0x9a8FEe232DCF73060Af348a1B62Cdb0a19852d13
Arg [4] : lendingPool_ (address): 0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e
Arg [2] : 000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
Arg [3] : 0000000000000000000000009a8fee232dcf73060af348a1b62cdb0a19852d13
Arg [4] : 0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9


Deployed Bytecode Sourcemap

33975:8300:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38322:227;;;:::i;:::-;;;160:25:1;;;148:2;133:18;38322:227:0;;;;;;;;15068:18;;;:::i;:::-;;;;;;;:::i;31314:261::-;;;;;;:::i;:::-;;:::i;16545:217::-;;;;;;:::i;:::-;;:::i;:::-;;;1637:14:1;;1630:22;1612:41;;1600:2;1585:18;16545:217:0;1472:187:1;31981:259:0;;;;;;:::i;:::-;;:::i;35216:40::-;;;;;;;;1840:42:1;1828:55;;;1810:74;;1798:2;1783:18;35216:40:0;1664:226:1;15351:26:0;;;;;;17163:612;;;;;;:::i;:::-;;:::i;15124:31::-;;;;;;;;2528:4:1;2516:17;;;2498:36;;2486:2;2471:18;15124:31:0;2356:184:1;19505:179:0;;;:::i;36222:263::-;;;:::i;:::-;;27902:28;;;;;39072:463;;;;;;:::i;:::-;;:::i;32248:126::-;;;;;;:::i;:::-;;:::i;28317:528::-;;;;;;:::i;:::-;;:::i;15386:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;15812:41;;;;;;:::i;:::-;;;;;;;;;;;;;;28853:478;;;;;;:::i;:::-;;:::i;15095:20::-;;;:::i;34993:29::-;;;;;35312:41;;;;;16770:385;;;;;;:::i;:::-;;:::i;31718:255::-;;;;;;:::i;:::-;;:::i;36684:814::-;;;;;;:::i;:::-;;:::i;37506:808::-;;;;;;:::i;:::-;;:::i;31045:261::-;;;;;;:::i;:::-;;:::i;40011:593::-;;;;;;:::i;:::-;;:::i;17970:1527::-;;;;;;:::i;:::-;;:::i;40612:642::-;;;;;;:::i;:::-;;:::i;15439:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;31583:127;;;;;;:::i;:::-;;:::i;35083:39::-;;;;;38322:227;38510:31;;;;;38535:4;38510:31;;;1810:74:1;38383:7:0;;38510:6;:16;;;;;1783:18:1;;38510:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38503:38;;38322:227;:::o;15068:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31314:261::-;31421:11;;31384:7;;31504:11;;:63;;31527:40;31545:13;:11;:13::i;:::-;31527:6;;31560;31527:17;:40::i;:::-;31504:63;;;31518:6;31504:63;31497:70;31314:261;-1:-1:-1;;;31314:261:0:o;16545:217::-;16646:10;16619:4;16636:21;;;:9;:21;;;;;;;;;:30;;;;;;;;;;:39;;;16693:37;16619:4;;16636:30;;16693:37;;;;16669:6;160:25:1;;148:2;133:18;;14:177;16693:37:0;;;;;;;;-1:-1:-1;16750:4:0;16545:217;;;;;:::o;31981:259::-;32088:11;;32051:7;;32171:11;;:61;;32194:38;32210:6;32218:13;:11;:13::i;:::-;32194:6;;:38;:15;:38::i;17163:612::-;17320:15;;;17285:4;17320:15;;;:9;:15;;;;;;;;17336:10;17320:27;;;;;;;;17411:17;17400:28;;17396:80;;17460:16;17470:6;17460:7;:16;:::i;:::-;17430:15;;;;;;;:9;:15;;;;;;;;17446:10;17430:27;;;;;;;:46;17396:80;17489:15;;;;;;;:9;:15;;;;;:25;;17508:6;;17489:15;:25;;17508:6;;17489:25;:::i;:::-;;;;-1:-1:-1;;17665:13:0;;;;;;;;:9;:13;;;;;;;:23;;;;;;17717:26;17665:13;;17717:26;;;;;;;17682:6;160:25:1;;148:2;133:18;;14:177;17717:26:0;;;;;;;;-1:-1:-1;17763:4:0;;17163:612;-1:-1:-1;;;;17163:612:0:o;19505:179::-;19562:7;19606:16;19589:13;:33;:87;;19652:24;:22;:24::i;19589:87::-;-1:-1:-1;19625:24:0;;19505:179::o;36222:263::-;36292:16;;;36306:1;36292:16;;;;;;;;;36266:23;;36292:16;;;;;;;;;;;-1:-1:-1;36292:16:0;36266:42;;36339:6;36319;36326:1;36319:9;;;;;;;;:::i;:::-;:27;;;;:9;;;;;;;;;:27;36374:67;;;;;36357:14;;36374:10;:23;;;;:67;;36398:6;;36406:17;;36425:15;;36374:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36357:84;;36457:20;36470:6;36457:20;;;;160:25:1;;148:2;133:18;;14:177;36457:20:0;;;;;;;;36255:230;;36222:263::o;39072:463::-;39139:7;39199:11;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39195:61;;;-1:-1:-1;39243:1:0;;39072:463;-1:-1:-1;39072:463:0:o;39195:61::-;39326:42;;;;;:26;39361:5;1828:55:1;;39326:42:0;;;1810:74:1;-1:-1:-1;;39326:11:0;:26;;;;;;1783:18:1;;39326:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;:61;;-1:-1:-1;34691:7:0;42100:24;;42099:31;;39404:49;;;;-1:-1:-1;34745:7:0;42234:24;;42233:31;39404:49;39398:93;;-1:-1:-1;39478:1:0;;39072:463;-1:-1:-1;;39072:463:0:o;39398:93::-;-1:-1:-1;39510:17:0;;39072:463;-1:-1:-1;;39072:463:0:o;32248:126::-;32316:7;32343:23;32359:6;32343:15;:23::i;28317:528::-;28392:14;28513:22;28528:6;28513:14;:22::i;:::-;28504:31;;;28540:1;28503:38;28495:62;;;;;;;11496:2:1;28495:62:0;;;11478:21:1;11535:2;11515:18;;;11508:30;11574:13;11554:18;;;11547:41;11605:18;;28495:62:0;;;;;;;;;28640:57;:22;:5;:22;28663:10;28683:4;28690:6;28640:22;:57::i;:::-;28710:23;28716:8;28726:6;28710:5;:23::i;:::-;28751:45;;;11808:25:1;;;11864:2;11849:18;;11842:34;;;28751:45:0;;;;28759:10;;28751:45;;11781:18:1;28751:45:0;;;;;;;28809:28;28822:6;28830;28809:12;:28::i;28853:478::-;28925:14;28961:19;28973:6;28961:11;:19::i;:::-;28952:28;-1:-1:-1;29126:57:0;:22;:5;:22;29149:10;29169:4;28952:28;29126:22;:57::i;:::-;29196:23;29202:8;29212:6;29196:5;:23::i;:::-;29237:45;;;11808:25:1;;;11864:2;11849:18;;11842:34;;;29237:45:0;;;;29245:10;;29237:45;;11781:18:1;29237:45:0;;;;;;;29295:28;29308:6;29316;29295:12;:28::i;15095:20::-;;;;;;;:::i;16770:385::-;16867:10;16840:4;16857:21;;;:9;:21;;;;;:31;;16882:6;;16857:21;16840:4;;16857:31;;16882:6;;16857:31;:::i;:::-;;;;-1:-1:-1;;17039:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;17091:32;17100:10;;17091:32;;;;17056:6;160:25:1;;148:2;133:18;;14:177;31718:255:0;31821:11;;31784:7;;31904:11;;:61;;31927:38;31943:13;:11;:13::i;:::-;31927:6;;31958;31927:15;:38::i;36684:814::-;36820:14;36861:23;36877:6;36861:15;:23::i;:::-;36852:32;-1:-1:-1;36968:10:0;:19;;;;36964:266;;37022:16;;;37004:15;37022:16;;;:9;:16;;;;;;;;37039:10;37022:28;;;;;;;;37118:17;37107:28;;37103:116;;37187:16;37197:6;37187:7;:16;:::i;:::-;37156;;;;;;;:9;:16;;;;;;;;37173:10;37156:28;;;;;;;:47;37103:116;36989:241;36964:266;37285:20;37291:5;37298:6;37285:5;:20::i;:::-;37323:53;;;11808:25:1;;;11864:2;11849:18;;11842:34;;;37323:53:0;;;;;;;;;37332:10;;37323:53;;11781:18:1;37323:53:0;;;;;;;37436:54;;;;;:20;37465:5;12168:15:1;;37436:54:0;;;12150:34:1;12200:18;;;12193:34;;;12263:15;;;12243:18;;;12236:43;37436:11:0;:20;;;;12062:18:1;;37436:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36684:814;;;;;:::o;37506:808::-;37604:14;37635:10;:19;;;;37631:266;;37689:16;;;37671:15;37689:16;;;:9;:16;;;;;;;;37706:10;37689:28;;;;;;;;37785:17;37774:28;;37770:116;;37854:16;37864:6;37854:7;:16;:::i;:::-;37823;;;;;;;:9;:16;;;;;;;;37840:10;37823:28;;;;;;;:47;37770:116;37656:241;37631:266;38002:21;38016:6;38002:13;:21::i;:::-;37993:30;;;38028:1;37992:37;37984:61;;;;;;;12492:2:1;37984:61:0;;;12474:21:1;12531:2;12511:18;;;12504:30;12570:13;12550:18;;;12543:41;12601:18;;37984:61:0;12290:335:1;37984:61:0;38101:20;38107:5;38114:6;38101:5;:20::i;:::-;38139:53;;;11808:25:1;;;11864:2;11849:18;;11842:34;;;38139:53:0;;;;;;;;;38148:10;;38139:53;;11781:18:1;38139:53:0;;;;;;;38252:54;;;;;:20;38281:5;12168:15:1;;38252:54:0;;;12150:34:1;12200:18;;;12193:34;;;12263:15;;;12243:18;;;12236:43;38252:11:0;:20;;;;12062:18:1;;38252:54:0;11887:398:1;31045:261:0;31152:11;;31115:7;;31235:11;;:63;;31258:40;31276:6;31284:13;:11;:13::i;:::-;31258:6;;:40;:17;:40::i;40011:593::-;40085:7;40145:11;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40141:61;;;-1:-1:-1;40189:1:0;;40011:593;-1:-1:-1;40011:593:0:o;40141:61::-;40272:42;;;;;:26;40307:5;1828:55:1;;40272:42:0;;;1810:74:1;-1:-1:-1;;40272:11:0;:26;;;;;;1783:18:1;;40272:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;:61;;-1:-1:-1;34691:7:0;42100:24;;40344:64;;-1:-1:-1;40395:1:0;;40011:593;-1:-1:-1;;40011:593:0:o;40344:64::-;40435:32;;;;;:15;40459:6;1828:55:1;;40435:32:0;;;1810:74:1;-1:-1:-1;;40435:5:0;:15;;;;;;1783:18:1;;40435:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40518:16;;;40478:21;40518:16;;;:9;:16;;;;;;40420:47;;-1:-1:-1;40478:21:0;40502:33;;:15;:33::i;:::-;40478:57;;40560:13;40553:4;:20;:43;;40583:13;40553:43;;;40576:4;40553:43;40546:50;40011:593;-1:-1:-1;;;;;40011:593:0:o;17970:1527::-;18198:15;18186:8;:27;;18178:63;;;;;;;12832:2:1;18178:63:0;;;12814:21:1;12871:2;12851:18;;;12844:30;12910:25;12890:18;;;12883:53;12953:18;;18178:63:0;12630:347:1;18178:63:0;18411:24;18438:827;18578:18;:16;:18::i;:::-;19032:13;;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;18663:458;;18708:167;18663:458;;;13269:25:1;13371:18;;;13364:43;;;;13443:15;;;13423:18;;;13416:43;13475:18;;;13468:34;;;13518:19;;;13511:35;;;;13562:19;;;;13555:35;;;18663:458:0;;;;;;;;;;13241:19:1;;;18663:458:0;;;18623:525;;;;;;;;13871:66:1;18498:673:0;;;13859:79:1;13954:11;;;13947:27;;;;13990:12;;;13983:28;;;;14027:12;;18498:673:0;;;;;;;;;;;;;18466:724;;18498:673;18466:724;;;;18438:827;;;;;;;;;14277:25:1;14350:4;14338:17;;14318:18;;;14311:45;14372:18;;;14365:34;;;14415:18;;;14408:34;;;14249:19;;18438:827:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18438:827:0;;;;;;-1:-1:-1;;19290:30:0;;;;;;;:59;;;19344:5;19324:25;;:16;:25;;;19290:59;19282:86;;;;;;;14655:2:1;19282:86:0;;;14637:21:1;14694:2;14674:18;;;14667:30;14733:16;14713:18;;;14706:44;14767:18;;19282:86:0;14453:338:1;19282:86:0;19385:27;;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;19458:31;160:25:1;;;19385:36:0;;19458:31;;;;;133:18:1;19458:31:0;;;;;;;17970:1527;;;;;;;:::o;40612:642::-;40684:7;40744:11;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40740:61;;;-1:-1:-1;40788:1:0;;40612:642;-1:-1:-1;40612:642:0:o;40740:61::-;40871:42;;;;;:26;40906:5;1828:55:1;;40871:42:0;;;1810:74:1;-1:-1:-1;;40871:11:0;:26;;;;;;1783:18:1;;40871:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;:61;;-1:-1:-1;34691:7:0;42100:24;;40943:64;;-1:-1:-1;40994:1:0;;40612:642;-1:-1:-1;;40612:642:0:o;40943:64::-;41034:32;;;;;:15;41058:6;1828:55:1;;41034:32:0;;;1810:74:1;-1:-1:-1;;41034:5:0;:15;;;;;;1783:18:1;;41034:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41019:47;;41077:20;41100:21;41116:4;41100:15;:21::i;:::-;41155:16;;;41132:20;41155:16;;;:9;:16;;;;;;41077:44;;-1:-1:-1;41189:27:0;;;:57;;41234:12;41189:57;;;41219:12;41189:57;41182:64;40612:642;-1:-1:-1;;;;;;40612:642:0:o;31583:127::-;31652:7;31679:23;31695:6;31679:15;:23::i;5442:552::-;5655:9;;;5789:19;;5782:27;5814:9;;5828;;;5825:16;;5811:31;5778:65;5768:123;;5874:1;5871;5864:12;5768:123;5957:19;;5442:552;-1:-1:-1;;5442:552:0:o;6002:771::-;6213:9;;;6347:19;;6340:27;6372:9;;6386;;;6383:16;;6369:31;6336:65;6326:123;;6432:1;6429;6422:12;6326:123;6752:1;6738:11;6734:1;6731;6727:9;6723:27;6719:35;6714:1;6707:9;6700:17;6696:59;6691:64;;6002:771;;;;;:::o;19692:457::-;19757:7;19858:95;19992:4;19976:22;;;;;;:::i;:::-;;;;;;;;;;19825:301;;;16437:25:1;;;;16478:18;;16471:34;;;;20021:14:0;16521:18:1;;;16514:34;20058:13:0;16564:18:1;;;16557:34;20102:4:0;16607:19:1;;;16600:84;16409:19;;19825:301:0;;;;;;;;;;;;19797:344;;;;;;19777:364;;19692:457;:::o;22306:1604::-;22450:12;22581:4;22575:11;22726:66;22707:17;22700:93;22841:4;22837:1;22818:17;22814:25;22807:39;22926:2;22921;22902:17;22898:26;22891:38;23007:6;23002:2;22983:17;22979:26;22972:42;23821:2;23818:1;23813:3;23794:17;23791:1;23784:5;23777;23772:52;23335:16;23328:24;23322:2;23304:16;23301:24;23297:1;23293;23287:8;23284:15;23280:46;23277:76;23074:765;23063:776;;;23870:7;23862:40;;;;;;;16897:2:1;23862:40:0;;;16879:21:1;16936:2;16916:18;;;16909:30;16975:22;16955:18;;;16948:50;17015:18;;23862:40:0;16695:344:1;23862:40:0;22439:1471;22306:1604;;;;:::o;20349:335::-;20435:6;20420:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;20592:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;20644:32;160:25:1;;;20644:32:0;;133:18:1;20644:32:0;;;;;;;;20349:335;;:::o;38557:507::-;38898:47;:17;:5;:17;38924:11;38938:6;38898:17;:47::i;:::-;38995:61;;;;;:19;39023:5;17491:15:1;;38995:61:0;;;17473:34:1;17523:18;;;17516:34;;;39047:4:0;17566:18:1;;;17559:43;-1:-1:-1;17618:18:1;;;17611:47;38995:11:0;:19;;;;17384::1;;38995:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38557:507;;:::o;20692:338::-;20765:15;;;;;;;:9;:15;;;;;:25;;20784:6;;20765:15;:25;;20784:6;;20765:25;:::i;:::-;;;;-1:-1:-1;;20938:11:0;:21;;;;;;;20988:34;;160:25:1;;;-1:-1:-1;;20988:34:0;;;;;;148:2:1;133:18;20988:34:0;14:177:1;25411:1483:0;25527:12;25658:4;25652:11;25803:66;25784:17;25777:93;25918:2;25914:1;25895:17;25891:25;25884:37;25999:6;25994:2;25975:17;25971:26;25964:42;26811:2;26808:1;26804:2;26785:17;26782:1;26775:5;26768;26763:51;26327:16;26320:24;26314:2;26296:16;26293:24;26289:1;26285;26279:8;26276:15;26272:46;26269:76;26066:763;26055:774;;;26860:7;26852:34;;;;;;;17871:2:1;26852:34:0;;;17853:21:1;17910:2;17890:18;;;17883:30;17949:16;17929:18;;;17922:44;17983:18;;26852:34:0;17669:338:1;26852:34:0;25516:1378;25411:1483;;;:::o;196:607:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;794:2;724:66;719:2;711:6;707:15;703:88;692:9;688:104;684:113;676:121;;;;196:607;;;;:::o;808:180::-;867:6;920:2;908:9;899:7;895:23;891:32;888:52;;;936:1;933;926:12;888:52;-1:-1:-1;959:23:1;;808:180;-1:-1:-1;808:180:1:o;993:154::-;1079:42;1072:5;1068:54;1061:5;1058:65;1048:93;;1137:1;1134;1127:12;1048:93;993:154;:::o;1152:315::-;1220:6;1228;1281:2;1269:9;1260:7;1256:23;1252:32;1249:52;;;1297:1;1294;1287:12;1249:52;1336:9;1323:23;1355:31;1380:5;1355:31;:::i;:::-;1405:5;1457:2;1442:18;;;;1429:32;;-1:-1:-1;;;1152:315:1:o;1895:456::-;1972:6;1980;1988;2041:2;2029:9;2020:7;2016:23;2012:32;2009:52;;;2057:1;2054;2047:12;2009:52;2096:9;2083:23;2115:31;2140:5;2115:31;:::i;:::-;2165:5;-1:-1:-1;2222:2:1;2207:18;;2194:32;2235:33;2194:32;2235:33;:::i;:::-;1895:456;;2287:7;;-1:-1:-1;;;2341:2:1;2326:18;;;;2313:32;;1895:456::o;2971:247::-;3030:6;3083:2;3071:9;3062:7;3058:23;3054:32;3051:52;;;3099:1;3096;3089:12;3051:52;3138:9;3125:23;3157:31;3182:5;3157:31;:::i;3223:315::-;3291:6;3299;3352:2;3340:9;3331:7;3327:23;3323:32;3320:52;;;3368:1;3365;3358:12;3320:52;3404:9;3391:23;3381:33;;3464:2;3453:9;3449:18;3436:32;3477:31;3502:5;3477:31;:::i;:::-;3527:5;3517:15;;;3223:315;;;;;:::o;3793:456::-;3870:6;3878;3886;3939:2;3927:9;3918:7;3914:23;3910:32;3907:52;;;3955:1;3952;3945:12;3907:52;3991:9;3978:23;3968:33;;4051:2;4040:9;4036:18;4023:32;4064:31;4089:5;4064:31;:::i;:::-;4114:5;-1:-1:-1;4171:2:1;4156:18;;4143:32;4184:33;4143:32;4184:33;:::i;:::-;4236:7;4226:17;;;3793:456;;;;;:::o;4254:114::-;4338:4;4331:5;4327:16;4320:5;4317:27;4307:55;;4358:1;4355;4348:12;4373:801;4484:6;4492;4500;4508;4516;4524;4532;4585:3;4573:9;4564:7;4560:23;4556:33;4553:53;;;4602:1;4599;4592:12;4553:53;4641:9;4628:23;4660:31;4685:5;4660:31;:::i;:::-;4710:5;-1:-1:-1;4767:2:1;4752:18;;4739:32;4780:33;4739:32;4780:33;:::i;:::-;4832:7;-1:-1:-1;4886:2:1;4871:18;;4858:32;;-1:-1:-1;4937:2:1;4922:18;;4909:32;;-1:-1:-1;4993:3:1;4978:19;;4965:33;5007:31;4965:33;5007:31;:::i;:::-;4373:801;;;;-1:-1:-1;4373:801:1;;;;5057:7;5111:3;5096:19;;5083:33;;-1:-1:-1;5163:3:1;5148:19;;;5135:33;;4373:801;-1:-1:-1;;4373:801:1:o;5179:388::-;5247:6;5255;5308:2;5296:9;5287:7;5283:23;5279:32;5276:52;;;5324:1;5321;5314:12;5276:52;5363:9;5350:23;5382:31;5407:5;5382:31;:::i;:::-;5432:5;-1:-1:-1;5489:2:1;5474:18;;5461:32;5502:33;5461:32;5502:33;:::i;5821:184::-;5891:6;5944:2;5932:9;5923:7;5919:23;5915:32;5912:52;;;5960:1;5957;5950:12;5912:52;-1:-1:-1;5983:16:1;;5821:184;-1:-1:-1;5821:184:1:o;6010:437::-;6089:1;6085:12;;;;6132;;;6153:61;;6207:4;6199:6;6195:17;6185:27;;6153:61;6260:2;6252:6;6249:14;6229:18;6226:38;6223:218;;6297:77;6294:1;6287:88;6398:4;6395:1;6388:15;6426:4;6423:1;6416:15;6223:218;;6010:437;;;:::o;6452:184::-;6504:77;6501:1;6494:88;6601:4;6598:1;6591:15;6625:4;6622:1;6615:15;6641:128;6708:9;;;6729:11;;;6726:37;;;6743:18;;:::i;6963:184::-;7015:77;7012:1;7005:88;7112:4;7109:1;7102:15;7136:4;7133:1;7126:15;7152:875;7398:2;7410:21;;;7480:13;;7383:18;;;7502:22;;;7350:4;;7578;;7555:3;7540:19;;;7605:15;;;7350:4;7648:218;7662:6;7659:1;7656:13;7648:218;;;7727:13;;7742:42;7723:62;7711:75;;7806:12;;;;7841:15;;;;7684:1;7677:9;7648:218;;;-1:-1:-1;;;7902:18:1;;;7895:34;;;;-1:-1:-1;7977:42:1;7965:55;;;;7960:2;7945:18;;;7938:83;7883:3;7152:875;-1:-1:-1;7152:875:1:o;8032:277::-;8099:6;8152:2;8140:9;8131:7;8127:23;8123:32;8120:52;;;8168:1;8165;8158:12;8120:52;8200:9;8194:16;8253:5;8246:13;8239:21;8232:5;8229:32;8219:60;;8275:1;8272;8265:12;8314:401;8381:2;8375:9;8423:3;8411:16;;8457:18;8442:34;;8478:22;;;8439:62;8436:242;;;8534:77;8531:1;8524:88;8635:4;8632:1;8625:15;8663:4;8660:1;8653:15;8436:242;8694:2;8687:22;8314:401;:::o;8720:580::-;8801:5;8849:4;8837:9;8832:3;8828:19;8824:30;8821:50;;;8867:1;8864;8857:12;8821:50;8900:2;8894:9;8942:4;8934:6;8930:17;9013:6;9001:10;8998:22;8977:18;8965:10;8962:34;8959:62;8956:242;;;9054:77;9051:1;9044:88;9155:4;9152:1;9145:15;9183:4;9180:1;9173:15;8956:242;9214:2;9207:22;9277:16;;9262:32;;-1:-1:-1;9247:6:1;8720:580;-1:-1:-1;8720:580:1:o;9305:192::-;9384:13;;9437:34;9426:46;;9416:57;;9406:85;;9487:1;9484;9477:12;9406:85;9305:192;;;:::o;9502:169::-;9580:13;;9633:12;9622:24;;9612:35;;9602:63;;9661:1;9658;9651:12;9676:138;9755:13;;9777:31;9755:13;9777:31;:::i;9819:134::-;9896:13;;9918:29;9896:13;9918:29;:::i;9958:1331::-;10055:6;10108:3;10096:9;10087:7;10083:23;10079:33;10076:53;;;10125:1;10122;10115:12;10076:53;10151:17;;:::i;:::-;10191:72;10255:7;10244:9;10191:72;:::i;:::-;10184:5;10177:87;10296:49;10341:2;10330:9;10326:18;10296:49;:::i;:::-;10291:2;10284:5;10280:14;10273:73;10378:49;10423:2;10412:9;10408:18;10378:49;:::i;:::-;10373:2;10366:5;10362:14;10355:73;10460:49;10505:2;10494:9;10490:18;10460:49;:::i;:::-;10455:2;10448:5;10444:14;10437:73;10543:50;10588:3;10577:9;10573:19;10543:50;:::i;:::-;10537:3;10530:5;10526:15;10519:75;10627:50;10672:3;10661:9;10657:19;10627:50;:::i;:::-;10621:3;10614:5;10610:15;10603:75;10711:49;10755:3;10744:9;10740:19;10711:49;:::i;:::-;10705:3;10698:5;10694:15;10687:74;10794:50;10839:3;10828:9;10824:19;10794:50;:::i;:::-;10788:3;10781:5;10777:15;10770:75;10864:3;10899:49;10944:2;10933:9;10929:18;10899:49;:::i;:::-;10883:14;;;10876:73;10968:3;11003:49;11033:18;;;11003:49;:::i;:::-;10987:14;;;10980:73;11072:3;11107:49;11137:18;;;11107:49;:::i;:::-;11091:14;;;11084:73;11176:3;11211:47;11239:18;;;11211:47;:::i;:::-;11195:14;;;11188:71;11199:5;9958:1331;-1:-1:-1;;;9958:1331:1:o;14925:1248::-;15055:3;15084:1;15117:6;15111:13;15147:3;15169:1;15197:9;15193:2;15189:18;15179:28;;15257:2;15246:9;15242:18;15279;15269:61;;15323:4;15315:6;15311:17;15301:27;;15269:61;15349:2;15397;15389:6;15386:14;15366:18;15363:38;15360:222;;15436:77;15431:3;15424:90;15537:4;15534:1;15527:15;15567:4;15562:3;15555:17;15360:222;15598:18;15625:191;;;;15830:1;15825:323;;;;15591:557;;15625:191;15673:66;15662:9;15658:82;15653:3;15646:95;15796:6;15789:14;15782:22;15774:6;15770:35;15765:3;15761:45;15754:52;;15625:191;;15825:323;14872:1;14865:14;;;14909:4;14896:18;;15923:1;15937:165;15951:6;15948:1;15945:13;15937:165;;;16029:14;;16016:11;;;16009:35;16072:16;;;;15966:10;;15937:165;;;15941:3;;16131:6;16126:3;16122:16;16115:23;;15591:557;-1:-1:-1;16164:3:1;;14925:1248;-1:-1:-1;;;;;;;;14925:1248:1:o;17044:125::-;17109:9;;;17130:10;;;17127:36;;;17143:18;;:::i

Swarm Source

ipfs://3b72e70b523f1ce223646dbd355589c171940436c1af0e5ebfb8a82d2e84ea59

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.