import sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from src.p2pkh import generate_legacy_address SECRETSCAN_URL = "https://secretscan.org/Bitcoin?address={}" NETWORKS = ['mainnet', 'testnet', 'regtest'] def test_p2pkh_fields(): result = generate_legacy_address('mainnet') assert set(result.keys()) == {'network', 'script_type', 'private_key_hex', 'private_key_wif', 'public_key_hex', 'address'} def test_p2pkh_script_type(): result = generate_legacy_address('mainnet') assert result['script_type'] == 'p2pkh' def test_p2pkh_address_mainnet(): result = generate_legacy_address('mainnet') assert result['address'].startswith('1') def test_p2pkh_address_testnet(): result = generate_legacy_address('testnet') assert result['address'][0] in ('m', 'n') def test_p2pkh_address_regtest(): result = generate_legacy_address('regtest') assert result['address'][0] in ('m', 'n') def test_p2pkh_private_key_length(): result = generate_legacy_address('mainnet') assert len(result['private_key_hex']) == 64 def test_p2pkh_compressed_pubkey(): result = generate_legacy_address('mainnet', compressed=True) assert len(result['public_key_hex']) == 66 assert result['public_key_hex'][:2] in ('02', '03') def test_p2pkh_uncompressed_pubkey(): result = generate_legacy_address('mainnet', compressed=False) assert len(result['public_key_hex']) == 130 assert result['public_key_hex'][:2] == '04' def test_p2pkh_unique_addresses(): r1 = generate_legacy_address('mainnet') r2 = generate_legacy_address('mainnet') assert r1['address'] != r2['address'] def test_p2pkh_print_secretscan(capsys): result = generate_legacy_address('mainnet') url = SECRETSCAN_URL.format(result['address']) print(f"\n[P2PKH] Address: {result['address']}") print(f"[P2PKH] Verify on SecretScan: {url}") captured = capsys.readouterr() assert 'secretscan.org' in captured.out # --- WIF format validation --- def test_p2pkh_wif_mainnet_compressed_starts_k_or_l(): result = generate_legacy_address('mainnet', compressed=True) assert result['private_key_wif'][0] in ('K', 'L') def test_p2pkh_wif_mainnet_uncompressed_starts_5(): result = generate_legacy_address('mainnet', compressed=False) assert result['private_key_wif'][0] == '5' def test_p2pkh_wif_testnet_compressed_starts_c(): result = generate_legacy_address('testnet', compressed=True) assert result['private_key_wif'][0] == 'c' def test_p2pkh_wif_testnet_uncompressed_starts_9(): result = generate_legacy_address('testnet', compressed=False) assert result['private_key_wif'][0] == '9' # --- Error cases --- def test_p2pkh_invalid_network_raises(): import pytest with pytest.raises(ValueError): generate_legacy_address('invalid_net') # --- Address format for uncompressed keys --- def test_p2pkh_uncompressed_address_mainnet_starts_1(): result = generate_legacy_address('mainnet', compressed=False) assert result['address'].startswith('1') def test_p2pkh_uncompressed_address_testnet(): result = generate_legacy_address('testnet', compressed=False) assert result['address'][0] in ('m', 'n')