BIP 173 / BIP 350 · Bitcoin SegWit
Bitcoin SegWit address encoding with built-in checksum for error detection. Bech32 (BIP 173) for v0 and Bech32m (BIP 350) for v1+ (Taproot). Alphabet is qpzry9x8gf2tvdw0s3jn54khce6mua7l.
Bech32 (BIP 173) for v0 SegWit, or Bech32m (BIP 350) for v1+ Taproot.HRP (human-readable part) — bc for mainnet, tb for testnet.Hex data → Bech32 — the first byte is the witness version, the rest is the witness program.Bech32 address; hit Copy result to grab it to your clipboard.bc1… address into Bech32 → Hex data and the hex payload appears below it.Clear any time to reset a box and start over.Build bc1… P2WPKH, P2WSH, and Taproot addresses from a witness version plus a witness program, encoded with the correct BCH checksum.
The built-in BCH checksum catches typos. Decoding surfaces invalid characters, missing separators, and checksum mismatches instead of silently accepting a bad address.
Choose the right checksum constant for your target: Bech32 for v0, Bech32m for v1+ (Taproot), per BIP 173 and BIP 350.
Encode testnet or regtest addresses with tb, bcrt, or any prefix your network defines — not just mainnet bc.
Decode an address back to its witness version and program bytes as hex, so you can see exactly what's behind the string.
Everything runs in your browser. Nothing is uploaded, logged, or sent to a server — safe for addresses and keys under test.
They're the SegWit address encodings defined in BIP 173 (Bech32) and BIP 350 (Bech32m). Both use a 32-character alphabet and a BCH checksum; they differ only in the checksum constant.
The checksum constant. Bech32 uses 1; Bech32m uses 0x2bc830a3. Bech32 has a weakness where certain data lengths can fail checksum detection, so Bech32m is required for v1+ (Taproot) outputs.
The human-readable part — the prefix before the 1 separator. It identifies the network: bc for Bitcoin mainnet, tb for testnet. This tool lets you override it for other networks.
That's the mainnet HRP bc followed by the mandatory 1 separator. On testnet you'll instead see tb1.
The address was likely mistyped, truncated, or the wrong variant was used. The BCH checksum no longer matches the data, so the decoder rejects it rather than returning garbage.
No. It only encodes and decodes the address string itself. It never touches private keys, never signs anything, and never broadcasts a transaction.
Never. All encoding and decoding happens locally in JavaScript. Your input is not sent to, stored on, or logged by any server.