"""Generate addresses for the extended coin set.

Demonstrates the additional Bitcoin-style networks (Bitcoin Gold, Ravencoin,
Qtum, Monacoin, Vertcoin, and Zcash transparent) and the additional
EVM-compatible chains, all from a single private key. Every value is verified
against a known deterministic vector for private key `1`.
"""
from libcrypto import Wallet

PRIVATE_KEY = "0000000000000000000000000000000000000000000000000000000000000001"

EXPECTED = {
    ("bitcoin_gold", "p2pkh"): "GUXByHDZLvU4DnVH9imSFckt3HEQ5cFgE5",
    ("ravencoin", "p2pkh"): "RKxTdfmtxtfLDKZBgx6SvNkBtNu9jRYnLh",
    ("qtum", "p2pkh"): "QXHFfTBKYXjaaTH1e7Rox8CcdNPGHVhM59",
    ("monacoin", "p2pkh"): "MJaRnao1s62a2zAKSkmG582KbLKianqb7v",
    ("vertcoin", "p2pkh"): "Vkg6Ts44mskyD668xZkxFkjqovjXX9yUzZ",
    ("zcash", "p2pkh"): "t1UYsZVJkLPeMjxEtACvSxfWuNmddpWfxzs",
}

EVM_CHAINS = [
    "ethereum", "polygon", "arbitrum", "optimism", "base", "fantom", "cronos",
    "gnosis", "celo", "moonbeam", "harmony", "metis", "kava", "mantle", "linea",
    "scroll", "blast", "opbnb", "zksync", "sonic",
]


def main() -> None:
    wallet = Wallet(PRIVATE_KEY)

    print("Extended Bitcoin-style networks")
    print("-------------------------------")
    for (coin, address_type), expected in EXPECTED.items():
        address = wallet.get_address(coin, address_type)
        assert address == expected, f"{coin} mismatch: {address} != {expected}"
        print(f"{coin:14} {address}")

    # SegWit-capable networks also expose bech32 and nested SegWit addresses.
    print("\nSegWit-capable extended networks (all formats)")
    print("----------------------------------------------")
    for coin in ("bitcoin_gold", "qtum", "monacoin", "vertcoin"):
        for address_type, address in wallet.get_all_addresses(coin).items():
            print(f"{coin:14} {address_type:12} {address}")

    print("\nEVM-compatible chains (identical EIP-55 address)")
    print("------------------------------------------------")
    ethereum = wallet.get_address("ethereum")
    for chain in EVM_CHAINS:
        address = wallet.get_address(chain)
        assert address == ethereum, f"{chain} EVM address mismatch"
        print(f"{chain:14} {address}")

    print("\nAll extended coin vectors passed.")


if __name__ == "__main__":
    main()
