ETH Price: $3,101.66 (-2.56%)

Token

d3 Convex Plugin (d3convex)
 

Overview

Max Total Supply

0 d3convex

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ConvexERC4626

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-23
*/

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

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/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 {
            bytes32 digest = 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
                        )
                    )
                )
            );

            address recoveredAddress = ecrecover(digest, 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);
    }
}
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.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 callStatus;

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

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

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

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed output.
                success := 0
            }
        }
    }
}
/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/Rari-Capital/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 {
            // Start off with z at 1.
            z := 1

            // Used below to help find a nearby power of 2.
            let y := x

            // Find the lowest power of 2 that is at least sqrt(x).
            if iszero(lt(y, 0x100000000000000000000000000000000)) {
                y := shr(128, y) // Like dividing by 2 ** 128.
                z := shl(64, z)
            }
            if iszero(lt(y, 0x10000000000000000)) {
                y := shr(64, y) // Like dividing by 2 ** 64.
                z := shl(32, z)
            }
            if iszero(lt(y, 0x100000000)) {
                y := shr(32, y) // Like dividing by 2 ** 32.
                z := shl(16, z)
            }
            if iszero(lt(y, 0x10000)) {
                y := shr(16, y) // Like dividing by 2 ** 16.
                z := shl(8, z)
            }
            if iszero(lt(y, 0x100)) {
                y := shr(8, y) // Like dividing by 2 ** 8.
                z := shl(4, z)
            }
            if iszero(lt(y, 0x10)) {
                y := shr(4, y) // Like dividing by 2 ** 4.
                z := shl(2, z)
            }
            if iszero(lt(y, 0x8)) {
                // Equivalent to 2 ** z.
                z := shl(1, z)
            }

            // Shifting right by 1 is like dividing by 2.
            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)))

            // Compute a rounded down version of z.
            let zRoundDown := div(x, z)

            // If zRoundDown is smaller, use it.
            if lt(zRoundDown, z) {
                z := zRoundDown
            }
        }
    }
}

/// @notice Minimal ERC4646 tokenized Vault implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol)
/// @dev Do not use in production! ERC-4626 is still in the review stage and is subject to change.
abstract contract ERC4626 is ERC20 {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;

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

    event Deposit(address indexed from, address indexed to, uint256 amount, uint256 shares);

    event Withdraw(address indexed from, address indexed to, uint256 amount, uint256 shares);

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

    ERC20 public immutable asset;

    uint256 internal immutable ONE;

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

        unchecked {
            ONE = 10**decimals; // >77 decimals is unlikely.
        }
    }

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

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

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

        _mint(to, shares);

        emit Deposit(msg.sender, to, amount, shares);

        afterDeposit(amount, shares);
    }

    function mint(uint256 shares, address to) public virtual returns (uint256 amount) {
        amount = 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), amount);

        _mint(to, shares);

        emit Deposit(msg.sender, to, amount, shares);

        afterDeposit(amount, shares);
    }

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

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

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

        beforeWithdraw(amount, shares);

        _burn(from, shares);

        emit Withdraw(from, to, amount, shares);

        asset.safeTransfer(to, amount);
    }

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

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

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

        beforeWithdraw(amount, shares);

        _burn(from, shares);

        emit Withdraw(from, to, amount, shares);

        asset.safeTransfer(to, amount);
    }

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

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

    function assetsOf(address user) public view virtual returns (uint256) {
        return previewRedeem(balanceOf[user]);
    }

    function assetsPerShare() public view virtual returns (uint256) {
        return previewRedeem(ONE);
    }

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

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

    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 amount) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

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

    function previewRedeem(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);
    }

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

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

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

    function maxWithdraw(address user) public virtual returns (uint256) {
        return assetsOf(user);
    }

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

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

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

    function afterDeposit(uint256 amount, uint256 shares) internal virtual {}
}


/// @title Rewards Claiming Contract
/// @author joeysantoro
contract RewardsClaimer {
    using SafeTransferLib for ERC20;

    event RewardDestinationUpdate(address indexed newDestination);

    event ClaimRewards(address indexed rewardToken, uint256 amount);

    /// @notice the address to send rewards
    address public rewardDestination;

    /// @notice the array of reward tokens to send to
    ERC20[] public rewardTokens;

    constructor(
        address _rewardDestination, 
        ERC20[] memory _rewardTokens
    ) {
        rewardDestination = _rewardDestination;
        rewardTokens = _rewardTokens;
    }

    /// @notice claim all token rewards
    function claimRewards() public {
        beforeClaim(); // hook to accrue/pull in rewards, if needed

        uint256 len = rewardTokens.length;
        // send all tokens to destination
        for (uint256 i = 0; i < len; i++) {
            ERC20 token = rewardTokens[i];
            uint256 amount = token.balanceOf(address(this));        

            token.safeTransfer(rewardDestination, amount);

            emit ClaimRewards(address(token), amount);
        }
    }

    /// @notice set the address of the new reward destination
    /// @param newDestination the new reward destination
    function setRewardDestination(address newDestination) external {
        require(msg.sender == rewardDestination, "UNAUTHORIZED");
        rewardDestination = newDestination;
        emit RewardDestinationUpdate(newDestination);
    }

    /// @notice hook to accrue/pull in rewards, if needed
    function beforeClaim() internal virtual {}
}

// Docs: https://docs.convexfinance.com/convexfinanceintegration/booster

// main Convex contract(booster.sol) basic interface
interface IConvexBooster {
    // deposit into convex, receive a tokenized deposit. parameter to stake immediately
    function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns(bool);
}

interface IConvexBaseRewardPool {
    function pid() external view returns (uint256);
    function withdrawAndUnwrap(uint256 amount, bool claim) external returns(bool);
    function getReward(address _account, bool _claimExtras) external returns(bool);
    function balanceOf(address account) external view returns (uint256);
    function extraRewards(uint256 index) external view returns(IRewards);
    function extraRewardsLength() external view returns(uint);
    function rewardToken() external view returns(ERC20);
}

interface IRewards {
    function rewardToken() external view returns(ERC20);
}

