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.
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.
| 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" |
# Config file - DON'T use bech32m
address_type: "bech32m" # WRONG!
# Shell script - DON'T use taproot for Bitcoin Core RPC
bitcoin-cli getnewaddress "" taproot # WRONG!
# Config file - Use taproot
address_type: "taproot" # CORRECT!
# Shell script - Use bech32m for Bitcoin Core RPC
bitcoin-cli getnewaddress "" bech32m # CORRECT!
All Taproot addresses are encoded using bech32m, but:
| 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 |
The project has two different type definitions:
// 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:
// internal/infrastructure/api/btc/btc/mapper.go
// FromAddressType: "bech32m" (Bitcoin Core) → "taproot" (user-facing)
// ToAddressType: "taproot" (user-facing) → "bech32m" (Bitcoin Core)
When working with Taproot/Bech32m code:
address_type: "taproot"WALLET_ADDRESS_TYPE="taproot"bech32mbech32mAddrTypeTaproot (value: "taproot")AddressTypeTaproot (value: "bech32m")| 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 |