예제 #1
0
def describe_vault(vault: Vault):
    info = {
        'vault balance': vault.vault.balance() / vault.scale,
        'share price': vault.vault.getPricePerFullShare() / 1e18,
        'vault total': vault.vault.totalSupply() / vault.scale,
        'strategy balance': vault.strategy.balanceOf() / vault.scale,
    }

    # some of the oldest vaults don't implement these methods
    if hasattr(vault.vault, 'available'):
        info['available'] = vault.vault.available() / vault.scale

    if hasattr(vault.vault, 'min') and hasattr(vault.vault, 'max'):
        info['strategy buffer'] = vault.vault.min() / vault.vault.max()

    # new curve voter proxy vaults
    if hasattr(vault.strategy, 'proxy'):
        strategy_proxy = interface.StrategyProxy(vault.strategy.proxy())
        vote_proxy = interface.CurveYCRVVoter(vault.strategy.voter())
        escrow = interface.CurveVotingEscrow(vote_proxy.escrow())
        swap = interface.CurveSwap(vault.strategy.curve())
        gauge = interface.CurveGauge(vault.strategy.gauge())
        info.update(curve.calculate_boost(gauge, vote_proxy))
        info.update(curve.calculate_apy(gauge, swap))

    if vault.strategy._name == 'StrategyYFIGovernance':
        ygov = interface.YearnGovernance(vault.strategy.gov())
        info['earned'] = ygov.earned(vault.strategy) / 1e18
        info['ygov balance'] = ygov.balanceOf(vault.strategy) / 1e18

    return info
예제 #2
0
from brownie import interface

from yearn import constants
from yearn import uniswap


crv = interface.ERC20("0xD533a949740bb3306d119CC777fa900bA034cd52")
voting_escrow = interface.CurveVotingEscrow("0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2")
registry = interface.CurveRegistry("0x7D86446dDb609eD0F5f8684AcF30380a356b2B4c")


def get_base_price(pool):
    coins = set(registry.get_underlying_coins(pool))
    if coins & constants.BTC_LIKE:
        return uniswap.price_router(uniswap.wbtc, uniswap.usdc)
    elif coins & constants.ETH_LIKE:
        return uniswap.price_router(uniswap.weth, uniswap.usdc)
    else:
        return 1


def calculate_boost(gauge, addr):
    gauge_balance = gauge.balanceOf(addr) / 1e18
    gauge_total = gauge.totalSupply() / 1e18
    working_balance = gauge.working_balances(addr) / 1e18
    working_supply = gauge.working_supply() / 1e18
    vecrv_balance = voting_escrow.balanceOf(addr) / 1e18
    vecrv_total = voting_escrow.totalSupply() / 1e18
    try:
        boost = working_balance / gauge_balance * 2.5
    except ZeroDivisionError: