bech32-1.1.1: Implementation of the Bech32 cryptocurrency address format (BIP 0173).
Copyright© 2017 Marko Bencun 2019-2020 IOHK
LicenseApache-2.0
Safe HaskellNone
LanguageHaskell2010

Codec.Binary.Bech32

Description

Implementation of the Bech32 address format.

Based on an original implementation by Marko Bencun.

Synopsis

Basic Usage

Encoding

encode :: HumanReadablePart -> DataPart -> Either EncodingError Text Source #

Encode a Bech32 string from a human-readable prefix and data payload.

Example

>>> 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

decode :: Text -> Either DecodingError (HumanReadablePart, DataPart) Source #

Decode a Bech32 string into a human-readable prefix and data payload.

Example

>>> 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!"

Error Handling

Encoding

data EncodingError Source #

Represents the set of error conditions that may occur while encoding a Bech32 string.

Constructors

EncodedStringTooLong

The resultant encoded string would be longer than encodedStringMaxLength.

Decoding

data DecodingError Source #

Represents the set of errors that may occur while decoding a Bech32 string with the decode function.

Constructors

StringToDecodeTooLong

The string to decode is longer than encodedStringMaxLength.

StringToDecodeTooShort

The string to decode is shorter than encodedStringMinLength.

StringToDecodeHasMixedCase

The string to decode contains both upper case and lower case characters.

StringToDecodeMissingSeparatorChar

The string to decode is missing the separator character, specified by separatorChar.

StringToDecodeContainsInvalidChars [CharPosition]

The string to decode contains one or more invalid characters.

In cases where it is possible to determine the exact locations of erroneous characters, this list will encode those locations. Clients can use this information to provide user feedback.

In cases where it isn't possible to reliably determine the locations of erroneous characters, this list will be empty.

Core Types

Data Payloads

data DataPart Source #

Represents the data part of a Bech32 string, as defined here: https://git.io/fj8FS

Instances

Instances details
Eq DataPart Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Show DataPart Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Semigroup DataPart Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Monoid DataPart Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Conversion to and from Words

dataPartFromWords :: [Word5] -> DataPart Source #

Construct a DataPart directly from a list of words.

This function guarantees to satisfy the following properties:

dataPartFromWords (dataPartToWords d) == d
dataPartToWords (dataPartFromWords w) == w

dataPartToWords :: DataPart -> [Word5] Source #

Unpack a DataPart into a list of its constituent words.

This function guarantees to satisfy the following properties:

dataPartFromWords (dataPartToWords d) == d
dataPartToWords (dataPartFromWords w) == w

Conversion to and from Bytes

dataPartFromBytes :: ByteString -> DataPart Source #

Constructs a DataPart from a ByteString.

This function encodes a ByteString in such a way that guarantees it can be successfully decoded with the dataPartToBytes function:

dataPartToBytes (dataPartFromBytes b) == Just b

dataPartToBytes :: DataPart -> Maybe ByteString Source #

Attempts to extract a ByteString from a DataPart.

This function guarantees to satisfy the following property:

dataPartToBytes (dataPartFromBytes b) == Just b

Conversion to and from Text

dataPartFromText :: Text -> Maybe DataPart Source #

Constructs a DataPart from textual input.

All characters in the input must be a member of dataCharList, the set of characters permitted to appear within the data part of a Bech32 string.

Returns Nothing if any character in the input is not a member of dataCharList.

This function guarantees to satisfy the following property:

dataPartFromText (dataPartToText d) == Just d

dataPartToText :: DataPart -> Text Source #

Converts a DataPart to Text, using the Bech32 character set to render the data.

This function guarantees to satisfy the following property:

dataPartFromText (dataPartToText d) == Just d

Human-Readable Prefixes

Conversion to and from Text

humanReadablePartFromText :: Text -> Either HumanReadablePartError HumanReadablePart Source #

Parses the human-readable part of a Bech32 string, as defined here: https://git.io/fj8FS