/// @title Convex Finance Yield Bearing Vault
/// @author joeysantoro
contract ConvexERC4626 is ERC4626, RewardsClaimer {
    using SafeTransferLib for ERC20;

    /// @notice The Convex Booster contract (for deposit/withdraw)
    IConvexBooster public immutable convexBooster;
    
    /// @notice The Convex Rewards contract (for claiming rewards)
    IConvexBaseRewardPool public immutable convexRewards;

    uint256 public immutable pid;

    /**
     @notice Creates a new Vault that accepts a specific underlying token.
     @param _asset The ERC20 compliant token the Vault should accept.
     @param _name The name for the vault token.
     @param _symbol The symbol for the vault token.
     @param _convexBooster The Convex Booster contract (for deposit/withdraw).
     @param _convexRewards The Convex Rewards contract (for claiming rewards).
     @param _rewardsDestination the address to send CRV and CVX.
     @param _rewardTokens the rewards tokens to send out.
    */
    constructor(
        ERC20 _asset,
        string memory _name,
        string memory _symbol,
        IConvexBooster _convexBooster,
        IConvexBaseRewardPool _convexRewards,
        address _rewardsDestination,
        ERC20[] memory _rewardTokens
    )
        ERC4626(_asset, _name, _symbol)
        RewardsClaimer(_rewardsDestination, _rewardTokens)
    {
        convexBooster = _convexBooster;
        convexRewards = _convexRewards;

        pid = _convexRewards.pid();

        _asset.approve(address(_convexBooster), type(uint256).max);
    }

    function updateRewardTokens() public {
        uint256 len = convexRewards.extraRewardsLength();
        require(len < 5, "exceed max rewards");
        delete rewardTokens;

        for (uint256 i = 0; i < len; i++) {
            rewardTokens.push(convexRewards.extraRewards(i).rewardToken());
        }
        rewardTokens.push(convexRewards.rewardToken());
    }

    function afterDeposit(uint256 amount, uint256) internal override {
        require(convexBooster.deposit(pid, amount, true), "deposit error");
    }

    function beforeWithdraw(uint256 amount, uint256) internal override {
        require(convexRewards.withdrawAndUnwrap(amount, false), "withdraw error");
    }

    function beforeClaim() internal override {
        require(convexRewards.getReward(address(this), true), "rewards error");
    }

    /// @notice Calculates the total amount of underlying tokens the Vault holds.
    /// @return The total amount of underlying tokens the Vault holds.
    function totalAssets() public view override returns (uint256) {
        return convexRewards.balanceOf(address(this));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ERC20","name":"_asset","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract IConvexBooster","name":"_convexBooster","type":"address"},{"internalType":"contract IConvexBaseRewardPool","name":"_convexRewards","type":"address"},{"internalType":"address","name":"_rewardsDestination","type":"address"},{"internalType":"contract ERC20[]","name":"_rewardTokens","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":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","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"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newDestination","type":"address"}],"name":"RewardDestinationUpdate","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":[{"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":"user","type":"address"}],"name":"assetsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"convexBooster","outputs":[{"internalType":"contract IConvexBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexRewards","outputs":[{"internalType":"contract IConvexBaseRewardPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amount","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":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":"amount","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"from","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDestination","type":"address"}],"name":"setRewardDestination","outputs":[],"stateMutability":"nonpayable","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":[],"name":"updateRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"from","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6101806040523480156200001257600080fd5b506040516200269f3803806200269f83398101604081905262000035916200056c565b81818888888181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200007b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a1919062000650565b8251620000b6906000906020860190620002d2565b508151620000cc906001906020850190620002d2565b5060ff81166080524660a052620000e262000236565b60c052505050506001600160a01b0391821660e0525060805160ff16600a0a61010052600680546001600160a01b03191691841691909117905580516200013190600790602084019062000361565b5050506001600160a01b0380851661012052831661014081905260408051633c41a11560e21b8152905163f1068454916004808201926020929091908290030181865afa15801562000187573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ad91906200067c565b6101605260405163095ea7b360e01b81526001600160a01b038581166004830152600019602483015288169063095ea7b3906044016020604051808303816000875af115801562000202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000228919062000696565b50505050505050506200079b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516200026a9190620006f7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b828054620002e090620006ba565b90600052602060002090601f0160209004810192826200030457600085556200034f565b82601f106200031f57805160ff19168380011785556200034f565b828001600101855582156200034f579182015b828111156200034f57825182559160200191906001019062000332565b506200035d929150620003b9565b5090565b8280548282559060005260206000209081019282156200034f579160200282015b828111156200034f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000382565b5b808211156200035d5760008155600101620003ba565b6001600160a01b0381168114620003e657600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200042a576200042a620003e9565b604052919050565b600082601f8301126200044457600080fd5b81516001600160401b03811115620004605762000460620003e9565b602062000476601f8301601f19168201620003ff565b82815285828487010111156200048b57600080fd5b60005b83811015620004ab5785810183015182820184015282016200048e565b83811115620004bd5760008385840101525b5095945050505050565b8051620004d481620003d0565b919050565b600082601f830112620004eb57600080fd5b815160206001600160401b03821115620005095762000509620003e9565b8160051b6200051a828201620003ff565b92835284810182019282810190878511156200053557600080fd5b83870192505b84831015620005615782516200055181620003d0565b825291830191908301906200053b565b979650505050505050565b600080600080600080600060e0888a0312156200058857600080fd5b87516200059581620003d0565b60208901519097506001600160401b0380821115620005b357600080fd5b620005c18b838c0162000432565b975060408a0151915080821115620005d857600080fd5b620005e68b838c0162000432565b965060608a01519150620005fa82620003d0565b8195506200060b60808b01620004c7565b94506200061b60a08b01620004c7565b935060c08a01519150808211156200063257600080fd5b50620006418a828b01620004d9565b91505092959891949750929550565b6000602082840312156200066357600080fd5b815160ff811681146200067557600080fd5b9392505050565b6000602082840312156200068f57600080fd5b5051919050565b600060208284031215620006a957600080fd5b815180151581146200067557600080fd5b600181811c90821680620006cf57607f821691505b60208210811415620006f157634e487b7160e01b600052602260045260246000fd5b50919050565b600080835481600182811c9150808316806200071457607f831692505b60208084108214156200073557634e487b7160e01b86526022600452602486fd5b8180156200074c57600181146200075e576200078d565b60ff198616895284890196506200078d565b60008a81526020902060005b86811015620007855781548b8201529085019083016200076a565b505084890196505b509498975050505050505050565b60805160a05160c05160e05161010051610120516101405161016051611e4a620008556000396000818161053801526117940152600081816103d701528181610585015281816109e701528181610ae301528181610c000152818161154601526118960152600081816102bb01526117c80152600061082f01526000818161034d01528181610d0a01528181610e630152818161106901526111b70152600061088701526000610857015260006102fa0152611e4a6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806379054cc911610125578063ba087652116100ad578063d905777e1161007c578063d905777e146104cc578063dd62ed3e146104f5578063ef8b30f714610520578063f106845414610533578063fda45d861461055a57600080fd5b8063ba08765214610493578063c63d75b61461036f578063ce96cb77146104a6578063d505accf146104b957600080fd5b806394bf804d116100f457806394bf804d1461043f57806395d89b4114610452578063a9059cbb1461045a578063b3d7f6b91461046d578063b460af941461048057600080fd5b806379054cc9146103d25780637bb7bed1146103f95780637ecebe001461040c5780638457d0671461042c57600080fd5b806335d16e17116101a8578063402d267d11610177578063402d267d1461036f5780634cdad506146103845780634e8fd73a146103975780636e553f651461039f57806370a08231146103b257600080fd5b806335d16e171461032e5780633644e51514610336578063372500ab1461033e57806338d52e0f1461034857600080fd5b806318160ddd116101ef57806318160ddd1461028757806323b872dd146102905780632c62fa10146102a35780632cdacb50146102b6578063313ce567146102f557600080fd5b806301e1d1141461022157806306fdde031461023c578063095ea7b3146102515780630a28a47714610274575b600080fd5b61022961056d565b6040519081526020015b60405180910390f35b6102446105fd565b6040516102339190611a2b565b61026461025f366004611a95565b61068b565b6040519015158152602001610233565b610229610282366004611ac1565b6106f8565b61022960025481565b61026461029e366004611ada565b610726565b6102296102b1366004611b1b565b610806565b6102dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610233565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610233565b610229610828565b610229610853565b6103466108a9565b005b6102dd7f000000000000000000000000000000000000000000000000000000000000000081565b61022961037d366004611b1b565b5060001990565b610229610392366004611ac1565b6109c4565b6103466109e3565b6102296103ad366004611b38565b610cb5565b6102296103c0366004611b1b565b60036020526000908152604090205481565b6102dd7f000000000000000000000000000000000000000000000000000000000000000081565b6102dd610407366004611ac1565b610d8c565b61022961041a366004611b1b565b60056020526000908152604090205481565b61034661043a366004611b1b565b610db6565b61022961044d366004611b38565b610e49565b610244610ee5565b610264610468366004611a95565b610ef2565b61022961047b366004611ac1565b610f58565b61022961048e366004611b68565b610f77565b6102296104a1366004611b68565b611090565b6102296104b4366004611b1b565b6111e6565b6103466104c7366004611baa565b6111f1565b6102296104da366004611b1b565b6001600160a01b031660009081526003602052604090205490565b610229610503366004611c21565b600460209081526000928352604080842090915290825290205481565b61022961052e366004611ac1565b611442565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6006546102dd906001600160a01b031681565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156105d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f89190611c4f565b905090565b6000805461060a90611c68565b80601f016020809104026020016040519081016040528092919081815260200182805461063690611c68565b80156106835780601f1061065857610100808354040283529160200191610683565b820191906000526020600020905b81548152906001019060200180831161066657829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106e69086815260200190565b60405180910390a35060015b92915050565b600254600090801561071d576107188161071061056d565b859190611462565b61071f565b825b9392505050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146107825761075d8382611cb9565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906107aa908490611cb9565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020611df5833981519152906107f39087815260200190565b60405180910390a3506001949350505050565b6001600160a01b0381166000908152600360205260408120546106f2906109c4565b60006105f87f00000000000000000000000000000000000000000000000000000000000000006109c4565b60007f00000000000000000000000000000000000000000000000000000000000000004614610884576105f8611490565b507f000000000000000000000000000000000000000000000000000000000000000090565b6108b161152a565b60075460005b818110156109c0576000600782815481106108d4576108d4611cd0565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b9190611c4f565b600654909150610968906001600160a01b038481169116836115f9565b816001600160a01b03167f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc67826040516109a391815260200190565b60405180910390a2505080806109b890611ce6565b9150506108b7565b5050565b600254600090801561071d576107186109db61056d565b849083611678565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611c4f565b905060058110610ab35760405162461bcd60e51b8152602060048201526012602482015271657863656564206d6178207265776172647360701b60448201526064015b60405180910390fd5b610abf600760006119f1565b60005b81811015610bfb57604051632061aa2360e11b8152600481018290526007907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c3544690602401602060405180830381865afa158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b569190611d01565b6001600160a01b031663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb79190611d01565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610bf381611ce6565b915050610ac2565b5060077f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c809190611d01565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905550565b6000610cc083611442565b905080610cfd5760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f53484152455360a81b6044820152606401610aaa565b610d326001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086611697565b610d3c828261172b565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36106f28382611785565b60078181548110610d9c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6006546001600160a01b03163314610dff5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610aaa565b600680546001600160a01b0319166001600160a01b0383169081179091556040517fb7e97ad603f12568684fc43c82127d953e94f3954cf36344cbbfa34d67b0b0cf90600090a250565b6000610e5483610f58565b9050610e8b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611697565b610e95828461172b565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36106f28184611785565b6001805461060a90611c68565b33600090815260036020526040812080548391908390610f13908490611cb9565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020611df5833981519152906106e69086815260200190565b600254600090801561071d57610718610f6f61056d565b849083611462565b6000610f82846106f8565b9050336001600160a01b03831614610ff2576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610ff057610fcb8282611cb9565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610ffc8482611879565b6110068282611948565b826001600160a01b0316826001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5678684604051611054929190918252602082015260400190565b60405180910390a361071f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684866115f9565b6001600160a01b03811660008181526004602090815260408083203380855292528220549192148015906110c657506000198114155b156110fa576110d58582611cb9565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b611103856109c4565b9150816111405760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f41535345545360a81b6044820152606401610aaa565b61114a8286611879565b6111548386611948565b836001600160a01b0316836001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56784886040516111a2929190918252602082015260400190565b60405180910390a36111de6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685846115f9565b509392505050565b60006106f282610806565b428410156112415760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610aaa565b600061124b610853565b6001600160a01b0389811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611364573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061139a5750886001600160a01b0316816001600160a01b0316145b6113d75760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610aaa565b6001600160a01b0390811660009081526004602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600254600090801561071d576107188161145a61056d565b859190611678565b82820281151584158583048514171661147a57600080fd5b6001826001830304018115150290509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516114c29190611d1e565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b604051637050ccd960e01b8152306004820152600160248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637050ccd9906044016020604051808303816000875af1158015611597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bb9190611dba565b6115f75760405162461bcd60e51b815260206004820152600d60248201526c3932bbb0b932399032b93937b960991b6044820152606401610aaa565b565b600060405163a9059cbb60e01b81526001600160a01b03841660048201528260248201526000806044836000895af1915050611634816119aa565b6116725760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610aaa565b50505050565b82820281151584158583048514171661169057600080fd5b0492915050565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af19150506116e1816119aa565b6117245760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610aaa565b5050505050565b806002600082825461173d9190611ddc565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020611df583398151915291015b60405180910390a35050565b6040516321d0683360e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015260248101839052600160448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906343a0d066906064016020604051808303816000875af1158015611819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183d9190611dba565b6109c05760405162461bcd60e51b815260206004820152600d60248201526c3232b837b9b4ba1032b93937b960991b6044820152606401610aaa565b604051636197390160e11b815260048101839052600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c32e7202906044016020604051808303816000875af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190611dba565b6109c05760405162461bcd60e51b815260206004820152600e60248201526d3bb4ba34323930bb9032b93937b960911b6044820152606401610aaa565b6001600160a01b03821660009081526003602052604081208054839290611970908490611cb9565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020611df583398151915290602001611779565b60003d826119bc57806000803e806000fd5b80602081146119d45780156119e557600092506119ea565b816000803e600051151592506119ea565b600192505b5050919050565b5080546000825590600052602060002090810190611a0f9190611a12565b50565b5b80821115611a275760008155600101611a13565b5090565b600060208083528351808285015260005b81811015611a5857858101830151858201604001528201611a3c565b81811115611a6a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611a0f57600080fd5b60008060408385031215611aa857600080fd5b8235611ab381611a80565b946020939093013593505050565b600060208284031215611ad357600080fd5b5035919050565b600080600060608486031215611aef57600080fd5b8335611afa81611a80565b92506020840135611b0a81611a80565b929592945050506040919091013590565b600060208284031215611b2d57600080fd5b813561071f81611a80565b60008060408385031215611b4b57600080fd5b823591506020830135611b5d81611a80565b809150509250929050565b600080600060608486031215611b7d57600080fd5b833592506020840135611b8f81611a80565b91506040840135611b9f81611a80565b809150509250925092565b600080600080600080600060e0888a031215611bc557600080fd5b8735611bd081611a80565b96506020880135611be081611a80565b95506040880135945060608801359350608088013560ff81168114611c0457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611c3457600080fd5b8235611c3f81611a80565b91506020830135611b5d81611a80565b600060208284031215611c6157600080fd5b5051919050565b600181811c90821680611c7c57607f821691505b60208210811415611c9d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611ccb57611ccb611ca3565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611cfa57611cfa611ca3565b5060010190565b600060208284031215611d1357600080fd5b815161071f81611a80565b600080835481600182811c915080831680611d3a57607f831692505b6020808410821415611d5a57634e487b7160e01b86526022600452602486fd5b818015611d6e5760018114611d7f57611dac565b60ff19861689528489019650611dac565b60008a81526020902060005b86811015611da45781548b820152908501908301611d8b565b505084890196505b509498975050505050505050565b600060208284031215611dcc57600080fd5b8151801515811461071f57600080fd5b60008219821115611def57611def611ca3565b50019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122021b6c38fa91e0fb8a7c88e8b997e138ee3fc88caa9ae70315d5487baab1a527964736f6c634300080a0033000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc8900000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef00000000000000000000000097b8c935e130cba777579ea2460c4c3e78a48a6100000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000010643320436f6e76657820506c7567696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086433636f6e76657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806379054cc911610125578063ba087652116100ad578063d905777e1161007c578063d905777e146104cc578063dd62ed3e146104f5578063ef8b30f714610520578063f106845414610533578063fda45d861461055a57600080fd5b8063ba08765214610493578063c63d75b61461036f578063ce96cb77146104a6578063d505accf146104b957600080fd5b806394bf804d116100f457806394bf804d1461043f57806395d89b4114610452578063a9059cbb1461045a578063b3d7f6b91461046d578063b460af941461048057600080fd5b806379054cc9146103d25780637bb7bed1146103f95780637ecebe001461040c5780638457d0671461042c57600080fd5b806335d16e17116101a8578063402d267d11610177578063402d267d1461036f5780634cdad506146103845780634e8fd73a146103975780636e553f651461039f57806370a08231146103b257600080fd5b806335d16e171461032e5780633644e51514610336578063372500ab1461033e57806338d52e0f1461034857600080fd5b806318160ddd116101ef57806318160ddd1461028757806323b872dd146102905780632c62fa10146102a35780632cdacb50146102b6578063313ce567146102f557600080fd5b806301e1d1141461022157806306fdde031461023c578063095ea7b3146102515780630a28a47714610274575b600080fd5b61022961056d565b6040519081526020015b60405180910390f35b6102446105fd565b6040516102339190611a2b565b61026461025f366004611a95565b61068b565b6040519015158152602001610233565b610229610282366004611ac1565b6106f8565b61022960025481565b61026461029e366004611ada565b610726565b6102296102b1366004611b1b565b610806565b6102dd7f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae3181565b6040516001600160a01b039091168152602001610233565b61031c7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610233565b610229610828565b610229610853565b6103466108a9565b005b6102dd7f000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc8981565b61022961037d366004611b1b565b5060001990565b610229610392366004611ac1565b6109c4565b6103466109e3565b6102296103ad366004611b38565b610cb5565b6102296103c0366004611b1b565b60036020526000908152604090205481565b6102dd7f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef81565b6102dd610407366004611ac1565b610d8c565b61022961041a366004611b1b565b60056020526000908152604090205481565b61034661043a366004611b1b565b610db6565b61022961044d366004611b38565b610e49565b610244610ee5565b610264610468366004611a95565b610ef2565b61022961047b366004611ac1565b610f58565b61022961048e366004611b68565b610f77565b6102296104a1366004611b68565b611090565b6102296104b4366004611b1b565b6111e6565b6103466104c7366004611baa565b6111f1565b6102296104da366004611b1b565b6001600160a01b031660009081526003602052604090205490565b610229610503366004611c21565b600460209081526000928352604080842090915290825290205481565b61022961052e366004611ac1565b611442565b6102297f000000000000000000000000000000000000000000000000000000000000003a81565b6006546102dd906001600160a01b031681565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef6001600160a01b0316906370a0823190602401602060405180830381865afa1580156105d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f89190611c4f565b905090565b6000805461060a90611c68565b80601f016020809104026020016040519081016040528092919081815260200182805461063690611c68565b80156106835780601f1061065857610100808354040283529160200191610683565b820191906000526020600020905b81548152906001019060200180831161066657829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106e69086815260200190565b60405180910390a35060015b92915050565b600254600090801561071d576107188161071061056d565b859190611462565b61071f565b825b9392505050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146107825761075d8382611cb9565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906107aa908490611cb9565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020611df5833981519152906107f39087815260200190565b60405180910390a3506001949350505050565b6001600160a01b0381166000908152600360205260408120546106f2906109c4565b60006105f87f0000000000000000000000000000000000000000000000000de0b6b3a76400006109c4565b60007f00000000000000000000000000000000000000000000000000000000000000014614610884576105f8611490565b507f6c221339a7dfa2db7b8dec21e257b33b07ee9c0ecc4e57f852a40e536dbbc31c90565b6108b161152a565b60075460005b818110156109c0576000600782815481106108d4576108d4611cd0565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b9190611c4f565b600654909150610968906001600160a01b038481169116836115f9565b816001600160a01b03167f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc67826040516109a391815260200190565b60405180910390a2505080806109b890611ce6565b9150506108b7565b5050565b600254600090801561071d576107186109db61056d565b849083611678565b60007f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef6001600160a01b031663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611c4f565b905060058110610ab35760405162461bcd60e51b8152602060048201526012602482015271657863656564206d6178207265776172647360701b60448201526064015b60405180910390fd5b610abf600760006119f1565b60005b81811015610bfb57604051632061aa2360e11b8152600481018290526007907f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef6001600160a01b0316906340c3544690602401602060405180830381865afa158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b569190611d01565b6001600160a01b031663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb79190611d01565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610bf381611ce6565b915050610ac2565b5060077f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef6001600160a01b031663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c809190611d01565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905550565b6000610cc083611442565b905080610cfd5760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f53484152455360a81b6044820152606401610aaa565b610d326001600160a01b037f000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc8916333086611697565b610d3c828261172b565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36106f28382611785565b60078181548110610d9c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6006546001600160a01b03163314610dff5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610aaa565b600680546001600160a01b0319166001600160a01b0383169081179091556040517fb7e97ad603f12568684fc43c82127d953e94f3954cf36344cbbfa34d67b0b0cf90600090a250565b6000610e5483610f58565b9050610e8b6001600160a01b037f000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc8916333084611697565b610e95828461172b565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36106f28184611785565b6001805461060a90611c68565b33600090815260036020526040812080548391908390610f13908490611cb9565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020611df5833981519152906106e69086815260200190565b600254600090801561071d57610718610f6f61056d565b849083611462565b6000610f82846106f8565b9050336001600160a01b03831614610ff2576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610ff057610fcb8282611cb9565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610ffc8482611879565b6110068282611948565b826001600160a01b0316826001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5678684604051611054929190918252602082015260400190565b60405180910390a361071f6001600160a01b037f000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc891684866115f9565b6001600160a01b03811660008181526004602090815260408083203380855292528220549192148015906110c657506000198114155b156110fa576110d58582611cb9565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b611103856109c4565b9150816111405760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f41535345545360a81b6044820152606401610aaa565b61114a8286611879565b6111548386611948565b836001600160a01b0316836001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56784886040516111a2929190918252602082015260400190565b60405180910390a36111de6001600160a01b037f000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc891685846115f9565b509392505050565b60006106f282610806565b428410156112415760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610aaa565b600061124b610853565b6001600160a01b0389811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611364573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061139a5750886001600160a01b0316816001600160a01b0316145b6113d75760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610aaa565b6001600160a01b0390811660009081526004602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600254600090801561071d576107188161145a61056d565b859190611678565b82820281151584158583048514171661147a57600080fd5b6001826001830304018115150290509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516114c29190611d1e565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b604051637050ccd960e01b8152306004820152600160248201527f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef6001600160a01b031690637050ccd9906044016020604051808303816000875af1158015611597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bb9190611dba565b6115f75760405162461bcd60e51b815260206004820152600d60248201526c3932bbb0b932399032b93937b960991b6044820152606401610aaa565b565b600060405163a9059cbb60e01b81526001600160a01b03841660048201528260248201526000806044836000895af1915050611634816119aa565b6116725760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610aaa565b50505050565b82820281151584158583048514171661169057600080fd5b0492915050565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af19150506116e1816119aa565b6117245760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610aaa565b5050505050565b806002600082825461173d9190611ddc565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020611df583398151915291015b60405180910390a35050565b6040516321d0683360e11b81527f000000000000000000000000000000000000000000000000000000000000003a600482015260248101839052600160448201527f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b0316906343a0d066906064016020604051808303816000875af1158015611819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183d9190611dba565b6109c05760405162461bcd60e51b815260206004820152600d60248201526c3232b837b9b4ba1032b93937b960991b6044820152606401610aaa565b604051636197390160e11b815260048101839052600060248201527f000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef6001600160a01b03169063c32e7202906044016020604051808303816000875af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190611dba565b6109c05760405162461bcd60e51b815260206004820152600e60248201526d3bb4ba34323930bb9032b93937b960911b6044820152606401610aaa565b6001600160a01b03821660009081526003602052604081208054839290611970908490611cb9565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020611df583398151915290602001611779565b60003d826119bc57806000803e806000fd5b80602081146119d45780156119e557600092506119ea565b816000803e600051151592506119ea565b600192505b5050919050565b5080546000825590600052602060002090810190611a0f9190611a12565b50565b5b80821115611a275760008155600101611a13565b5090565b600060208083528351808285015260005b81811015611a5857858101830151858201604001528201611a3c565b81811115611a6a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611a0f57600080fd5b60008060408385031215611aa857600080fd5b8235611ab381611a80565b946020939093013593505050565b600060208284031215611ad357600080fd5b5035919050565b600080600060608486031215611aef57600080fd5b8335611afa81611a80565b92506020840135611b0a81611a80565b929592945050506040919091013590565b600060208284031215611b2d57600080fd5b813561071f81611a80565b60008060408385031215611b4b57600080fd5b823591506020830135611b5d81611a80565b809150509250929050565b600080600060608486031215611b7d57600080fd5b833592506020840135611b8f81611a80565b91506040840135611b9f81611a80565b809150509250925092565b600080600080600080600060e0888a031215611bc557600080fd5b8735611bd081611a80565b96506020880135611be081611a80565b95506040880135945060608801359350608088013560ff81168114611c0457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611c3457600080fd5b8235611c3f81611a80565b91506020830135611b5d81611a80565b600060208284031215611c6157600080fd5b5051919050565b600181811c90821680611c7c57607f821691505b60208210811415611c9d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611ccb57611ccb611ca3565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611cfa57611cfa611ca3565b5060010190565b600060208284031215611d1357600080fd5b815161071f81611a80565b600080835481600182811c915080831680611d3a57607f831692505b6020808410821415611d5a57634e487b7160e01b86526022600452602486fd5b818015611d6e5760018114611d7f57611dac565b60ff19861689528489019650611dac565b60008a81526020902060005b86811015611da45781548b820152908501908301611d8b565b505084890196505b509498975050505050505050565b600060208284031215611dcc57600080fd5b8151801515811461071f57600080fd5b60008219821115611def57611def611ca3565b50019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122021b6c38fa91e0fb8a7c88e8b997e138ee3fc88caa9ae70315d5487baab1a527964736f6c634300080a0033

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

000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc8900000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef00000000000000000000000097b8c935e130cba777579ea2460c4c3e78a48a6100000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000010643320436f6e76657820506c7567696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086433636f6e76657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52

-----Decoded View---------------
Arg [0] : _asset (address): 0xBaaa1F5DbA42C3389bDbc2c9D2dE134F5cD0Dc89
Arg [1] : _name (string): d3 Convex Plugin
Arg [2] : _symbol (string): d3convex
Arg [3] : _convexBooster (address): 0xF403C135812408BFbE8713b5A23a04b3D48AAE31
Arg [4] : _convexRewards (address): 0x329cb014b562d5d42927cfF0dEdF4c13ab0442EF
Arg [5] : _rewardsDestination (address): 0x97b8c935e130cBa777579Ea2460c4C3e78a48a61
Arg [6] : _rewardTokens (address[]): 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B,0xD533a949740bb3306d119CC777fa900bA034cd52

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 000000000000000000000000baaa1f5dba42c3389bdbc2c9d2de134f5cd0dc89
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31
Arg [4] : 000000000000000000000000329cb014b562d5d42927cff0dedf4c13ab0442ef
Arg [5] : 00000000000000000000000097b8c935e130cba777579ea2460c4c3e78a48a61
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [8] : 643320436f6e76657820506c7567696e00000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [10] : 6433636f6e766578000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [13] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52


Deployed Bytecode Sourcemap

29826:2652:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32349:126;;;:::i;:::-;;;160:25:1;;;148:2;133:18;32349:126:0;;;;;;;;1051:18;;;:::i;:::-;;;;;;;:::i;2532:217::-;;;;;;:::i;:::-;;:::i;:::-;;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;2532:217:0;1254:187:1;25591:259:0;;;;;;:::i;:::-;;:::i;1335:26::-;;;;;;3150:612;;;;;;:::i;:::-;;:::i;24810:126::-;;;;;;:::i;:::-;;:::i;29991:45::-;;;;;;;;-1:-1:-1;;;;;2531:32:1;;;2513:51;;2501:2;2486:18;29991:45:0;2344:226:1;1107:31:0;;;;;;;;2747:4:1;2735:17;;;2717:36;;2705:2;2690:18;1107:31:0;2575:184:1;24944:108:0;;;:::i;5383:179::-;;;:::i;27824:487::-;;;:::i;:::-;;21671:28;;;;;26321:105;;;;;;:::i;:::-;-1:-1:-1;;;26401:17:0;26321:105;25858:259;;;;;;:::i;:::-;;:::i;31348:375::-;;;:::i;22222:510::-;;;;;;:::i;:::-;;:::i;1370:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;30117:52;;;;;27547:27;;;;;;:::i;:::-;;:::i;1798:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28440:238;;;;;;:::i;:::-;;:::i;22740:460::-;;;;;;:::i;:::-;;:::i;1078:20::-;;;:::i;2757:385::-;;;;;;:::i;:::-;;:::i;25328:255::-;;;;;;:::i;:::-;;:::i;23208:663::-;;;;;;:::i;:::-;;:::i;23879:666::-;;;;;;:::i;:::-;;:::i;26544:108::-;;;;;;:::i;:::-;;:::i;3959:1416::-;;;;;;:::i;:::-;;:::i;26660:107::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26744:15:0;26717:7;26744:15;;;:9;:15;;;;;;;26660:107;1423:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;25060:260;;;;;;:::i;:::-;;:::i;30178:28::-;;;;;27451:32;;;;;-1:-1:-1;;;;;27451:32:0;;;32349:126;32429:38;;-1:-1:-1;;;32429:38:0;;32461:4;32429:38;;;2513:51:1;32402:7:0;;32429:13;-1:-1:-1;;;;;32429:23:0;;;;2486:18:1;;32429:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32422:45;;32349:126;:::o;1051:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2532:217::-;2633:10;2606:4;2623:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;2623:30:0;;;;;;;;;;:39;;;2680:37;2606:4;;2623:30;;2680:37;;;;2656:6;160:25:1;;148:2;133:18;;14:177;2680:37:0;;;;;;;;-1:-1:-1;2737:4:0;2532:217;;;;;:::o;25591:259::-;25698:11;;25661:7;;25781:11;;:61;;25804:38;25820:6;25828:13;:11;:13::i;:::-;25804:6;;:38;:15;:38::i;:::-;25781:61;;;25795:6;25781:61;25774:68;25591:259;-1:-1:-1;;;25591:259:0:o;3150:612::-;-1:-1:-1;;;;;3307:15:0;;3272:4;3307:15;;;:9;:15;;;;;;;;3323:10;3307:27;;;;;;;;-1:-1:-1;;3387:28:0;;3383:80;;3447:16;3457:6;3447:7;:16;:::i;:::-;-1:-1:-1;;;;;3417:15:0;;;;;;:9;:15;;;;;;;;3433:10;3417:27;;;;;;;:46;3383:80;-1:-1:-1;;;;;3476:15:0;;;;;;:9;:15;;;;;:25;;3495:6;;3476:15;:25;;3495:6;;3476:25;:::i;:::-;;;;-1:-1:-1;;;;;;;3652:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;3704:26;3652:13;;3704:26;;;-1:-1:-1;;;;;;;;;;;3704:26:0;;;3669:6;160:25:1;;148:2;133:18;;14:177;3704:26:0;;;;;;;;-1:-1:-1;3750:4:0;;3150:612;-1:-1:-1;;;;3150:612:0:o;24810:126::-;-1:-1:-1;;;;;24912:15:0;;24871:7;24912:15;;;:9;:15;;;;;;24898:30;;:13;:30::i;24944:108::-;24999:7;25026:18;25040:3;25026:13;:18::i;5383:179::-;5440:7;5484:16;5467:13;:33;:87;;5530:24;:22;:24::i;5467:87::-;-1:-1:-1;5503:24:0;;5383:179::o;27824:487::-;27866:13;:11;:13::i;:::-;27951:12;:19;27937:11;28024:280;28048:3;28044:1;:7;28024:280;;;28073:11;28087:12;28100:1;28087:15;;;;;;;;:::i;:::-;;;;;;;;;;28134:30;;-1:-1:-1;;;28134:30:0;;28158:4;28134:30;;;2513:51:1;-1:-1:-1;;;;;28087:15:0;;;;-1:-1:-1;28087:15:0;;28134;;2486:18:1;;28134:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28208:17;;28117:47;;-1:-1:-1;28189:45:0;;-1:-1:-1;;;;;28189:18:0;;;;28208:17;28117:47;28189:18;:45::i;:::-;28277:5;-1:-1:-1;;;;;28256:36:0;;28285:6;28256:36;;;;160:25:1;;148:2;133:18;;14:177;28256:36:0;;;;;;;;28058:246;;28053:3;;;;;:::i;:::-;;;;28024:280;;;;27855:456;27824:487::o;25858:259::-;25963:11;;25926:7;;26046:11;;:63;;26069:40;26087:13;:11;:13::i;:::-;26069:6;;26102;26069:17;:40::i;31348:375::-;31396:11;31410:13;-1:-1:-1;;;;;31410:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31396:48;;31469:1;31463:3;:7;31455:38;;;;-1:-1:-1;;;31455:38:0;;6931:2:1;31455:38:0;;;6913:21:1;6970:2;6950:18;;;6943:30;-1:-1:-1;;;6989:18:1;;;6982:48;7047:18;;31455:38:0;;;;;;;;;31504:19;31511:12;;31504:19;:::i;:::-;31541:9;31536:123;31560:3;31556:1;:7;31536:123;;;31603:29;;-1:-1:-1;;;31603:29:0;;;;;160:25:1;;;31585:12:0;;31603:13;-1:-1:-1;;;;;31603:26:0;;;;133:18:1;;31603:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31603:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31585:62;;;;;;;-1:-1:-1;31585:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;31585:62:0;-1:-1:-1;;;;;31585:62:0;;;;;;;;;31565:3;;;;:::i;:::-;;;;31536:123;;;;31669:12;31687:13;-1:-1:-1;;;;;31687:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31669:46;;;;;;;-1:-1:-1;31669:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;31669:46:0;-1:-1:-1;;;;;31669:46:0;;;;;;;;;-1:-1:-1;31348:375:0:o;22222:510::-;22291:14;22412:22;22427:6;22412:14;:22::i;:::-;22403:31;-1:-1:-1;22402:38:0;22394:62;;;;-1:-1:-1;;;22394:62:0;;7820:2:1;22394:62:0;;;7802:21:1;7859:2;7839:18;;;7832:30;-1:-1:-1;;;7878:18:1;;;7871:41;7929:18;;22394:62:0;7618:335:1;22394:62:0;22539:57;-1:-1:-1;;;;;22539:5:0;:22;22562:10;22582:4;22589:6;22539:22;:57::i;:::-;22609:17;22615:2;22619:6;22609:5;:17::i;:::-;22644:39;;;8132:25:1;;;8188:2;8173:18;;8166:34;;;-1:-1:-1;;;;;22644:39:0;;;22652:10;;22644:39;;8105:18:1;22644:39:0;;;;;;;22696:28;22709:6;22717;22696:12;:28::i;27547:27::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27547:27:0;;-1:-1:-1;27547:27:0;:::o;28440:238::-;28536:17;;-1:-1:-1;;;;;28536:17:0;28522:10;:31;28514:56;;;;-1:-1:-1;;;28514:56:0;;8413:2:1;28514:56:0;;;8395:21:1;8452:2;8432:18;;;8425:30;-1:-1:-1;;;8471:18:1;;;8464:42;8523:18;;28514:56:0;8211:336:1;28514:56:0;28581:17;:34;;-1:-1:-1;;;;;;28581:34:0;-1:-1:-1;;;;;28581:34:0;;;;;;;;28631:39;;;;-1:-1:-1;;28631:39:0;28440:238;:::o;22740:460::-;22806:14;22842:19;22854:6;22842:11;:19::i;:::-;22833:28;-1:-1:-1;23007:57:0;-1:-1:-1;;;;;23007:5:0;:22;23030:10;23050:4;22833:28;23007:22;:57::i;:::-;23077:17;23083:2;23087:6;23077:5;:17::i;:::-;23112:39;;;8132:25:1;;;8188:2;8173:18;;8166:34;;;-1:-1:-1;;;;;23112:39:0;;;23120:10;;23112:39;;8105:18:1;23112:39:0;;;;;;;23164:28;23177:6;23185;23164:12;:28::i;1078:20::-;;;;;;;:::i;2757:385::-;2854:10;2827:4;2844:21;;;:9;:21;;;;;:31;;2869:6;;2844:21;2827:4;;2844:31;;2869:6;;2844:31;:::i;:::-;;;;-1:-1:-1;;;;;;;3026:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;3078:32;3087:10;;-1:-1:-1;;;;;;;;;;;3078:32:0;;;3043:6;160:25:1;;148:2;133:18;;14:177;25328:255:0;25431:11;;25394:7;;25514:11;;:61;;25537:38;25553:13;:11;:13::i;:::-;25537:6;;25568;25537:15;:38::i;23208:663::-;23326:14;23362:23;23378:6;23362:15;:23::i;:::-;23353:32;-1:-1:-1;23469:10:0;-1:-1:-1;;;;;23469:18:0;;;23465:229;;-1:-1:-1;;;;;23522:15:0;;23504;23522;;;:9;:15;;;;;;;;23538:10;23522:27;;;;;;;;-1:-1:-1;;23606:28:0;;23602:80;;23666:16;23676:6;23666:7;:16;:::i;:::-;-1:-1:-1;;;;;23636:15:0;;;;;;:9;:15;;;;;;;;23652:10;23636:27;;;;;;;:46;23602:80;23489:205;23465:229;23706:30;23721:6;23729;23706:14;:30::i;:::-;23749:19;23755:4;23761:6;23749:5;:19::i;:::-;23801:2;-1:-1:-1;;;;;23786:34:0;23795:4;-1:-1:-1;;;;;23786:34:0;;23805:6;23813;23786:34;;;;;;8132:25:1;;;8188:2;8173:18;;8166:34;8120:2;8105:18;;7958:248;23786:34:0;;;;;;;;23833:30;-1:-1:-1;;;;;23833:5:0;:18;23852:2;23856:6;23833:18;:30::i;23879:666::-;-1:-1:-1;;;;;24040:15:0;;23995:14;24040:15;;;:9;:15;;;;;;;;24056:10;24040:27;;;;;;;;23995:14;;24120:18;;;;:50;;;-1:-1:-1;;24142:7:0;:28;;24120:50;24116:102;;;24202:16;24212:6;24202:7;:16;:::i;:::-;-1:-1:-1;;;;;24172:15:0;;;;;;:9;:15;;;;;;;;24188:10;24172:27;;;;;;;:46;24116:102;24324:21;24338:6;24324:13;:21::i;:::-;24315:30;-1:-1:-1;24314:37:0;24306:61;;;;-1:-1:-1;;;24306:61:0;;8754:2:1;24306:61:0;;;8736:21:1;8793:2;8773:18;;;8766:30;-1:-1:-1;;;8812:18:1;;;8805:41;8863:18;;24306:61:0;8552:335:1;24306:61:0;24380:30;24395:6;24403;24380:14;:30::i;:::-;24423:19;24429:4;24435:6;24423:5;:19::i;:::-;24475:2;-1:-1:-1;;;;;24460:34:0;24469:4;-1:-1:-1;;;;;24460:34:0;;24479:6;24487;24460:34;;;;;;8132:25:1;;;8188:2;8173:18;;8166:34;8120:2;8105:18;;7958:248;24460:34:0;;;;;;;;24507:30;-1:-1:-1;;;;;24507:5:0;:18;24526:2;24530:6;24507:18;:30::i;:::-;24011:534;23879:666;;;;;:::o;26544:108::-;26603:7;26630:14;26639:4;26630:8;:14::i;3959:1416::-;4187:15;4175:8;:27;;4167:63;;;;-1:-1:-1;;;4167:63:0;;9094:2:1;4167:63:0;;;9076:21:1;9133:2;9113:18;;;9106:30;9172:25;9152:18;;;9145:53;9215:18;;4167:63:0;8892:347:1;4167:63:0;4400:14;4517:18;:16;:18::i;:::-;-1:-1:-1;;;;;4935:13:0;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;4594:422;;4635:159;4594:422;;;9531:25:1;9610:18;;;9603:43;;;;9682:15;;;9662:18;;;9655:43;9714:18;;;9707:34;;;9757:19;;;9750:35;;;;9801:19;;;;9794:35;;;4594:422:0;;;;;;;;;;9503:19:1;;;4594:422:0;;;4558:481;;;;;;;;-1:-1:-1;;;4445:613:0;;;10098:27:1;10141:11;;;10134:27;;;;10177:12;;;10170:28;;;;10214:12;;4445:613:0;;;-1:-1:-1;;4445:613:0;;;;;;;;;4417:656;;4445:613;4417:656;;;;5090:24;5117:26;;;;;;;;;10464:25:1;;;10537:4;10525:17;;10505:18;;;10498:45;;;;10559:18;;;10552:34;;;10602:18;;;10595:34;;;4417:656:0;;-1:-1:-1;5090:24:0;5117:26;;10436:19:1;;5117:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5117:26:0;;-1:-1:-1;;5117:26:0;;;-1:-1:-1;;;;;;;5168:30:0;;;;;;:59;;;5222:5;-1:-1:-1;;;;;5202:25:0;:16;-1:-1:-1;;;;;5202:25:0;;5168:59;5160:86;;;;-1:-1:-1;;;5160:86:0;;10842:2:1;5160:86:0;;;10824:21:1;10881:2;10861:18;;;10854:30;-1:-1:-1;;;10900:18:1;;;10893:44;10954:18;;5160:86:0;10640:338:1;5160:86:0;-1:-1:-1;;;;;5263:27:0;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;5336:31;160:25:1;;;5263:36:0;;-1:-1:-1;5336:31:0;;;;;;133:18:1;5336:31:0;;;;;;;3959:1416;;;;;;;:::o;25060:260::-;25166:11;;25129:7;;25249:11;;:63;;25272:40;25290:6;25298:13;:11;:13::i;:::-;25272:6;;:40;:17;:40::i;14937:771::-;15148:9;;;15282:19;;15275:27;15307:9;;15321;;;15318:16;;15304:31;15271:65;15261:123;;15367:1;15364;15357:12;15261:123;15687:1;15673:11;15669:1;15666;15662:9;15658:27;15654:35;15649:1;15642:9;15635:17;15631:59;15626:64;;14937:771;;;;;:::o;5570:457::-;5635:7;5736:95;5870:4;5854:22;;;;;;:::i;:::-;;;;;;;;;;5703:301;;;12480:25:1;;;;12521:18;;12514:34;;;;5899:14:0;12564:18:1;;;12557:34;5936:13:0;12607:18:1;;;12600:34;5980:4:0;12650:19:1;;;12643:61;12452:19;;5703:301:0;;;;;;;;;;;;5675:344;;;;;;5655:364;;5570:457;:::o;32056:130::-;32116:44;;-1:-1:-1;;;32116:44:0;;32148:4;32116:44;;;12883:51:1;32155:4:0;12950:18:1;;;12943:50;32116:13:0;-1:-1:-1;;;;;32116:23:0;;;;12856:18:1;;32116:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32108:70;;;;-1:-1:-1;;;32108:70:0;;13488:2:1;32108:70:0;;;13470:21:1;13527:2;13507:18;;;13500:30;-1:-1:-1;;;13546:18:1;;;13539:43;13599:18;;32108:70:0;13286:337:1;32108:70:0;32056:130::o;9496:1065::-;9613:15;9747:4;9741:11;-1:-1:-1;;;9848:17:0;9841:93;-1:-1:-1;;;;;10023:2:0;10019:51;10015:1;9996:17;9992:25;9985:86;10158:6;10153:2;10134:17;10130:26;10123:42;10456:1;10453;10449:2;10430:17;10427:1;10420:5;10413;10408:50;10394:64;;;10489:44;10522:10;10489:32;:44::i;:::-;10481:72;;;;-1:-1:-1;;;10481:72:0;;13830:2:1;10481:72:0;;;13812:21:1;13869:2;13849:18;;;13842:30;-1:-1:-1;;;13888:18:1;;;13881:45;13943:18;;10481:72:0;13628:339:1;10481:72:0;9602:959;9496:1065;;;:::o;14377:552::-;14590:9;;;14724:19;;14717:27;14749:9;;14763;;;14760:16;;14746:31;14713:65;14703:123;;14809:1;14806;14799:12;14703:123;14892:19;;14377:552;-1:-1:-1;;14377:552:0:o;8246:1242::-;8390:15;8524:4;8518:11;-1:-1:-1;;;8625:17:0;8618:93;-1:-1:-1;;;;;8800:4:0;8796:53;8792:1;8773:17;8769:25;8762:88;-1:-1:-1;;;;;8943:2:0;8939:51;8934:2;8915:17;8911:26;8904:87;9078:6;9073:2;9054:17;9050:26;9043:42;9378:1;9375;9370:3;9351:17;9348:1;9341:5;9334;9329:51;9315:65;;;9411:44;9444:10;9411:32;:44::i;:::-;9403:77;;;;-1:-1:-1;;;9403:77:0;;14174:2:1;9403:77:0;;;14156:21:1;14213:2;14193:18;;;14186:30;-1:-1:-1;;;14232:18:1;;;14225:50;14292:18;;9403:77:0;13972:344:1;9403:77:0;8379:1109;8246:1242;;;;:::o;6227:335::-;6313:6;6298:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6470:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;6522:32;160:25:1;;;-1:-1:-1;;;;;;;;;;;6522:32:0;133:18:1;6522:32:0;;;;;;;;6227:335;;:::o;31731:150::-;31815:40;;-1:-1:-1;;;31815:40:0;;31837:3;31815:40;;;14650:25:1;14691:18;;;14684:34;;;31850:4:0;14734:18:1;;;14727:50;31815:13:0;-1:-1:-1;;;;;31815:21:0;;;;14623:18:1;;31815:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31807:66;;;;-1:-1:-1;;;31807:66:0;;14990:2:1;31807:66:0;;;14972:21:1;15029:2;15009:18;;;15002:30;-1:-1:-1;;;15048:18:1;;;15041:43;15101:18;;31807:66:0;14788:337:1;31889:159:0;31975:46;;-1:-1:-1;;;31975:46:0;;;;;15298:25:1;;;32015:5:0;15339:18:1;;;15332:50;31975:13:0;-1:-1:-1;;;;;31975:31:0;;;;15271:18:1;;31975:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31967:73;;;;-1:-1:-1;;;31967:73:0;;15595:2:1;31967:73:0;;;15577:21:1;15634:2;15614:18;;;15607:30;-1:-1:-1;;;15653:18:1;;;15646:44;15707:18;;31967:73:0;15393:338:1;6570::0;-1:-1:-1;;;;;6643:15:0;;;;;;:9;:15;;;;;:25;;6662:6;;6643:15;:25;;6662:6;;6643:25;:::i;:::-;;;;-1:-1:-1;;6816:11:0;:21;;;;;;;6866:34;;160:25:1;;;-1:-1:-1;;;;;;;6866:34:0;;;-1:-1:-1;;;;;;;;;;;6866:34:0;148:2:1;133:18;6866:34:0;14:177:1;11831:1073:0;11912:12;12037:16;12117:10;12107:244;;12226:14;12223:1;12220;12205:36;12321:14;12318:1;12311:25;12107:244;12374:14;12407:2;12402:248;;;;12664:99;;;;12870:1;12859:12;;12367:519;;12402:248;12504:14;12501:1;12498;12483:36;12631:1;12625:8;12618:16;12611:24;12600:35;;12402:248;;12664:99;12747:1;12736:12;;12367:519;;;11831:1073;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;196:597: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;;;634:6;631:1;628:13;625:91;;;704:1;699:2;690:6;679:9;675:22;671:31;664:42;625:91;-1:-1:-1;777:2:1;756:15;-1:-1:-1;;752:29:1;737:45;;;;784:2;733:54;;196:597;-1:-1:-1;;;196:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:315;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;1239:2;1224:18;;;;1211:32;;-1:-1:-1;;;934:315:1:o;1446:180::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;-1:-1:-1;1597:23:1;;1446:180;-1:-1:-1;1446:180:1:o;1631:456::-;1708:6;1716;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;1832:9;1819:23;1851:31;1876:5;1851:31;:::i;:::-;1901:5;-1:-1:-1;1958:2:1;1943:18;;1930:32;1971:33;1930:32;1971:33;:::i;:::-;1631:456;;2023:7;;-1:-1:-1;;;2077:2:1;2062:18;;;;2049:32;;1631:456::o;2092:247::-;2151:6;2204:2;2192:9;2183:7;2179:23;2175:32;2172:52;;;2220:1;2217;2210:12;2172:52;2259:9;2246:23;2278:31;2303:5;2278:31;:::i;3167:315::-;3235:6;3243;3296:2;3284:9;3275:7;3271:23;3267:32;3264:52;;;3312:1;3309;3302:12;3264:52;3348:9;3335:23;3325:33;;3408:2;3397:9;3393:18;3380:32;3421:31;3446:5;3421:31;:::i;:::-;3471:5;3461:15;;;3167:315;;;;;:::o;3725:456::-;3802:6;3810;3818;3871:2;3859:9;3850:7;3846:23;3842:32;3839:52;;;3887:1;3884;3877:12;3839:52;3923:9;3910:23;3900:33;;3983:2;3972:9;3968:18;3955:32;3996:31;4021:5;3996:31;:::i;:::-;4046:5;-1:-1:-1;4103:2:1;4088:18;;4075:32;4116:33;4075:32;4116:33;:::i;:::-;4168:7;4158:17;;;3725:456;;;;;:::o;4186:829::-;4297:6;4305;4313;4321;4329;4337;4345;4398:3;4386:9;4377:7;4373:23;4369:33;4366:53;;;4415:1;4412;4405:12;4366:53;4454:9;4441:23;4473:31;4498:5;4473:31;:::i;:::-;4523:5;-1:-1:-1;4580:2:1;4565:18;;4552:32;4593:33;4552:32;4593:33;:::i;:::-;4645:7;-1:-1:-1;4699:2:1;4684:18;;4671:32;;-1:-1:-1;4750:2:1;4735:18;;4722:32;;-1:-1:-1;4806:3:1;4791:19;;4778:33;4855:4;4842:18;;4830:31;;4820:59;;4875:1;4872;4865:12;4820:59;4186:829;;;;-1:-1:-1;4186:829:1;;;;4898:7;4952:3;4937:19;;4924:33;;-1:-1:-1;5004:3:1;4989:19;;;4976:33;;4186:829;-1:-1:-1;;4186:829:1:o;5020:388::-;5088:6;5096;5149:2;5137:9;5128:7;5124:23;5120:32;5117:52;;;5165:1;5162;5155:12;5117:52;5204:9;5191:23;5223:31;5248:5;5223:31;:::i;:::-;5273:5;-1:-1:-1;5330:2:1;5315:18;;5302:32;5343:33;5302:32;5343:33;:::i;5621:184::-;5691:6;5744:2;5732:9;5723:7;5719:23;5715:32;5712:52;;;5760:1;5757;5750:12;5712:52;-1:-1:-1;5783:16:1;;5621:184;-1:-1:-1;5621:184:1:o;5810:380::-;5889:1;5885:12;;;;5932;;;5953:61;;6007:4;5999:6;5995:17;5985:27;;5953:61;6060:2;6052:6;6049:14;6029:18;6026:38;6023:161;;;6106:10;6101:3;6097:20;6094:1;6087:31;6141:4;6138:1;6131:15;6169:4;6166:1;6159:15;6023:161;;5810:380;;;:::o;6195:127::-;6256:10;6251:3;6247:20;6244:1;6237:31;6287:4;6284:1;6277:15;6311:4;6308:1;6301:15;6327:125;6367:4;6395:1;6392;6389:8;6386:34;;;6400:18;;:::i;:::-;-1:-1:-1;6437:9:1;;6327:125::o;6457:127::-;6518:10;6513:3;6509:20;6506:1;6499:31;6549:4;6546:1;6539:15;6573:4;6570:1;6563:15;6589:135;6628:3;-1:-1:-1;;6649:17:1;;6646:43;;;6669:18;;:::i;:::-;-1:-1:-1;6716:1:1;6705:13;;6589:135::o;7076:268::-;7163:6;7216:2;7204:9;7195:7;7191:23;7187:32;7184:52;;;7232:1;7229;7222:12;7184:52;7264:9;7258:16;7283:31;7308:5;7283:31;:::i;11112:1104::-;11242:3;11271:1;11304:6;11298:13;11334:3;11356:1;11384:9;11380:2;11376:18;11366:28;;11444:2;11433:9;11429:18;11466;11456:61;;11510:4;11502:6;11498:17;11488:27;;11456:61;11536:2;11584;11576:6;11573:14;11553:18;11550:38;11547:165;;;-1:-1:-1;;;11611:33:1;;11667:4;11664:1;11657:15;11697:4;11618:3;11685:17;11547:165;11728:18;11755:104;;;;11873:1;11868:323;;;;11721:470;;11755:104;-1:-1:-1;;11788:24:1;;11776:37;;11833:16;;;;-1:-1:-1;11755:104:1;;11868:323;11059:1;11052:14;;;11096:4;11083:18;;11966:1;11980:165;11994:6;11991:1;11988:13;11980:165;;;12072:14;;12059:11;;;12052:35;12115:16;;;;12009:10;;11980:165;;;11984:3;;12174:6;12169:3;12165:16;12158:23;;11721:470;-1:-1:-1;12207:3:1;;11112:1104;-1:-1:-1;;;;;;;;11112:1104:1:o;13004:277::-;13071:6;13124:2;13112:9;13103:7;13099:23;13095:32;13092:52;;;13140:1;13137;13130:12;13092:52;13172:9;13166:16;13225:5;13218:13;13211:21;13204:5;13201:32;13191:60;;13247:1;13244;13237:12;14321:128;14361:3;14392:1;14388:6;14385:1;14382:13;14379:39;;;14398:18;;:::i;:::-;-1:-1:-1;14434:9:1;;14321:128::o

Swarm Source

ipfs://21b6c38fa91e0fb8a7c88e8b997e138ee3fc88caa9ae70315d5487baab1a5279
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.