Added simple RootBank parsing tests.

This commit is contained in:
Geoff Taylor 2021-10-05 10:47:41 +01:00
parent 3ccca8bd01
commit a02f8f54aa
4 changed files with 105 additions and 13 deletions

View File

@ -86,12 +86,18 @@ class NodeBank(AddressableAccount):
#
class RootBank(AddressableAccount):
def __init__(self, account_info: AccountInfo, version: Version, meta_data: Metadata,
optimal_util: Decimal, optimal_rate: Decimal, max_rate: Decimal,
node_banks: typing.Sequence[PublicKey], deposit_index: Decimal,
borrow_index: Decimal, last_updated: datetime):
super().__init__(account_info)
self.version: Version = version
self.meta_data: Metadata = meta_data
self.optimal_util: Decimal = optimal_util
self.optimal_rate: Decimal = optimal_rate
self.max_rate: Decimal = max_rate
self.node_banks: typing.Sequence[PublicKey] = node_banks
self.deposit_index: Decimal = deposit_index
self.borrow_index: Decimal = borrow_index
@ -104,13 +110,18 @@ class RootBank(AddressableAccount):
@staticmethod
def from_layout(layout: typing.Any, account_info: AccountInfo, version: Version) -> "RootBank":
meta_data: Metadata = Metadata.from_layout(layout.meta_data)
optimal_util: Decimal = layout.optimal_util
optimal_rate: Decimal = layout.optimal_rate
max_rate: Decimal = layout.max_rate
num_node_banks: Decimal = layout.num_node_banks
node_banks: typing.Sequence[PublicKey] = layout.node_banks[0:int(num_node_banks)]
deposit_index: Decimal = layout.deposit_index
borrow_index: Decimal = layout.borrow_index
last_updated: datetime = layout.last_updated
return RootBank(account_info, version, meta_data, node_banks, deposit_index, borrow_index, last_updated)
return RootBank(account_info, version, meta_data, optimal_util, optimal_rate, max_rate, node_banks, deposit_index, borrow_index, last_updated)
@staticmethod
def parse(account_info: AccountInfo) -> "RootBank":
@ -153,6 +164,9 @@ class RootBank(AddressableAccount):
def __str__(self) -> str:
return f"""« 𝚁𝚘𝚘𝚝𝙱𝚊𝚗𝚔 [{self.version}] {self.address}
{self.meta_data}
Optimal Util: {self.optimal_util}
Optimal Rate: {self.optimal_rate}
Max Rate: {self.max_rate}
Node Banks:
{self.node_banks}
Deposit Index: {self.deposit_index}

View File

@ -5,7 +5,7 @@ import typing
from decimal import Decimal
def data_group(filename: str, root_banks: typing.Sequence[mango.RootBank]) -> mango.Group:
def load_group(filename: str, root_banks: typing.Sequence[mango.RootBank]) -> mango.Group:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
mainnet_token_lookup: mango.TokenLookup = mango.IdsJsonTokenLookup("mainnet", "mainnet.1")
devnet_token_lookup: mango.TokenLookup = mango.IdsJsonTokenLookup("devnet", "devnet.2")
@ -13,23 +13,23 @@ def data_group(filename: str, root_banks: typing.Sequence[mango.RootBank]) -> ma
return mango.Group.parse_locally(account_info, "devnet.2", root_banks, token_lookup)
def data_account(filename: str, group: mango.Group) -> mango.Account:
def load_account(filename: str, group: mango.Group) -> mango.Account:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
return mango.Account.parse(account_info, group)
def data_openorders(filename: str) -> mango.OpenOrders:
def load_openorders(filename: str) -> mango.OpenOrders:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
# Just hard-code the decimals for now.
return mango.OpenOrders.parse(account_info, Decimal(6), Decimal(6))
def data_cache(filename: str) -> mango.Cache:
def load_cache(filename: str) -> mango.Cache:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
return mango.Cache.parse(account_info)
def data_root_bank(filename: str) -> mango.RootBank:
def load_root_bank(filename: str) -> mango.RootBank:
account_info: mango.AccountInfo = mango.AccountInfo.load_json(filename)
return mango.RootBank.parse(account_info)
@ -37,14 +37,14 @@ def data_root_bank(filename: str) -> mango.RootBank:
def load_data_from_directory(directory_path: str) -> typing.Tuple[mango.Group, mango.Cache, mango.Account, typing.Dict[str, mango.OpenOrders]]:
root_banks = []
for filepath in glob.iglob(f"{directory_path}/root_bank*.json"):
root_bank = data_root_bank(filepath)
root_bank = load_root_bank(filepath)
root_banks += [root_bank]
all_openorders = {}
for filepath in glob.iglob(f"{directory_path}/openorders*.json"):
openorders = data_openorders(filepath)
openorders = load_openorders(filepath)
all_openorders[str(openorders.address)] = openorders
group = data_group(f"{directory_path}/group.json", root_banks)
account = data_account(f"{directory_path}/account.json", group)
cache = data_cache(f"{directory_path}/cache.json")
group = load_group(f"{directory_path}/group.json", root_banks)
account = load_account(f"{directory_path}/account.json", group)
cache = load_cache(f"{directory_path}/cache.json")
return group, cache, account, all_openorders

View File

@ -49,8 +49,8 @@ def fake_token(symbol: str = "FAKE", decimals: int = 6) -> mango.Token:
def fake_token_info() -> mango.TokenInfo:
token = fake_token()
meta_data = mango.Metadata(mango.layouts.DATA_TYPE.Group, mango.Version.V1, True)
root_bank = mango.RootBank(fake_account_info(), mango.Version.V1, meta_data, [],
Decimal(5), Decimal(2), datetime.datetime.now())
root_bank = mango.RootBank(fake_account_info(), mango.Version.V1, meta_data, Decimal("0.5"),
Decimal("0.1"), Decimal(1.5), [], Decimal(5), Decimal(2), datetime.datetime.now())
return mango.TokenInfo(token, root_bank, Decimal(7))

78
tests/test_rootbank.py Normal file
View File

@ -0,0 +1,78 @@
from .context import mango
from .data import load_root_bank
from .fakes import fake_account_info, fake_seeded_public_key
from datetime import datetime
from decimal import Decimal
from solana.publickey import PublicKey
def test_node_bank_constructor():
account_info = fake_account_info(fake_seeded_public_key("node bank"))
meta_data = mango.Metadata(mango.layouts.DATA_TYPE.parse(bytearray(b'\x03')), mango.Version.V1, True)
deposits = Decimal(1000)
borrows = Decimal(100)
vault = fake_seeded_public_key("vault")
actual = mango.NodeBank(account_info, mango.Version.V1, meta_data, deposits, borrows, vault)
assert actual is not None
assert actual.logger is not None
assert actual.account_info == account_info
assert actual.address == fake_seeded_public_key("node bank")
assert actual.meta_data == meta_data
assert actual.meta_data.data_type == mango.layouts.DATA_TYPE.NodeBank
assert actual.deposits == deposits
assert actual.borrows == borrows
assert actual.vault == fake_seeded_public_key("vault")
def test_root_bank_constructor():
account_info = fake_account_info(fake_seeded_public_key("root bank"))
meta_data = mango.Metadata(mango.layouts.DATA_TYPE.parse(bytearray(b'\x02')), mango.Version.V1, True)
optimal_util = Decimal("0.7")
optimal_rate = Decimal("0.06")
max_rate = Decimal("1.5")
node_bank = fake_seeded_public_key("node bank")
deposit_index = Decimal(98765)
borrow_index = Decimal(12345)
timestamp = datetime.now()
actual = mango.RootBank(account_info, mango.Version.V1, meta_data, optimal_util, optimal_rate,
max_rate, [node_bank], deposit_index, borrow_index, timestamp)
assert actual is not None
assert actual.logger is not None
assert actual.account_info == account_info
assert actual.address == fake_seeded_public_key("root bank")
assert actual.meta_data == meta_data
assert actual.meta_data.data_type == mango.layouts.DATA_TYPE.RootBank
assert actual.optimal_util == optimal_util
assert actual.optimal_rate == optimal_rate
assert actual.max_rate == max_rate
assert actual.node_banks[0] == node_bank
assert actual.deposit_index == deposit_index
assert actual.borrow_index == borrow_index
assert actual.last_updated == timestamp
def test_root_bank_loaded():
actual = load_root_bank("tests/testdata/empty/root_bank0.json")
assert actual is not None
assert actual.logger is not None
assert actual.address == PublicKey("HUBX4iwWEUK5VrXXXcB7uhuKrfT4fpu2T9iZbg712JrN")
assert actual.meta_data.version == mango.Version.V1
assert actual.meta_data.data_type == mango.layouts.DATA_TYPE.RootBank
assert actual.meta_data.is_initialized
# Typescript says: 0.69999999999999928946
assert actual.optimal_util == Decimal("0.699999999999999289457264239899814129")
# Typescript says: 0.05999999999999872102
assert actual.optimal_rate == Decimal("0.0599999999999987210230756318196654320")
# Typescript says: 1.5
assert actual.max_rate == Decimal("1.5")
assert actual.node_banks[0] == PublicKey("J2Lmnc1e4frMnBEJARPoHtfpcohLfN67HdK1inXjTFSM")
# Typescript says: 1000154.42276607355830719825
assert actual.deposit_index == Decimal("1000154.42276607355830719825462438166")
# Typescript says: 1000219.00867863010088498754
assert actual.borrow_index == Decimal("1000219.00867863010088498754157626536")
# Typescript says: "Mon, 04 Oct 2021 14:58:05 GMT"
assert actual.last_updated == datetime(2021, 10, 4, 15, 58, 5)