humanReadablePartToText :: HumanReadablePart -> Text Source #

Get the raw text of the human-readable part of a Bech32 string.

Error Handling

data HumanReadablePartError Source #

Represents the set of error conditions that may occur while parsing the human-readable part of a Bech32 string.

Constructors

HumanReadablePartTooShort

The human-readable part is shorter than humanReadablePartMinLength.

HumanReadablePartTooLong

The human-readable part is longer than humanReadablePartMaxLength.

HumanReadablePartContainsInvalidChars [CharPosition]

The human-readable part contains one or more characters whose values are less than humanReadableCharMinBound or greater than humanReadableCharMaxBound.

Additional Types

Character Positions

newtype CharPosition Source #

The zero-based position of a character in a string, counting from the left.

Values of this type are typically used to reflect the positions of errors.

See DecodingError.

Constructors

CharPosition Int 

Data Words

data Word5 Source #

Represents a data word of 5 bits in width.

Each character in the data portion of a Bech32 string encodes exactly 5 bits of data.

Construction and Deconstruction

Use the toEnum and fromEnum functions to construct and deconstruct Word5 values.

Packing Words into Data Payloads

Use the dataPartFromWords and dataPartToWords functions to pack and unpack Word5 values into and out of data payloads.

Instances

Instances details
Bounded Word5 Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Enum Word5 Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Eq Word5 Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Methods

(==) :: Word5 -> Word5 -> Bool #

(/=) :: Word5 -> Word5 -> Bool #

Ord Word5 Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Methods

compare :: Word5 -> Word5 -> Ordering #

(<) :: Word5 -> Word5 -> Bool #

(<=) :: Word5 -> Word5 -> Bool #

(>) :: Word5 -> Word5 -> Bool #

(>=) :: Word5 -> Word5 -> Bool #

max :: Word5 -> Word5 -> Word5 #

min :: Word5 -> Word5 -> Word5 #

Show Word5 Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Methods

showsPrec :: Int -> Word5 -> ShowS #

show :: Word5 -> String #

showList :: [Word5] -> ShowS #

Ix Word5 Source # 
Instance details

Defined in Codec.Binary.Bech32.Internal

Advanced Usage

Encoding and Decoding with Greater Leniency

encodeLenient :: HumanReadablePart -> DataPart -> Text Source #

Like encode but allows output to be longer than 90 characters.

This isn't ideal, as Bech32 error detection becomes worse as strings get longer, but it may be useful in certain circumstances.

From BIP-0173:

"Even though the chosen code performs reasonably well up to 1023 characters, other designs are preferable for lengths above 89 characters (excluding the separator)."

decodeLenient :: Text -> Either DecodingError (HumanReadablePart, DataPart) Source #

Like decode but does not enforce a maximum length.

See also encodeLenient for details.

Fundamental Constants

Data Payloads

dataCharList :: String Source #

A list of all characters that are permitted to appear within the data part of a Bech32 string.

See here for more details: https://git.io/fj8FS

Human-Readable Prefixes

humanReadablePartMinLength :: Int Source #

The shortest length permitted for the human-readable part of a Bech32 string.

humanReadablePartMaxLength :: Int Source #

The longest length permitted for the human-readable part of a Bech32 string.

humanReadableCharMinBound :: Char Source #

The lower bound of the set of characters permitted to appear within the human-readable part of a Bech32 string.

humanReadableCharMaxBound :: Char Source #

The upper bound of the set of characters permitted to appear within the human-readable part of a Bech32 string.

Encoded Strings

encodedStringMaxLength :: Int Source #

The maximum length of an encoded string, in bytes.

This length includes the human-readable part, the separator character, the encoded data portion, and the checksum.

encodedStringMinLength :: Int Source #

The minimum length of an encoded string, in bytes.

This length includes the human-readable part, the separator character, the encoded data portion, and the checksum.

separatorChar :: Char Source #

The separator character.

This character appears immediately after the human-readable part and before the data part in an encoded string.