| Copyright | © 2017 Marko Bencun 2018-2019 IOHK |
|---|---|
| License | Apache-2.0 |
| Safe Haskell | None |
| Language | Haskell2010 |
Codec.Binary.Bech32.Internal
Description
Implementation of the Bech32 address format.
From an original implementation by Marko Bencun:
Synopsis
- encode :: HumanReadablePart -> DataPart -> Either EncodingError Text
- encodeLenient :: HumanReadablePart -> DataPart -> Text
- data EncodingError = EncodedStringTooLong
- decode :: Text -> Either DecodingError (HumanReadablePart, DataPart)
- decodeLenient :: Text -> Either DecodingError (HumanReadablePart, DataPart)
- data DecodingError
- checksumLength :: Int
- encodedStringMaxLength :: Int
- encodedStringMinLength :: Int
- separatorChar :: Char
- separatorLength :: Int
- data DataPart
- dataPartIsValid :: DataPart -> Bool
- dataPartFromBytes :: ByteString -> DataPart
- dataPartFromText :: Text -> Maybe DataPart
- dataPartFromWords :: [Word5] -> DataPart
- dataPartToBytes :: DataPart -> Maybe ByteString
- dataPartToText :: DataPart -> Text
- dataPartToWords :: DataPart -> [Word5]
- dataCharToWord :: Char -> Maybe Word5
- dataCharFromWord :: Word5 -> Char
- dataCharList :: String
- data HumanReadablePart
- data HumanReadablePartError
- humanReadablePartFromText :: Text -> Either HumanReadablePartError HumanReadablePart
- humanReadablePartToText :: HumanReadablePart -> Text
- humanReadablePartToWords :: HumanReadablePart -> [Word5]
- humanReadablePartMinLength :: Int
- humanReadablePartMaxLength :: Int
- humanReadableCharMinBound :: Char
- humanReadableCharMaxBound :: Char
- convertBits :: Functor f => [Word] -> Int -> Int -> Pad f -> f [Word]
- data Word5
- word5 :: Integral a => a -> Word5
- getWord5 :: Word5 -> Word8
- toBase256 :: [Word5] -> Maybe [Word8]
- toBase32 :: [Word8] -> [Word5]
- noPadding :: Pad Maybe
- yesPadding :: Pad Identity
- newtype CharPosition = CharPosition Int
Encoding & Decoding
encode :: HumanReadablePart -> DataPart -> Either EncodingError Text Source #
Encode a human-readable string and data payload into a Bech32 string.
encodeLenient :: HumanReadablePart -> DataPart -> Text Source #
Like encode but allows output to be longer than 90 characters. This isn't
ideal as the error detection becomes worse as string get longer but it's
still acceptable.
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).
data EncodingError Source #
Represents the set of error conditions that may occur while encoding a Bech32 string.
Constructors
| EncodedStringTooLong |
Instances
| Eq EncodingError Source # | |
Defined in Codec.Binary.Bech32.Internal Methods (==) :: EncodingError -> EncodingError -> Bool # (/=) :: EncodingError -> EncodingError -> Bool # | |
| Show EncodingError Source # | |
Defined in Codec.Binary.Bech32.Internal Methods showsPrec :: Int -> EncodingError -> ShowS # show :: EncodingError -> String # showList :: [EncodingError] -> ShowS # | |
decode :: Text -> Either DecodingError (HumanReadablePart, DataPart) Source #
Decode a Bech32 string into a human-readable part and data part.
decodeLenient :: Text -> Either DecodingError (HumanReadablePart, DataPart) Source #
Like decode but does not enforce a maximum length. See also
encodeLenient for details.
data DecodingError Source #
Represents the set of errors that may occur while decoding a Bech32
string with the decode function.
Constructors
| StringToDecodeTooLong | |
| StringToDecodeTooShort | |
| StringToDecodeHasMixedCase | |
| StringToDecodeMissingSeparatorChar | |
| StringToDecodeContainsInvalidChars [CharPosition] | 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. |
Instances
| Eq DecodingError Source # | |
Defined in Codec.Binary.Bech32.Internal Methods (==) :: DecodingError -> DecodingError -> Bool # (/=) :: DecodingError -> DecodingError -> Bool # | |
| Show DecodingError Source # | |
Defined in Codec.Binary.Bech32.Internal Methods showsPrec :: Int -> DecodingError -> ShowS # show :: DecodingError -> String # showList :: [DecodingError] -> ShowS # | |
checksumLength :: Int Source #
The length of the checksum portion of an encoded string, in bytes.
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.
separatorLength :: Int Source #
The length of the separator portion of an encoded string, in bytes.
Data Part
Represents the data part of a Bech32 string, as defined here: https://git.io/fj8FS
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
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
dataPartFromWords :: [Word5] -> DataPart Source #
Construct a DataPart directly from words.
This function guarantees to satisfy the following properties:
dataPartFromWords (dataPartToWords d) == d dataPartToWords (dataPartFromWords w) == w
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
dataPartToText :: DataPart -> Text Source #
dataCharFromWord :: Word5 -> Char Source #
Maps the specified Word5 onto a character that is permitted to appear
within the data part of a Bech32 string.
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 Part
data HumanReadablePart Source #
Represents the human-readable part of a Bech32 string, as defined here: https://git.io/fj8FS
Instances
| Eq HumanReadablePart Source # | |
Defined in Codec.Binary.Bech32.Internal Methods (==) :: HumanReadablePart -> HumanReadablePart -> Bool # (/=) :: HumanReadablePart -> HumanReadablePart -> Bool # | |
| Show HumanReadablePart Source # | |
Defined in Codec.Binary.Bech32.Internal Methods showsPrec :: Int -> HumanReadablePart -> ShowS # show :: HumanReadablePart -> String # showList :: [HumanReadablePart] -> ShowS # | |
| Semigroup HumanReadablePart Source # | |
Defined in Codec.Binary.Bech32.Internal Methods (<>) :: HumanReadablePart -> HumanReadablePart -> HumanReadablePart # sconcat :: NonEmpty HumanReadablePart -> HumanReadablePart # stimes :: Integral b => b -> HumanReadablePart -> HumanReadablePart # | |
| Monoid HumanReadablePart Source # | |
Defined in Codec.Binary.Bech32.Internal Methods mappend :: HumanReadablePart -> HumanReadablePart -> HumanReadablePart # mconcat :: [HumanReadablePart] -> HumanReadablePart # | |
data HumanReadablePartError Source #
Represents the set of error conditions that may occur while parsing the human-readable part of a Bech32 string.
Constructors
| HumanReadablePartTooShort | |
| HumanReadablePartTooLong | |
| HumanReadablePartContainsInvalidChars [CharPosition] |
Instances
| Eq HumanReadablePartError Source # | |
Defined in Codec.Binary.Bech32.Internal Methods (==) :: HumanReadablePartError -> HumanReadablePartError -> Bool # (/=) :: HumanReadablePartError -> HumanReadablePartError -> Bool # | |
| Show HumanReadablePartError Source # | |
Defined in Codec.Binary.Bech32.Internal Methods showsPrec :: Int -> HumanReadablePartError -> ShowS # show :: HumanReadablePartError -> String # showList :: [HumanReadablePartError] -> ShowS # | |
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.
humanReadablePartToWords :: HumanReadablePart -> [Word5] Source #
Convert the specified human-readable part to a list of words.
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.
Bit Manipulation
convertBits :: Functor f => [Word] -> Int -> Int -> Pad f -> f [Word] Source #
Big-endian conversion of a word string from base '2^frombits' to base
'2^tobits'. The frombits and twobits parameters must be positive, while
'2^frombits' and '2^tobits' must be smaller than the size of Word. Every
value in dat must be strictly smaller than '2^frombits'.
yesPadding :: Pad Identity Source #
Character Manipulation
newtype CharPosition Source #
The zero-based position of a character in a string, counting from the left.
Constructors
| CharPosition Int |
Instances
| Eq CharPosition Source # | |
Defined in Codec.Binary.Bech32.Internal | |
| Ord CharPosition Source # | |
Defined in Codec.Binary.Bech32.Internal Methods compare :: CharPosition -> CharPosition -> Ordering # (<) :: CharPosition -> CharPosition -> Bool # (<=) :: CharPosition -> CharPosition -> Bool # (>) :: CharPosition -> CharPosition -> Bool # (>=) :: CharPosition -> CharPosition -> Bool # max :: CharPosition -> CharPosition -> CharPosition # min :: CharPosition -> CharPosition -> CharPosition # | |
| Show CharPosition Source # | |
Defined in Codec.Binary.Bech32.Internal Methods showsPrec :: Int -> CharPosition -> ShowS # show :: CharPosition -> String # showList :: [CharPosition] -> ShowS # | |