Added simple RootBank parsing tests.
This commit is contained in:
parent
3ccca8bd01
commit
a02f8f54aa
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue