diff --git a/mango/rootbank.py b/mango/rootbank.py index fd6d7b7..8db2a91 100644 --- a/mango/rootbank.py +++ b/mango/rootbank.py @@ -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} diff --git a/tests/data.py b/tests/data.py index 51f5d89..9f87db8 100644 --- a/tests/data.py +++ b/tests/data.py @@ -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 diff --git a/tests/fakes.py b/tests/fakes.py index 66b3d19..41ad1a1 100644 --- a/tests/fakes.py +++ b/tests/fakes.py @@ -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)) diff --git a/tests/test_rootbank.py b/tests/test_rootbank.py new file mode 100644 index 0000000..8b7f1b2 --- /dev/null +++ b/tests/test_rootbank.py @@ -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)