Пример #1
0
def calculate_apy(gauge, swap):
    crv_price = uniswap.price_router(crv, uniswap.usdc)
    gauge_controller = interface.CurveGaugeController(gauge.controller())
    working_supply = gauge.working_supply() / 1e18
    relative_weight = gauge_controller.gauge_relative_weight(gauge) / 1e18
    inflation_rate = gauge.inflation_rate() / 1e18
    virtual_price = swap.get_virtual_price() / 1e18
    base_price = 1
    if str(swap) in constants.CURVE_BTC_SWAPS:
        base_price *= uniswap.price_router(uniswap.wbtc, uniswap.usdc)

    try:
        rate = (inflation_rate * relative_weight * 86400 * 365 /
                working_supply * 0.4) / (virtual_price * base_price)
    except ZeroDivisionError:
        rate = 0

    return {
        'crv price': crv_price,
        'relative weight': relative_weight,
        'inflation rate': inflation_rate,
        'virtual price': virtual_price,
        'base price': base_price,
        'crv reward rate': rate,
        'crv apy': rate * crv_price,
    }
Пример #2
0
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
Пример #3
0
def calculate_apy(gauge, swap):
    crv_price = uniswap.price_router(crv, uniswap.usdc)
    results = fetch_multicall(
        [gauge, "working_supply"],
        [gauge_controller, "gauge_relative_weight", gauge],
        [gauge, "inflation_rate"],
        [swap, "get_virtual_price"],
    )
    results = [x / 1e18 for x in results]
    working_supply, relative_weight, inflation_rate, virtual_price = results
    base_price = get_base_price(swap)
    try:
        rate = (inflation_rate * relative_weight * 86400 * 365 /
                working_supply * 0.4) / (virtual_price * base_price)
    except ZeroDivisionError:
        rate = 0

    return {
        "crv price": crv_price,
        "relative weight": relative_weight,
        "inflation rate": inflation_rate,
        "virtual price": virtual_price,
        "base price": base_price,
        "crv reward rate": rate,
        "crv apy": rate * crv_price,
        "token price": base_price * virtual_price,
    }
Пример #4
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"):
        vote_proxy = interface.CurveYCRVVoter(vault.strategy.voter())
        swap_func = {
            "StrategyCurveGUSDProxy": "SWAP"
        }.get(vault.strategy._name, "curve")
        swap = interface.CurveSwap(getattr(vault.strategy, swap_func)())
        gauge = interface.CurveGauge(vault.strategy.gauge())
        info.update(curve.calculate_boost(gauge, vote_proxy))
        info.update(curve.calculate_apy(gauge, swap))
        info["earned"] = gauge.claimable_tokens.call(vote_proxy).to("ether")

    if hasattr(vault.strategy, "earned"):
        info["lifetime earned"] = vault.strategy.earned() / vault.scale

    if vault.strategy._name == "StrategyYFIGovernance":
        ygov = interface.YearnGovernance(vault.strategy.gov())
        info["earned"] = ygov.earned(vault.strategy) / 1e18
        info["reward rate"] = ygov.rewardRate() / 1e18
        info["ygov balance"] = ygov.balanceOf(vault.strategy) / 1e18
        info["ygov total"] = ygov.totalSupply() / 1e18
        info["token price"] = uniswap.price_router(vault.token, uniswap.usdc)

    return info
Пример #5
0
def calculate_apy(gauge, swap):
    crv_price = uniswap.price_router(crv, uniswap.usdc)
    gauge_controller = interface.CurveGaugeController(gauge.controller())
    working_supply = gauge.working_supply() / 1e18
    relative_weight = gauge_controller.gauge_relative_weight(gauge) / 1e18
    inflation_rate = gauge.inflation_rate() / 1e18
    virtual_price = swap.get_virtual_price() / 1e18
    base_price = get_base_price(swap)
    try:
        rate = (inflation_rate * relative_weight * 86400 * 365 / working_supply * 0.4) / (virtual_price * base_price)
    except ZeroDivisionError:
        rate = 0

    return {
        "crv price": crv_price,
        "relative weight": relative_weight,
        "inflation rate": inflation_rate,
        "virtual price": virtual_price,
        "base price": base_price,
        "crv reward rate": rate,
        "crv apy": rate * crv_price,
        "token price": base_price * virtual_price,
    }