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, }
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_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, }
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
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, }