# Btc Terminology

> Critical Bitcoin terminology rules to prevent confusion between bech32m (encoding) and taproot (address type). Use when working on BTC-related code, config files, or shell scripts.

- Skill: `hiromaily/btc-terminology` (Agent Skill)
- Install (CLI): `npx skillmds@latest add hiromaily/btc-terminology`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hiromaily/btc-terminology/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: hiromaily (https://skillmd.com/u/hiromaily)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/hiromaily/btc-terminology

---


# BTC Terminology Rules

## 🚨 CRITICAL: Bech32m vs Taproot

**This is a common source of bugs.** Do NOT confuse these terms:

| Term        | What It Is                                  | Where Used                      |
| ----------- | ------------------------------------------- | ------------------------------- |
| **bech32m** | Encoding format (HOW address is serialized) | Bitcoin Core RPC, shell scripts |
| **taproot** | Address type (WHAT the address represents)  | Config files, domain model      |

**Key Rule:** `bech32m` ≠ `taproot` — They are related but NOT interchangeable.

## Quick Reference Table

| Context                                                | Correct Term | Example                                |
| ------------------------------------------------------ | ------------ | -------------------------------------- |
| Config YAML/TOML files                                 | `taproot`    | `address_type: "taproot"`              |
| Environment variables                                  | `taproot`    | `WALLET_ADDRESS_TYPE="taproot"`        |
| Bitcoin Core CLI/RPC                                   | `bech32m`    | `bitcoin-cli getnewaddress "" bech32m` |
| Shell scripts (receiver addresses)                     | `bech32m`    | `getnewaddress "" bech32m`             |
| Go domain code (`internal/domain/address/`)            | `taproot`    | `AddrTypeTaproot`                      |
| Go Bitcoin Core interface (`internal/domain/bitcoin/`) | `bech32m`    | `AddressTypeTaproot = "bech32m"`       |

## Common Mistakes

### ❌ WRONG

```yaml
# Config file - DON'T use bech32m
address_type: "bech32m" # WRONG!
```

```bash
# Shell script - DON'T use taproot for Bitcoin Core RPC
bitcoin-cli getnewaddress "" taproot  # WRONG!
```

### ✅ CORRECT

```yaml
# Config file - Use taproot
address_type: "taproot" # CORRECT!
```

```bash
# Shell script - Use bech32m for Bitcoin Core RPC
bitcoin-cli getnewaddress "" bech32m  # CORRECT!
```

## Technical Background

### Why Two Different Terms?

1. **Taproot** (BIP341) = SegWit version 1 address type (P2TR - Pay-to-Taproot)
2. **Bech32m** (BIP350) = Encoding format that fixes checksum issues in original Bech32

All Taproot addresses are encoded using bech32m, but:

- User-facing config uses "taproot" (what you want)
- Bitcoin Core RPC uses "bech32m" (how it's encoded)

### Address Format Comparison

| Encoding    | SegWit Version | Address Type | Prefix        | Config Value  |
| ----------- | -------------- | ------------ | ------------- | ------------- |
| Base58      | N/A            | P2PKH        | `1...`        | `legacy`      |
| Base58      | N/A            | P2SH         | `3...`        | `p2sh-segwit` |
| Bech32      | v0             | P2WPKH       | `bc1q...`     | `bech32`      |
| **Bech32m** | **v1**         | **P2TR**     | **`bc1p...`** | **`taproot`** |

## Codebase Mapping

The project has two different type definitions:

```go
// internal/domain/bitcoin/address_type.go
// For Bitcoin Core RPC communication
AddressTypeTaproot AddressType = "bech32m"  // Bitcoin Core uses "bech32m"

// internal/domain/address/types.go
// For user-facing configuration
AddrTypeTaproot AddrType = "taproot"  // User sees "taproot"
```

Conversion between these is handled by mapper functions:

```go
// internal/infrastructure/api/btc/btc/mapper.go
// FromAddressType: "bech32m" (Bitcoin Core) → "taproot" (user-facing)
// ToAddressType:   "taproot" (user-facing) → "bech32m" (Bitcoin Core)
```

## Verification Checklist

When working with Taproot/Bech32m code:

- [ ] Config files (YAML/TOML) use `address_type: "taproot"`
- [ ] Environment variables use `WALLET_ADDRESS_TYPE="taproot"`
- [ ] Bitcoin Core RPC calls in shell scripts use `bech32m`
- [ ] Shell scripts generating receiver addresses use `bech32m`
- [ ] Go code uses correct type for the layer:
  - Domain/config layer: `AddrTypeTaproot` (value: `"taproot"`)
  - Bitcoin Core interface: `AddressTypeTaproot` (value: `"bech32m"`)

## Related Files

| File                                            | Purpose                                |
| ----------------------------------------------- | -------------------------------------- |
| `internal/domain/address/types.go`              | User-facing `AddrType` definitions     |
| `internal/domain/bitcoin/address_type.go`       | Bitcoin Core `AddressType` definitions |
| `internal/infrastructure/api/btc/btc/mapper.go` | Type conversion functions              |
| `docs/chains/btc/taproot/user-guide.md`         | Taproot user guide                     |

## Related Documentation

- [BIP350](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki) - Bech32m specification
- [BIP341](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki) - Taproot specification
- [BIP86](https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki) - Taproot key derivation (m/86'/...)

