mango-explorer/tests/test_tokenbank.py

150 lines
5.6 KiB
Python

from .context import mango
from .data import load_root_bank, load_node_bank
from .fakes import fake_account_info, fake_context, fake_seeded_public_key, fake_token
from datetime import datetime, timezone
from decimal import Decimal
from solana.publickey import PublicKey
def test_node_bank_constructor() -> None:
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)
balances = mango.BankBalances(deposits=deposits, borrows=borrows)
vault = fake_seeded_public_key("vault")
actual = mango.NodeBank(account_info, mango.Version.V1, meta_data, vault, balances)
assert actual 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.balances.deposits == deposits
assert actual.balances.borrows == borrows
assert actual.vault == fake_seeded_public_key("vault")
def test_root_bank_constructor() -> None:
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 = mango.utc_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.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_token_bank_constructor() -> None:
token = fake_token()
root_bank_address = fake_seeded_public_key("root bank address")
actual = mango.TokenBank(token, root_bank_address)
assert actual is not None
assert actual.token == token
assert actual.root_bank_address == root_bank_address
def test_load_root_bank() -> None:
actual = load_root_bank("tests/testdata/1deposit/root_bank0.json")
assert actual 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
assert actual.optimal_util == Decimal("0.69999999999999928946")
assert actual.optimal_rate == Decimal("0.05999999999999872102")
assert actual.max_rate == Decimal("1.5")
assert actual.node_banks[0] == PublicKey(
"J2Lmnc1e4frMnBEJARPoHtfpcohLfN67HdK1inXjTFSM"
)
assert actual.deposit_index == Decimal("1000154.42276607355830719825")
assert actual.borrow_index == Decimal("1000219.00867863010088498754")
assert actual.last_updated == datetime(2021, 10, 4, 14, 58, 5, 0, timezone.utc)
def test_btc_token_bank() -> None:
btc = mango.Token(
"BTC",
"Wrapped Bitcoin (Sollet)",
Decimal(6),
PublicKey("9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E"),
)
root_bank = load_root_bank("tests/testdata/tokenbank/btc_root_bank.json")
node_bank = load_node_bank("tests/testdata/tokenbank/btc_node_bank.json")
actual = mango.TokenBank(btc, root_bank.address)
actual.loaded_root_bank = root_bank
root_bank.loaded_node_banks = [node_bank]
context = fake_context()
interest_rates = actual.fetch_interest_rates(context)
# Typescript says: 0.00074328994922723268
assert interest_rates.deposit == Decimal(
"0.000743289949230430278650314704786385301"
)
# Typescript says: 0.0060962691428017024
assert interest_rates.borrow == Decimal("0.00609626914280543412386251743252599320")
assert str(interest_rates) == "« InterestRates Deposit: 0.07% Borrow: 0.61% »"
def test_usdc_token_bank() -> None:
usdc = mango.Token(
"USDC",
"USD Coin",
Decimal(6),
PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),
)
root_bank = load_root_bank("tests/testdata/tokenbank/usdc_root_bank.json")
node_bank = load_node_bank("tests/testdata/tokenbank/usdc_node_bank.json")
actual = mango.TokenBank(usdc, root_bank.address)
actual.loaded_root_bank = root_bank
root_bank.loaded_node_banks = [node_bank]
context = fake_context()
interest_rates = actual.fetch_interest_rates(context)
# UI says: 16.94% 23.15%
# Typescript says: 0.16874409787690680673
assert interest_rates.deposit == Decimal("0.168744097876912914047144162858900625")
# Typescript says: 0.23058349895659091544
assert interest_rates.borrow == Decimal("0.230583498956594527437928647548223725")
assert str(interest_rates) == "« InterestRates Deposit: 16.87% Borrow: 23.06% »"