bipscan
BIP-39 Seed Phrase Finder
Find BIP-39 seed phrase sequences hidden in classic literature and generate seeds from common patterns.
Project Structure
bip39/
├── README.md
├── Gemfile
│
├── src/ # All source code
│ ├── ruby/
│ │ ├── generators/ # Seed generators
│ │ │ ├── generate_paragraph_seeds.rb # Text-based seeds
│ │ │ ├── generate_birthday_seeds.rb # Birthday index patterns
│ │ │ ├── generate_birthday_hash_seeds.rb # SHA256(date) seeds
│ │ │ ├── generate_password_seeds.rb # Common password seeds
│ │ │ ├── generate_rockyou_seeds.rb # Rockyou wordlist seeds
│ │ │ ├── generate_character_sequences.rb # Pattern-based seeds
│ │ │ ├── find_sequences.rb # Find sequences in texts
│ │ │ ├── find_sequences_texts.rb # Wrapper for texts/
│ │ │ ├── find_sequences_pg19.rb # Wrapper for pg19/
│ │ │ └── check_seeds_etherscan.rb # Etherscan API checker
│ │ └── lib/ # Shared modules
│ │ ├── bip39_common.rb
│ │ ├── seed_utils.rb
│ │ ├── sequence_utils.rb
│ │ └── sequence_generators/ # Pattern generator modules
│ │ ├── base.rb
│ │ ├── character_based.rb
│ │ ├── constructed_constants.rb
│ │ ├── cultural.rb
│ │ ├── deeper_constants.rb
│ │ ├── famous_random.rb
│ │ ├── math_based.rb
│ │ ├── mathematical_constants.rb
│ │ ├── memorable_patterns.rb
│ │ ├── misc.rb
│ │ ├── name_based.rb
│ │ ├── name_crypto.rb
│ │ ├── pattern_based.rb
│ │ ├── physics_constants.rb
│ │ ├── pin_patterns.rb
│ │ ├── prime_patterns.rb
│ │ ├── report.rb
│ │ ├── visual_spatial.rb
│ │ └── weak_known.rb
│ │
│ ├── c/ # High-performance C implementation
│ │ ├── check_seeds_manager.c # TUI manager for checking
│ │ ├── check_seeds_worker_btc.c # ETH+BTC address checker
│ │ ├── check_seeds_worker.c # ETH-only address checker
│ │ ├── check_seeds_gpu.c # GPU-accelerated checker
│ │ ├── generate_paragraph_seeds.c # Fast paragraph seed generator
│ │ ├── find_sequences_worker.c # Fast sequence finder
│ │ ├── base58.c / base58.h # Base58 encoding for BTC
│ │ ├── bech32.c / bech32.h # Bech32 encoding for SegWit
│ │ ├── keccak256.h # Keccak hash for ETH
│ │ ├── ripemd160_neon.h # RIPEMD160 with NEON optimization
│ │ ├── uthash.h # Hash table library
│ │ ├── Makefile
│ │ └── metal/ # Apple Metal GPU shaders
│ │ ├── metal_pbkdf2.h
│ │ ├── metal_pbkdf2.m
│ │ └── pbkdf2_sha512.metal
│ │
│ ├── scripts/ # Download utilities
│ │ ├── download_data.sh
│ │ ├── download_texts.sh
│ │ └── download_pg19.sh
│ │
│ ├── assets/ # Report styling
│ │ └── pdf-style.css
│ │
│ └── test/ # Test scripts
│ └── test_paragraph_seeds.sh
│
├── data/ # Reference data (downloaded)
│ ├── bip39.txt # BIP-39 wordlist (2048 words)
│ ├── eth_rich_addresses.txt # ETH addresses to check
│ ├── btc_rich_addresses.txt # BTC addresses to check
│ ├── metadata.csv # Book metadata
│ └── wordlists/ # Password wordlists
│ └── rockyou.txt
│
├── docs/ # Documentation
│ ├── BOOTSTRAPPING.md
│ ├── HISTORY.md
│ ├── PERFORMANCE.md
│ ├── RESEARCH.md
│ ├── STRATEGIES.md
│ └── SUMMARY.md
│
├── inputs/ # Text corpora (downloaded, gitignored)
│ ├── texts/ # Curated texts (~150 books)
│ └── pg19/ # Project Gutenberg (~28K books)
│ └── batch_01..10/ # Split into 10 batches
│
├── output/ # Generated files (gitignored)
│ └── seeds/ # Generated seed phrases
│
└── reports/ # Generated reports
Quick Start
1. Bootstrap Data
Download the essential data files (BIP-39 wordlist, address lists):
./src/scripts/download_data.sh
2. Download Text Corpora
# Curated texts (~150 classic books)
./src/scripts/download_texts.sh
# Or full PG19 corpus (~28K books, ~12GB)
./src/scripts/download_pg19.sh
3. Build C Workers
cd src/c && make btc manager paragraph
Generate Seeds
Paragraph-Based Seeds (from texts)
Extract BIP-39 words from paragraph starting points in literature:
# Generate 24-word seeds from curated texts (default)
ruby src/ruby/generators/generate_paragraph_seeds.rb texts
# Generate 12-word seeds
ruby src/ruby/generators/generate_paragraph_seeds.rb texts --words=12
# From PG19 corpus (split into 10 batches of ~2800 books each)
ruby src/ruby/generators/generate_paragraph_seeds.rb pg19/batch_01 --words=24
ruby src/ruby/generators/generate_paragraph_seeds.rb pg19/batch_02 --words=12
# ... through batch_10
Birthday-Based Seeds
Generate seeds using birthday date components as word indices:
# 24-word seeds (default)
ruby src/ruby/generators/generate_birthday_seeds.rb
# 12-word seeds
ruby src/ruby/generators/generate_birthday_seeds.rb --words=12
Generates seeds for years 1960-2000 using:
- Multiple date formats (US, EU, ISO)
- Full year and short year variants
- Absolute indexing and walk-through modes
Birthday Hash Seeds
SHA256(date_string) derivation for all date formats:
ruby src/ruby/generators/generate_birthday_hash_seeds.rb --words=12
ruby src/ruby/generators/generate_birthday_hash_seeds.rb --words=24
Password-Based Seeds
Generate seeds from common passwords using SHA256 derivation:
ruby src/ruby/generators/generate_password_seeds.rb --words=12
ruby src/ruby/generators/generate_password_seeds.rb --words=24
Rockyou Wordlist Seeds
Generate seeds from the full rockyou.txt password list:
# First download rockyou.txt to data/wordlists/
ruby src/ruby/generators/generate_rockyou_seeds.rb --words=24
Character Sequence Seeds
Generate seeds using mathematical and linguistic patterns:
ruby src/ruby/generators/generate_character_sequences.rb
Methods include:
- Character-based (a-z groupings, reverse order, alternating)
- Mathematical (Fibonacci, primes, golden ratio, triangular numbers)
- Pattern-based (word length, skip patterns, phonetic)
- Cultural (keyboard layouts, musical scales, chess notation)
Regenerate All Seeds
mkdir -p output/seeds
ruby src/ruby/generators/generate_paragraph_seeds.rb texts --words=12
ruby src/ruby/generators/generate_paragraph_seeds.rb texts --words=24
ruby src/ruby/generators/generate_birthday_seeds.rb --words=12
ruby src/ruby/generators/generate_birthday_seeds.rb --words=24
ruby src/ruby/generators/generate_birthday_hash_seeds.rb --words=12
ruby src/ruby/generators/generate_birthday_hash_seeds.rb --words=24
ruby src/ruby/generators/generate_password_seeds.rb --words=12
ruby src/ruby/generators/generate_password_seeds.rb --words=24
ruby src/ruby/generators/generate_character_sequences.rb --words=12
ruby src/ruby/generators/generate_character_sequences.rb --words=24
ruby src/ruby/generators/generate_paragraph_seeds.rb texts --words=12
ruby src/ruby/generators/generate_paragraph_seeds.rb texts --words=24
ruby src/ruby/generators/generate_paragraph_seeds.rb pg19/batch_01 --words=12
ruby src/ruby/generators/generate_paragraph_seeds.rb pg19/batch_01 --words=24
ruby src/ruby/generators/generate_paragraph_seeds.rb pg19/batch_02 --words=12
ruby src/ruby/generators/generate_paragraph_seeds.rb pg19/batch_02 --words=24
Check Seed Phrases
Use the C-based parallel manager with live TUI:
./src/c/check_seeds_manager output/seeds/my_seeds.txt [workers]
Example UI:
╔══════════════════════════════════════════════════════════════════════════════════════════════════╗
║ SEED CHECKER MANAGER - PARALLEL TUI ║
╠══════════════════════════════════════════════════════════════════════════════════════════════════╣
║ File: my_seeds.txt ║
║ Seeds: 75 Skipped: 25 Workers: 8 Hits: 0 ║
║ Done: 10 Speed: 2.5/s Elapsed: 4s ETA: 26s ║
╠══════════════════════════════════════════════════════════════════════════════════════════════════╣
║ OVERALL: [######################------------------------------] 40% (10/25) ║
╠══════════════════════════════════════════════════════════════════════════════════════════════════╣
║ Worker 1 ● [##############################] deriving 85% abandon ability able... ║
║ Worker 2 ● [######################--------] checking 53000 addr abuse access accident... ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════╝
Features:
- Splits work across all CPU cores (configurable)
- Live progress display for each worker
- Shows derivation and checking phases
- Resume support: Progress is saved automatically
- Skip duplicates: Already-processed seeds are automatically skipped
- Graceful Ctrl+C handling with progress persistence
Etherscan API Check
Check actual on-chain balances:
ruby src/ruby/generators/check_seeds_etherscan.rb output/seeds/my_seeds.txt YOUR_ETHERSCAN_API_KEY
Get an API key: https://etherscan.io/apis (free tier: 100K requests/day)
Output Files
All generators support --words=12 or --words=24 and include a marker in the filename:
texts-paragraph-12w-seeds-YYYYMMDD-HHMMSS.txt(12-word)texts-paragraph-24w-seeds-YYYYMMDD-HHMMSS.txt(24-word)birthday-absolute-full-year-us-12w-YYYYMMDD-HHMMSS.txt- etc.
Derivation Paths Covered
The seed checkers derive addresses from 14 different wallet formats:
| Name | Path | Description |
|---|---|---|
| BIP-44 Standard | m/44'/60'/0'/0/{i} | MetaMask, Trezor, most wallets |
| BIP-44 Accounts | m/44'/60'/{a}'/0/{i} | Multiple accounts (MetaMask) |
| Ledger Live | m/44'/60'/{a}'/0/0 | Ledger Live (one addr per account) |
| Ledger Legacy | m/44'/60'/0'/{i} | Ledger legacy, old MEW/Jaxx |
| BTC Legacy | m/44'/0'/0'/0/{i} | Bitcoin P2PKH (1…) |
| BTC SegWit | m/49'/0'/0'/0/{i} | Bitcoin P2SH-SegWit (3…) |
| BTC Native SegWit | m/84'/0'/0'/0/{i} | Bitcoin Bech32 (bc1q…) |
Where {a} = account index (0-19) and {i} = address index (0-499).
Total addresses derived per seed: ~53,000