from __future__ import annotations from binascii import hexlify, unhexlify import struct from monero import base58, const, ed25519 from monero.address import Address from monero.keccak import keccak_256 def derive_subaddress( *, payment_address: str, view_key: str, account_index: int, address_index: int, ) -> str: address = Address(payment_address) view_key_bytes = unhexlify(view_key) spend_pub_bytes = unhexlify(address.spend_key()) data = ( b"SubAddr\0" + view_key_bytes + struct.pack("