Perp Accounts accrue benefits in MNGO so improved handling of it.

This commit is contained in:
Geoff Taylor 2021-08-05 15:35:08 +01:00
parent 88d4cb119a
commit 613d964051
3 changed files with 35 additions and 6 deletions

View File

@ -118,6 +118,7 @@ class Account(AddressableAccount):
def from_layout(layout: layouts.MANGO_ACCOUNT, account_info: AccountInfo, version: Version, group: Group) -> "Account":
meta_data = Metadata.from_layout(layout.meta_data)
owner: PublicKey = layout.owner
mngo_token_info = TokenInfo.find_by_symbol(group.tokens, "MNGO")
in_margin_basket: typing.Sequence[bool] = list([bool(in_basket) for in_basket in layout.in_margin_basket])
active_in_basket: typing.List[bool] = []
basket: typing.List[AccountBasketBaseToken] = []
@ -127,7 +128,7 @@ class Account(AddressableAccount):
deposit = TokenValue(token_info.token, token_info.token.shift_to_decimals(intrinsic_deposit))
intrinsic_borrow = token_info.root_bank.borrow_index * layout.borrows[index]
borrow = TokenValue(token_info.token, token_info.token.shift_to_decimals(intrinsic_borrow))
perp_account = PerpAccount.from_layout(layout.perp_accounts[index])
perp_account = PerpAccount.from_layout(layout.perp_accounts[index], mngo_token_info.token)
spot_open_orders = layout.spot_open_orders[index]
basket_item: AccountBasketBaseToken = AccountBasketBaseToken(
token_info, deposit, borrow, spot_open_orders, perp_account)

View File

@ -18,6 +18,8 @@ from decimal import Decimal
from .layouts import layouts
from .perpopenorders import PerpOpenOrders
from .token import Token
from .tokenvalue import TokenValue
# # 🥭 PerpAccount class
@ -26,28 +28,29 @@ from .perpopenorders import PerpOpenOrders
#
class PerpAccount:
def __init__(self, base_position: Decimal, quote_position: Decimal, long_settled_funding: Decimal,
short_settled_funding: Decimal, mngo_accrued: Decimal, open_orders: PerpOpenOrders):
short_settled_funding: Decimal, mngo_accrued: TokenValue, open_orders: PerpOpenOrders):
self.base_position: Decimal = base_position
self.quote_position: Decimal = quote_position
self.long_settled_funding: Decimal = long_settled_funding
self.short_settled_funding: Decimal = short_settled_funding
self.mngo_accrued: Decimal = mngo_accrued
self.mngo_accrued: TokenValue = mngo_accrued
self.open_orders: PerpOpenOrders = open_orders
@staticmethod
def from_layout(layout: layouts.PERP_ACCOUNT) -> "PerpAccount":
def from_layout(layout: layouts.PERP_ACCOUNT, mngo_token: Token) -> "PerpAccount":
base_position: Decimal = layout.base_position
quote_position: Decimal = layout.quote_position
long_settled_funding: Decimal = layout.long_settled_funding
short_settled_funding: Decimal = layout.short_settled_funding
mngo_accrued: Decimal = layout.mngo_accrued
mngo_accrued_raw: Decimal = layout.mngo_accrued
mngo_accrued: TokenValue = TokenValue(mngo_token, mngo_token.shift_to_decimals(mngo_accrued_raw))
open_orders: PerpOpenOrders = PerpOpenOrders.from_layout(layout.open_orders)
return PerpAccount(base_position, quote_position, long_settled_funding, short_settled_funding, mngo_accrued, open_orders)
def __str__(self) -> str:
if self.open_orders.free_slot_bits == 0xFFFFFFFF:
if self.base_position == Decimal(0) and self.quote_position == Decimal(0) and self.long_settled_funding == Decimal(0) and self.short_settled_funding == Decimal(0) and self.mngo_accrued == Decimal(0) and self.open_orders.free_slot_bits == 0xFFFFFFFF:
return "« 𝙿𝚎𝚛𝚙𝙰𝚌𝚌𝚘𝚞𝚗𝚝 (empty) »"
open_orders = f"{self.open_orders}".replace("\n", "\n ")
return f"""« 𝙿𝚎𝚛𝚙𝙰𝚌𝚌𝚘𝚞𝚗𝚝

View File

@ -18,6 +18,8 @@ import typing
from decimal import Decimal
from solana.publickey import PublicKey
from .layouts import layouts
from .rootbank import RootBank
from .token import Token
@ -54,6 +56,29 @@ class TokenInfo():
return TokenInfo.from_layout(layout, token_lookup, root_banks)
@staticmethod
def find_by_symbol(values: typing.Sequence[typing.Optional["TokenInfo"]], symbol: str) -> "TokenInfo":
found = [
value for value in values if value is not None and value.token is not None and value.token.symbol_matches(symbol)]
if len(found) == 0:
raise Exception(f"Token '{symbol}' not found in token infos: {values}")
if len(found) > 1:
raise Exception(f"Token '{symbol}' matched multiple tokens in infos: {values}")
return found[0]
@staticmethod
def find_by_mint(values: typing.Sequence[typing.Optional["TokenInfo"]], mint: PublicKey) -> "TokenInfo":
found = [value for value in values if value is not None and value.token is not None and value.token.mint == mint]
if len(found) == 0:
raise Exception(f"Token '{mint}' not found in token infos: {values}")
if len(found) > 1:
raise Exception(f"Token '{mint}' matched multiple tokens in infos: {values}")
return found[0]
def __str__(self) -> str:
root_bank = f"{self.root_bank}".replace("\n", "\n ")
return f"""« 𝚃𝚘𝚔𝚎𝚗𝙸𝚗𝚏𝚘 {self.token}