Source code for eth_portfolio.protocols.lending.unit

from typing import Optional

from y import Contract, Network, get_price
from y._decorators import stuck_coro_debugger
from y.datatypes import Address, Block

from eth_portfolio._decimal import Decimal
from eth_portfolio.protocols.lending._base import LendingProtocolWithLockedCollateral
from eth_portfolio.typing import Balance, TokenBalances

# NOTE: This only works for YFI collateral, must extend before using for other collaterals
yfi = "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e"
usdp = "0x1456688345527bE1f37E9e627DA0837D6f08C925"


[docs] class UnitXyz(LendingProtocolWithLockedCollateral): networks = [Network.Mainnet]
[docs] def __init__(self) -> None: self.unitVault = Contract("0xb1cff81b9305166ff1efc49a129ad2afcd7bcf19") self.start_block = 11315910
[docs] @stuck_coro_debugger async def _balances(self, address: Address, block: Optional[Block] = None) -> TokenBalances: balances: TokenBalances = TokenBalances(block=block) if block and block < self.start_block: return balances bal: int = await self.unitVault.collaterals.coroutine(yfi, address, block_identifier=block) if bal: bal = Decimal(bal) / 10**18 balances[yfi] = Balance( bal, bal * await get_price(yfi, block, sync=False), token=yfi, block=block ) return balances
[docs] @stuck_coro_debugger async def _debt(self, address: Address, block: Optional[Block] = None) -> TokenBalances: balances: TokenBalances = TokenBalances(block=block) if block and block < self.start_block: return balances # NOTE: This only works for YFI based debt, must extend before using for other collaterals if debt := await self.unitVault.getTotalDebt.coroutine( yfi, address, block_identifier=block ): debt = Decimal(debt) / 10**18 balances[usdp] = Balance(debt, debt, token=usdp, block=block) return balances