Skip to content

Instantly share code, notes, and snippets.

@kuznetsov-m
Last active May 26, 2021 08:24
Show Gist options
  • Save kuznetsov-m/10acc7274f6f661183a8df1eb18a3ad9 to your computer and use it in GitHub Desktop.
Save kuznetsov-m/10acc7274f6f661183a8df1eb18a3ad9 to your computer and use it in GitHub Desktop.
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