Perp Accounts accrue benefits in MNGO so improved handling of it.
This commit is contained in:
parent
88d4cb119a
commit
613d964051
|
@ -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)
|
||||
|
|
|
@ -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"""« 𝙿𝚎𝚛𝚙𝙰𝚌𝚌𝚘𝚞𝚗𝚝
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Reference in New Issue