Last active
May 26, 2021 08:24
-
-
Save kuznetsov-m/10acc7274f6f661183a8df1eb18a3ad9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from typing import Union | |
alphabet = b'123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' | |
def b58encode_int(i: int, default_one: bool = True) -> bytes: | |
""" | |
Encode an integer using Base58 | |
""" | |
if not i and default_one: | |
return alphabet[0:1] | |
string = b"" | |
base = len(alphabet) | |
while i: | |
i, idx = divmod(i, base) | |
string = alphabet[idx:idx+1] + string | |
return string | |
def scrub_input(v: Union[str, bytes]) -> bytes: | |
if isinstance(v, str): | |
v = v.encode('ascii') | |
return v | |
def b58encode(v: Union[str, bytes]) -> bytes: | |
""" | |
Encode a string using Base58 | |
""" | |
v = scrub_input(v) | |
origlen = len(v) | |
v = v.lstrip(b'\0') | |
newlen = len(v) | |
acc = int.from_bytes(v, byteorder='big') # first byte is most significant | |
result = b58encode_int(acc, default_one=False) | |
return alphabet[0:1] * (origlen - newlen) + result | |
# Obligation | |
# https://explorer.solana.com/address/97hLKPRKZgxDcYDWcYjxtVRQkB5W8rQQ2EdZwEnvGRnX | |
# address: 97hLKPRKZgxDcYDWcYjxtVRQkB5W8rQQ2EdZwEnvGRnX | |
# info: {'account': {'data': '9jeEYfdUPKKaxVfCNtC7r7kDB9xMKTVxBAG351yqzMRW3WHob86YBxn4Q1nRMsRpcruTyErhHeYVSkALHYtmRiqLyTdBpT48ig4DyjyfxywqbipH1dH1KE7EtFZBqcELQ6SJBqzjJEfJsrgLrT59jJ758Hr7XpcWokz5adCCYJ1ncQwSjUHGtA3QqnvrK1ZA7QajtxescjCpdvkQzuvmzSdWyVBatwXjroiHNDVMiKwEtHUvebStcW6FnZgNxfJArdavpd7C2JpGvQzPPcxF7nMzewSZgqv3UEcJaDLjb7Rf9N4xp2BHBcXCmin3YgePsBAR4krEgyLAm9BsiSmQBcGoXicCEpwV1rzMXZdpj', 'executable': False, 'lamports': 2735280, 'owner': 'LendZqTs7gn5CTSJU1jWKhKuVpjJGom45nnwPb2AMTi', 'rentEpoch': 184}, 'pubkey': '97hLKPRKZgxDcYDWcYjxtVRQkB5W8rQQ2EdZwEnvGRnX'} | |
# data (base64): AQAAAAAAAAAA9gS5bBWmAYqIWY0MWjEP4rYzOqSLqRblAr4CV4ylA4RUb5AegR/zDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXH2dBhmCO+Qx2UVe6Jt+82VluOtYSKxdN49XuVOGTxQMfjEzKi8XVUfL4wQoTtWZmE7hxytvWvNfNpOPmRXJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== | |
# bytes (decoded from base64): | |
# b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x04\xb9l\x15\xa6\x01\x8a\x88Y\x8d\x0cZ1\x0f\xe2\xb63:\xa4\x8b\xa9\x16\xe5\x02\xbe\x02W\x8c\xa5\x03\x84To\x90\x1e\x81\x1f\xf3\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xc7\xd9\xd0a\x98#\xbeC\x1d\x94U\xee\x89\xb7\xef6V[\x8e\xb5\x84\x8a\xc5\xd3x\xf5{\x958d\xf1@\xc7\xe3\x132\xa2\xf1uT|\xbe0B\x84\xedY\x99\x84\xee\x1cr\xb6\xf5\xaf5\xf3i8\xf9\x91\\\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
data_bytes = b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x04\xb9l\x15\xa6\x01\x8a\x88Y\x8d\x0cZ1\x0f\xe2\xb63:\xa4\x8b\xa9\x16\xe5\x02\xbe\x02W\x8c\xa5\x03\x84To\x90\x1e\x81\x1f\xf3\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xc7\xd9\xd0a\x98#\xbeC\x1d\x94U\xee\x89\xb7\xef6V[\x8e\xb5\x84\x8a\xc5\xd3x\xf5{\x958d\xf1@\xc7\xe3\x132\xa2\xf1uT|\xbe0B\x84\xedY\x99\x84\xee\x1cr\xb6\xf5\xaf5\xf3i8\xf9\x91\\\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
tmp = data_bytes | |
version_size = 1 | |
version = tmp[:version_size] | |
tmp = tmp[version_size:] | |
print(f'version: {version}') | |
deposited_collateral_tokens_size = 8 | |
deposited_collateral_tokens = tmp[:deposited_collateral_tokens_size] | |
tmp = tmp[deposited_collateral_tokens_size:] | |
print(f'deposited_collateral_tokens: {deposited_collateral_tokens}') | |
collateral_reserve_size = 32 | |
collateral_reserve = tmp[:collateral_reserve_size] | |
tmp = tmp[collateral_reserve_size:] | |
print(f'collateral_reserve: {collateral_reserve}') | |
print(f'collateral_reserve: {collateral_reserve.hex()}') | |
print(f'collateral_reserve (base58): {b58encode(collateral_reserve)}') | |
cumulative_borrow_rate_wads_size = 3 * 8 | |
cumulative_borrow_rate_wads = tmp[:cumulative_borrow_rate_wads_size] | |
tmp = tmp[cumulative_borrow_rate_wads_size:] | |
print(f'cumulative_borrow_rate_wads: {cumulative_borrow_rate_wads}') | |
borrowed_liquidity_wads_size = 3 * 8 | |
borrowed_liquidity_wads = tmp[:borrowed_liquidity_wads_size] | |
tmp = tmp[borrowed_liquidity_wads_size:] | |
print(f'borrowed_liquidity_wads: {borrowed_liquidity_wads}') | |
borrow_reserve_size = 32 | |
borrow_reserve = tmp[:borrow_reserve_size] | |
tmp = tmp[borrow_reserve_size:] | |
print(f'borrow_reserve: {borrow_reserve}') | |
print(f'borrow_reserve: {borrow_reserve.hex()}') | |
print(f'borrow_reserve (base58): {b58encode(borrow_reserve)}') | |
token_mint_size = 32 | |
token_mint = tmp[:token_mint_size] | |
tmp = tmp[token_mint_size:] | |
print(f'token_mint: {token_mint}') | |
print(f'token_mint: {token_mint.hex()}') | |
print(f'token_mint (base58): {b58encode(token_mint)}') | |
print(f'token_mint (base58): {b58encode(token_mint).decode("utf-8")}') | |
# version: b'\x01' | |
# deposited_collateral_tokens: b'\x00\x00\x00\x00\x00\x00\x00\x00' | |
# collateral_reserve: b'\xf6\x04\xb9l\x15\xa6\x01\x8a\x88Y\x8d\x0cZ1\x0f\xe2\xb63:\xa4\x8b\xa9\x16\xe5\x02\xbe\x02W\x8c\xa5\x03\x84' | |
# collateral_reserve: f604b96c15a6018a88598d0c5a310fe2b6333aa48ba916e502be02578ca50384 | |
# collateral_reserve (base58): b'HZMUNJQDwT8rdEiY2r15UR6h8yYg7QkxiekjyJGFFwnB' | |
# cumulative_borrow_rate_wads: b'To\x90\x1e\x81\x1f\xf3\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
# borrowed_liquidity_wads: b'\x00\x00\x00\x00\x00\x00\x00\x00\x95\xc7\xd9\xd0a\x98#\xbeC\x1d\x94U\xee\x89\xb7\xef' | |
# borrow_reserve: b'6V[\x8e\xb5\x84\x8a\xc5\xd3x\xf5{\x958d\xf1@\xc7\xe3\x132\xa2\xf1uT|\xbe0B\x84\xedY' | |
# borrow_reserve: 36565b8eb5848ac5d378f57b953864f140c7e31332a2f175547cbe304284ed59 | |
# borrow_reserve (base58): b'4f7PfiXwBAh1ZdXfC8uKAvxsmj3X4iNymCS8Uu5gZ2k8' | |
# token_mint: b'\x99\x84\xee\x1cr\xb6\xf5\xaf5\xf3i8\xf9\x91\\\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
# token_mint: 9984ee1c72b6f5af35f36938f9915c9400000000000000000000000000000000 | |
# token_mint (base58): b'BLGwdKWJgmEs5X4rScXZ4PsSp3c7X2VbBVFAbYuogeMD' | |
# token_mint (base58): BLGwdKWJgmEs5X4rScXZ4PsSp3c7X2VbBVFAbYuogeMD | |
# collateral_reserve | |
# https://explorer.solana.com/address/HZMUNJQDwT8rdEiY2r15UR6h8yYg7QkxiekjyJGFFwnB |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment