# Bitcoin Phrase Checker

A modular and extensible Go program that derives Bitcoin addresses from a BIP39 mnemonic phrase and provides comprehensive transaction history and balance analysis using public APIs.

## Features

### Core Functionality
- **BIP39 Support**: Validates and processes mnemonic phrases (12/24 words) with optional passphrases
- **Multi-Path Derivation**: Automatically derives addresses from standard Bitcoin derivation paths:
  - **BIP44 (Legacy)**: `m/44'/0'/0'/0` - P2PKH addresses (starting with `1...`)
  - **BIP49 (SegWit)**: `m/49'/0'/0'/0` - P2SH-wrapped SegWit (starting with `3...`)
  - **BIP84 (Native SegWit)**: `m/84'/0'/0'/0` - Bech32 addresses (starting with `bc1...`)
- **Comprehensive Analysis**: For each address, displays:
  - Current balance
  - Total received amount
  - Total sent amount
  - Transaction count
  - Derivation path

### Transaction History
- **Chronological Display**: Shows all transactions sorted by date (YYYY-MM-DD format)
- **Running Balance**: Calculates and displays balance after each transaction
- **Transaction Types**: Identifies received, sent, and self-transfer transactions
- **Detailed Statistics**:
  - Total received amount and count
  - Total sent amount and count
  - Transaction confirmation status

### Architecture
- **Modular Design**: Organized into separate packages for easy extension
  - `types/`: Common interfaces and data structures
  - `bitcoin/`: Bitcoin-specific implementation (derivation, API, analysis)
  - Ready for additional blockchain support (e.g., Ethereum)
- **Testable**: Comprehensive test suite with network tests using known mnemonic
- **Public API Integration**: Uses Blockstream.info API with built-in rate limiting

## Installation

```bash
# Clone or download the project
cd btcphrasechecker

# Download dependencies
go mod download

# Build
go build -o btcphrasechecker
```

## Usage

### Basic Usage

```bash
# Check wallet with mnemonic only
./btcphrasechecker -mnemonic "your twelve or twenty four word mnemonic phrase here"

# With optional passphrase
./btcphrasechecker -mnemonic "your mnemonic phrase" -passphrase "your passphrase"

# Customize number of addresses to check (default: 20)
./btcphrasechecker -mnemonic "your mnemonic" -count 50
```

### Example Output

```
Bitcoin Wallet Analysis
======================

Checking BIP44 (Legacy): m/44'/0'/0'/0 - P2PKH addresses (1...)
-----------------------------------------------------------
  1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA
    Path:     m/44'/0'/0'/0/0
    Balance:  0.00000000 BTC
    Received: 0.01146203 BTC
    Sent:     0.01146203 BTC
    Txs:      46

Checking BIP49 (SegWit): m/49'/0'/0'/0 - P2SH-wrapped SegWit (3...)
-----------------------------------------------------------
  37VucYSaXLCAsxYyAPfbSi9eh4iEcbShgf
    Path:     m/49'/0'/0'/0/0
    Balance:  0.00000000 BTC
    Received: 0.06783787 BTC
    Sent:     0.06783787 BTC
    Txs:      22

Checking BIP84 (Native SegWit): m/84'/0'/0'/0 - Bech32 addresses (bc1...)
-----------------------------------------------------------
  bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu
    Path:     m/84'/0'/0'/0/0
    Balance:  0.00000000 BTC
    Received: 0.04021550 BTC
    Sent:     0.04021550 BTC
    Txs:      166

Fetching transaction history...

======================
Summary
======================
Total Balance:        0.00000000 BTC
Total Received:       0.16710427 BTC (94 transactions)
Total Sent:           0.16710427 BTC (91 transactions)
Total Transactions:   360
Active Addresses:     44

Active Addresses Summary:
-----------------------------------------------------------
  1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA
    Path:     m/44'/0'/0'/0/0
    Balance:  0.00000000 BTC
    Received: 0.01146203 BTC
    Sent:     0.01146203 BTC
    Txs:      46

======================
Transaction History
======================
Date                 Type         Confirmed  Amount (BTC)    Balance (BTC)  TxID
---------------------------------------------------------------------------------------------------------------------------
2014-11-09 03:31:39  + Received   Yes          0.00130000      0.00130000  d6f136091b72cb4f...
2014-11-18 07:42:59  - Sent       Yes          0.00130000      0.00000000  f0ac3836d27b2914...
2015-02-13 04:23:20  + Received   Yes          0.00016924      0.00016924  762ff05a44abf82e...
...
```

## Testing

The project includes a comprehensive test suite that uses the well-known test mnemonic:

```
abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
```

### Run Tests

```bash
# Run all tests
go test ./...

# Run tests with verbose output
go test -v ./...

# Run specific test
go test -v ./bitcoin -run TestDeriveAddresses

# Run with network timeout (tests make real API calls)
go test ./... -timeout 5m
```

### Test Coverage

- **Derivation Tests**: Verifies correct address generation for all BIP standards
- **API Tests**: Tests Blockstream API integration with real network calls
- **Integration Tests**: End-to-end wallet analysis with the test mnemonic
- **Passphrase Tests**: Validates different seeds from different passphrases
- **Known Address Tests**: Validates against known good addresses

## Project Structure

```
btcphrasechecker/
├── main.go                  # Main entry point and CLI handling
├── main_test.go             # Integration tests
├── go.mod                   # Go module dependencies
├── README.md                # This file
│
├── types/
│   └── types.go            # Common types and interfaces
│
└── bitcoin/
    ├── derivation.go       # BIP32/44/49/84 address derivation
    ├── derivation_test.go  # Derivation tests
    ├── api.go              # Blockstream API client
    ├── api_test.go         # API tests
    └── analyzer.go         # Wallet analysis logic
```

## Extensibility

The codebase is designed to be easily extensible for additional blockchain support:

1. **Add New Chain**: Implement the `ChainAnalyzer` interface in `types/types.go`
2. **Create Package**: Add a new package (e.g., `ethereum/`) with chain-specific logic
3. **Update Main**: Add chain selection logic in `main.go`

Example interface:
```go
type ChainAnalyzer interface {
    DeriveAddresses(seed []byte, count int) ([]AddressInfo, error)
    GetAddressInfo(address string) (balance, txCount uint64, received, sent uint64, err error)
    GetTransactions(address string) ([]Transaction, error)
    GetChain() Chain
}
```

## Security Notes

- **Never share your mnemonic phrase** - This tool is for authorized wallet analysis only
- **Read-only**: This tool only reads blockchain data; it cannot spend funds
- **Public API**: Uses Blockstream.info public API which may log requests
- **Privacy**: For maximum privacy, consider using a VPN or running your own Bitcoin node with API
- **Rate Limiting**: 100ms delay between requests to avoid API throttling
- **No Key Export**: Private keys are never exposed or stored

## Dependencies

- `github.com/tyler-smith/go-bip39` - BIP39 mnemonic implementation
- `github.com/btcsuite/btcd` - Bitcoin library suite including:
  - Address generation and encoding
  - BIP32 HD key derivation
  - Script building for P2SH-wrapped SegWit

## Development

### Building

```bash
go build -o btcphrasechecker
```

### Testing

```bash
# Run tests
go test ./...

# Run with coverage
go test -cover ./...

# Run with race detection
go test -race ./...
```

### Code Quality

```bash
# Format code
go fmt ./...

# Lint code (requires golangci-lint)
golangci-lint run

# Vet code
go vet ./...
```

## Future Enhancements

- [ ] Ethereum support
- [ ] Bitcoin testnet support
- [ ] Custom derivation paths
- [ ] Export to CSV/JSON
- [ ] Local Bitcoin Core RPC support
- [ ] UTXO tracking
- [ ] Multi-signature wallet support
- [ ] Hardware wallet integration

## License

MIT

## Contributing

Contributions are welcome! Please ensure:
- All tests pass
- Code is formatted with `go fmt`
- New features include tests
- Security best practices are followed
