"""Ethereum (EIP-191) and Bitcoin message signing and verification.

Signs the same message with both schemes, recovers the signer address, and
verifies the signatures. All output is deterministic (RFC 6979).
"""
from libcrypto import (
    recover_address_bitcoin,
    recover_address_ethereum,
    sign_message_bitcoin,
    sign_message_ethereum,
    verify_message_bitcoin,
    verify_message_ethereum,
)
from libcrypto.addresses import AddressGenerator
from libcrypto.secp256k1 import private_key_to_public_key


def main() -> None:
    private_key = 0x0000000000000000000000000000000000000000000000000000000000000001
    message = "Hello, world!"

    # --- Ethereum (EIP-191 personal_sign) ---
    eth_address = AddressGenerator.from_public_key(
        private_key_to_public_key(private_key, compressed=False), "default", "ethereum"
    )
    eth_signature = sign_message_ethereum(private_key, message)

    assert recover_address_ethereum(message, eth_signature) == eth_address
    assert verify_message_ethereum(eth_address, message, eth_signature) is True
    assert verify_message_ethereum(eth_address, "Tampered", eth_signature) is False

    print("Ethereum address:  ", eth_address)
    print("Ethereum signature:", "0x" + eth_signature.hex())

    # --- Bitcoin signed message ---
    btc_address = AddressGenerator.from_public_key(
        private_key_to_public_key(private_key, compressed=True), "p2pkh", "bitcoin"
    )
    btc_signature = sign_message_bitcoin(private_key, message, compressed=True)

    assert recover_address_bitcoin(message, btc_signature) == btc_address
    assert verify_message_bitcoin(btc_address, message, btc_signature) is True

    print("\nBitcoin address:  ", btc_address)
    print("Bitcoin signature:", btc_signature)
    print("\nEthereum and Bitcoin message signing both passed.")


if __name__ == "__main__":
    main()
