Skip to content

Haskell implementation of the Bech32 address format (BIP 0173).

License

Notifications You must be signed in to change notification settings

IntersectMBO/bech32

Repository files navigation

bech32 command-line

A small executable is available for rapid conversion in the console. You can obtain a pre-compiled bech32 binary for Linux, macOS, and Windows as part of the cardano-wallet Releases.

Usage: bech32 [PREFIX]
  Convert to and from bech32 strings. Data are read from standard input.

Available options:
  -h,--help                Show this help text
  PREFIX                   An optional human-readable prefix (e.g. 'addr').
                             - When provided, the input text is decoded from
                               various encoding formats and re-encoded to
                               bech32 using the given prefix.
                             - When omitted, the input text is decoded from
                               bech32 to base16.
  -v,--version             output version information and exit

Supported encoding formats: Base16, Bech32 & Base58.

Examples

To Bech32:

$ bech32 base16_ <<< 706174617465
base16_1wpshgct5v5r5mxh0

$ bech32 base58_ <<< Ae2tdPwUPEYy
base58_1p58rejhd9592uusa8pzj2

$ bech32 new_prefix <<< old_prefix1wpshgcg2s33x3
new_prefix1wpshgcgeak9mv

From Bech32

$ bech32 <<< base16_1wpshgct5v5r5mxh0
706174617465

Bech32 Haskell Libraries

The repository provides Haskell libraries for working with the Bech32 address format, as specified by BIP-0173.

There are two libraries provided:

  • bech32

    Core primitives for encoding and decoding Bech32 strings.

  • bech32-th

    Template-Haskell specific extensions, including quasiquoters for compile-time parsing of string literals.

Contents

Documentation

For comprehensive instructions on how to use these libraries, see the Haddock documentation:

Usage

Encoding Data

>>> import Prelude
>>> import Codec.Binary.Bech32
>>> import Data.Text.Encoding

First, prepare a human-readable prefix:

>>> Right prefix = humanReadablePartFromText "example"

Next, prepare a data payload:

>>> messageToEncode = "Lorem ipsum dolor sit amet!"
>>> dataPart = dataPartFromBytes $ encodeUtf8 messageToEncode

Finally, produce a Bech32 string:

>>> encode prefix dataPart
Right "example1f3hhyetdyp5hqum4d5sxgmmvdaezqumfwssxzmt9wsss9un3cx"

Decoding Data

>>> import Prelude
>>> import Codec.Binary.Bech32
>>> import Data.Text.Encoding

First, decode the input:

>>> input = "example1f3hhyetdyp5hqum4d5sxgmmvdaezqumfwssxzmt9wsss9un3cx"
>>> Right (prefix, dataPart) = decode input

Next, examine the decoded human-readable prefix:

>>> humanReadablePartToText prefix
"example"

Finally, examine the decoded data payload:

>>> decodeUtf8 <$> dataPartToBytes dataPart
Just "Lorem ipsum dolor sit amet!"