"""Helpers for Monero adresses.

mainnet address prefix:
    - address: 18
    - integrated address: 19
    - subaddress: 42

stagenet address prefix:
    - address: 24
    - integrated address: 25
    - subaddress: 36

testnet address prefix:
    - address: 53
    - integrated address: 54
    - subaddress: 63


SOFTWALLET
------------
integrated_address 0102030405060708
5KpvhQBFNXYe3J41sBdjvjaBUyz8qHohsQcGtRf63qEUTMBvmA45fpp5pSacMdSg7A3b71RejLzB8EkGbfjp5PELipMNxnGr3Wv1zf7dWq

HWWALLET
--------
integrated_address 0102030405060708
5DhUnJjS31jgAQDY6qKUP6TeBy5JqXSJzhG4i7447yMXS7wdt4hKh6gQCTTa9FiYNpEjBoHZ9iTww3vL96P1hcmTbnu8Nst8WHC21KaMVc


>>> addr_prefix: bytes = b"\x19"
>>> pub_spend_key: bytes = bytes.fromhex("dae41d6b13568fdd71ec3d20c2f614c65fe819f36ca5da8d24df3bd89b2bad9d")
>>> pub_view_key: bytes = bytes.fromhex("865cbfab852a1d1ccdfc7328e4dac90f78fc2154257d07522e9b79e637326dfa")
>>> payment_id: bytes = b"\x01\x02\x03\x04\x05\x06\x07\x08"
>>> concat: bytes = addr_prefix + pub_spend_key + pub_view_key + payment_id
>>> addr: str = base58.encode(concat + sha3(concat)[:4])

"""

import hashlib


def sc_reduce32(value: bytes) -> bytes:
    n: int = int.from_bytes(value, byteorder="little")
    l: int = 2**252 + 27742317777372353535851937790883648493

    return (n % l).to_bytes(32, "little")


def sha3(value: bytes) -> bytes:
    return hashlib.sha3_256(value).digest()