Skip to content
This repository has been archived by the owner on Feb 13, 2024. It is now read-only.

Commit

Permalink
Fixed problem spot health calculations.
Browse files Browse the repository at this point in the history
  • Loading branch information
Geoff Taylor committed Mar 4, 2022
1 parent ee9a1b5 commit 4094e4a
Show file tree
Hide file tree
Showing 18 changed files with 276 additions and 37 deletions.
8 changes: 5 additions & 3 deletions mango/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -800,7 +800,7 @@ def to_dataframe(
)

spot_open_orders: typing.Optional[OpenOrders] = None
spot_health_base: Decimal = Decimal(0)
spot_health_base: Decimal = slot.net_value.value
spot_health_quote: Decimal = Decimal(0)
spot_bids_base_net: Decimal = Decimal(0)
spot_asks_base_net: Decimal = Decimal(0)
Expand Down Expand Up @@ -1045,6 +1045,7 @@ def to_dataframe(
"SpotOpenValue": base_open_total_value,
"BaseUnsettled": base_open_unsettled,
"BaseLocked": base_open_locked,
"BaseLockedValue": base_open_locked * price.value,
"QuoteUnsettled": quote_open_unsettled,
"QuoteLocked": quote_open_locked,
"PerpPositionSize": perp_position,
Expand Down Expand Up @@ -1094,7 +1095,7 @@ def weighted_assets(
liabilities = quote

spot_borrow_health = (
non_quote["SpotBorrowValue"]
non_quote.loc[non_quote["SpotHealthBaseValue"] < 0, "SpotHealthBaseValue"]
* non_quote[f"Spot{weighting_name}LiabilityWeight"]
).sum()

Expand All @@ -1106,7 +1107,7 @@ def weighted_assets(
liabilities += spot_borrow_health + perp_health_base_liability

spot_deposit_health = (
(non_quote["SpotDepositValue"] + non_quote["QuoteLocked"])
(non_quote.loc[non_quote["SpotHealthBaseValue"] > 0, "SpotHealthBaseValue"])
* non_quote[f"Spot{weighting_name}AssetWeight"]
).sum()

Expand Down Expand Up @@ -1140,6 +1141,7 @@ def unweighted_assets(

assets += (
non_quote["SpotDepositValue"].sum()
+ non_quote["BaseLockedValue"].sum()
+ non_quote["PerpAsset"].sum()
+ non_quote["QuoteUnsettled"].sum()
+ non_quote["QuoteLocked"].sum()
Expand Down
6 changes: 3 additions & 3 deletions mango/openorders.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,13 +232,13 @@ def __parser(account_info: AccountInfo) -> OpenOrders:
def __str__(self) -> str:
placed_orders = "\n ".join(map(str, self.placed_orders)) or "None"

return f"""« OpenOrders [{self.address}]:
return f"""« OpenOrders {self.base.symbol}/{self.quote.symbol} [{self.address}]:
Flags: {self.account_flags}
Program ID: {self.program_address}
Market: {self.market}
Owner: {self.owner}
Base Token: {self.base_token_free:,.8f} of {self.base_token_total:,.8f}
Quote Token: {self.quote_token_free:,.8f} of {self.quote_token_total:,.8f}
Base Token [{self.base.decimals} decimals]: {self.base_token_free:,.8f} of {self.base_token_total:,.8f}
Quote Token [{self.quote.decimals} decimals]: {self.quote_token_free:,.8f} of {self.quote_token_total:,.8f}
Referrer Rebate Accrued: {self.referrer_rebate_accrued:,.8f}
Orders:
{placed_orders}
Expand Down
102 changes: 71 additions & 31 deletions tests/data.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,84 @@
import glob
import mango
import os.path
import typing

from decimal import Decimal

from .fakes import fake_seeded_public_key


def load_group(filename: str) -> mango.Group:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
def instrument_lookup_mainnet() -> mango.InstrumentLookup:
mainnet_token_lookup: mango.InstrumentLookup = mango.IdsJsonTokenLookup(
"mainnet", "mainnet.1"
)

mainnet_overrides_filename = os.path.join(
mango.DATA_PATH, "overrides.tokenlist.json"
)
mainnet_overrides_token_lookup: mango.InstrumentLookup = mango.SPLTokenLookup.load(
mainnet_overrides_filename
)
mainnet_non_spl_instrument_lookup: mango.InstrumentLookup = (
mango.NonSPLInstrumentLookup.load(
mango.NonSPLInstrumentLookup.DefaultMainnetDataFilepath
)
)

return mango.CompoundInstrumentLookup(
[
mainnet_overrides_token_lookup,
mainnet_token_lookup,
mainnet_non_spl_instrument_lookup,
]
)


def instrument_lookup_devnet() -> mango.InstrumentLookup:
devnet_token_lookup: mango.InstrumentLookup = mango.IdsJsonTokenLookup(
"devnet", "devnet.2"
)

devnet_overrides_filename = os.path.join(
mango.DATA_PATH, "overrides.tokenlist.devnet.json"
)
devnet_overrides_token_lookup: mango.InstrumentLookup = mango.SPLTokenLookup.load(
devnet_overrides_filename
)
devnet_non_spl_instrument_lookup: mango.InstrumentLookup = (
mango.NonSPLInstrumentLookup.load(
mango.NonSPLInstrumentLookup.DefaultDevnetDataFilepath
)
)
instrument_lookup: mango.InstrumentLookup = mango.CompoundInstrumentLookup(
[mainnet_token_lookup, devnet_token_lookup, devnet_non_spl_instrument_lookup]
)
mainnet_market_lookup: mango.MarketLookup = mango.IdsJsonMarketLookup(
"mainnet", instrument_lookup
)
devnet_market_lookup: mango.MarketLookup = mango.IdsJsonMarketLookup(
"devnet", instrument_lookup

return mango.CompoundInstrumentLookup(
[
devnet_overrides_token_lookup,
devnet_token_lookup,
devnet_non_spl_instrument_lookup,
]
)
market_lookup: mango.MarketLookup = mango.CompoundMarketLookup(
[mainnet_market_lookup, devnet_market_lookup]


def instrument_lookup() -> mango.InstrumentLookup:
return mango.CompoundInstrumentLookup(
[instrument_lookup_mainnet(), instrument_lookup_devnet()]
)
return mango.Group.parse(account_info, "devnet.2", instrument_lookup, market_lookup)


def market_lookup_mainnet() -> mango.MarketLookup:
return mango.IdsJsonMarketLookup("mainnet", instrument_lookup_mainnet())


def market_lookup_devnet() -> mango.MarketLookup:
return mango.IdsJsonMarketLookup("devnet", instrument_lookup_devnet())


def market_lookup() -> mango.MarketLookup:
return mango.CompoundMarketLookup([market_lookup_mainnet(), market_lookup_devnet()])


def load_group(filename: str) -> mango.Group:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
instruments: mango.InstrumentLookup = instrument_lookup()
markets: mango.MarketLookup = market_lookup()
return mango.Group.parse(account_info, "devnet.2", instruments, markets)


def load_account(
Expand All @@ -44,21 +90,15 @@ def load_account(

def load_openorders(filename: str) -> mango.OpenOrders:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
# Just hard-code the tokens for now.
base = mango.Token(
"FAKEBASE",
"Fake Base Token",
Decimal(6),
fake_seeded_public_key("fake base token"),
parsed = mango.layouts.OPEN_ORDERS.parse(account_info.data)
markets: mango.MarketLookup = market_lookup()
market = markets.find_by_address(parsed.market)
if market is None:
raise Exception(f"Could not find market metadata for {parsed.market}")

return mango.OpenOrders.parse(
account_info, mango.Token.ensure(market.base), market.quote
)
quote = mango.Token(
"FAKEQUOTE",
"Fake Quote Token",
Decimal(6),
fake_seeded_public_key("fake quote token"),
)

return mango.OpenOrders.parse(account_info, base, quote)


def load_cache(filename: str) -> mango.Cache:
Expand Down
37 changes: 37 additions & 0 deletions tests/test_healthcalculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,3 +394,40 @@ def test_account9() -> None:
assert account.leverage(frame) == Decimal("3.91944232844987663175000830924077777")

assert not account.is_liquidatable(frame)


def test_account10() -> None:
group, cache, account, open_orders = load_data_from_directory(
"tests/testdata/account10"
)
frame = account.to_dataframe(group, open_orders, cache)

# Typescript says: 835447528.00765534142685098118
assert account.init_health(frame).value == Decimal(
"835.46645800765893486219036355771104"
)

# # Typescript says: 1104560586.65938873999447622509
assert account.maint_health(frame).value == Decimal(
"1104.57951665938912571043538155175809"
)

# # Typescript says: 72.79490618339146124072
assert account.init_health_ratio(frame) == Decimal(
"72.7965556078356442718192409419052420"
)

# # Typescript says: 103.85025532240703682874
assert account.maint_health_ratio(frame) == Decimal(
"103.852035111906331055293099609661003"
)

# # Typescript says: 1373.66979736174514670211
assert account.total_value(frame).value == Decimal(
"1373.69257531111931655868039954580515"
)

# # Typescript says: 2.22052732148808473767
assert account.leverage(frame) == Decimal("2.22049050105379598429453331051484650")

assert not account.is_liquidatable(frame)
11 changes: 11 additions & 0 deletions tests/testdata/account10/account.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"address": "F3TTrgxjrkAHdS9zEidtwU5VXyvMgr5poii4HYatZheH",
"executable": false,
"lamports": "30791040",
"owner": "mv3ekLzLbnVPNxjSKvqBpU3ZeZXPQdEC3bp5MDEBG68",
"rent_epoch": "284",
"data": [
"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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg1gsWn4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"base64"
]
}
11 changes: 11 additions & 0 deletions tests/testdata/account10/cache.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"address": "EBDRoayCDDUvDgCimta45ajQeXbexv7aKqJubruqpyvu",
"executable": false,
"lamports": "12082560",
"owner": "mv3ekLzLbnVPNxjSKvqBpU3ZeZXPQdEC3bp5MDEBG68",
"rent_epoch": "285",
"data": [
"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",
"base64"
]
}
Loading

0 comments on commit 4094e4a

Please sign in to comment.