from ecdsa import SigningKey, SECP256k1, VerifyingKey
import binascii
import hashlib

def sha_digest(hexastring):
  return hashlib.sha256(binascii.unhexlify(hexastring)).hexdigest()

def base58encode(hexastring):
  chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
  int_val = int(hexastring, 16)
  encoded =  encode58("", int_val, chars)
  return encoded

def encode58(string, int_val, chars):
  if int_val == 0:
    return string
  else:
    new_val, rem = divmod(int_val, 58) 
    new_string = (chars[rem]) + string
    return encode58(new_string, new_val, chars)

sk = SigningKey.generate(curve=SECP256k1)
pem = sk.to_pem()
pem = pem.decode("utf-8")

print("")
print(pem)
print("")

public_key = SigningKey.from_pem(pem).get_verifying_key().to_string()
public_key_hex = binascii.hexlify(public_key)
checksum_int = int(public_key_hex, 16)
if(checksum_int % 2 == 0):
  prefix = "02"
else:
  prefix = "03"
public_key_compressed = prefix + public_key_hex[0:64].decode("utf-8")
hash_of_public_key = sha_digest(public_key_compressed)
ripe_hash_of_public_key = hashlib.new("ripemd160")
ripe_hash_of_public_key.update(binascii.unhexlify(hash_of_public_key))
version_hash = "0F02"+ripe_hash_of_public_key.hexdigest()
version_checksum = sha_digest(sha_digest(version_hash))[0:8]
btcpay_sin = base58encode(version_hash+version_checksum)

print("")
print(btcpay_sin)
print("")