diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a39f77..fff58dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Update installation to `cabal` -- Updated `bech32` Rust crate to 0.11 +- Updated Rust crates: + - `bech32` to 0.11 + - `orchard` to 0.7.0 + - `zcash_note_encryption` to 0.4.0 + - `zcash_primitives` to 0.13.0 + - `zcash_client_backend` to 0.10.0 + - `zip32` to 0.1.0 +- Changed the `UnifiedAddress` to allow for optional shielded receivers ### Removed diff --git a/src/ZcashHaskell/Orchard.hs b/src/ZcashHaskell/Orchard.hs index 4a0f530..22a82c2 100644 --- a/src/ZcashHaskell/Orchard.hs +++ b/src/ZcashHaskell/Orchard.hs @@ -76,8 +76,12 @@ isValidUnifiedAddress str = makeUA x = UnifiedAddress whichNet - (raw_o x) - (raw_s x) + (if BS.length (raw_o x) == 43 + then Just (raw_o x) + else Nothing) + (if BS.length (raw_s x) == 43 + then Just (raw_s x) + else Nothing) (if not (BS.null (raw_t x)) then Just $ TransparentAddress P2PKH whichNet (raw_t x) else if not (BS.null (raw_to x)) @@ -98,18 +102,21 @@ encodeUnifiedAddress ua = encodeBech32m (E.encodeUtf8 hr) b Nothing -> BS.empty Just t -> case ta_type t of - P2SH -> packReceiver 0x01 $ ta_bytes t - P2PKH -> packReceiver 0x00 $ ta_bytes t + P2SH -> packReceiver 0x01 $ Just $ ta_bytes t + P2PKH -> packReceiver 0x00 $ Just $ ta_bytes t sReceiver = packReceiver 0x02 $ s_rec ua oReceiver = packReceiver 0x03 $ o_rec ua padding = E.encodeUtf8 $ T.justifyLeft 16 '\NUL' hr - packReceiver :: Word8 -> BS.ByteString -> BS.ByteString - packReceiver typeCode receiver = - if BS.length receiver > 1 - then BS.singleton typeCode `BS.append` - (BS.singleton . toEnum . BS.length) receiver `BS.append` - receiver - else BS.empty + packReceiver :: Word8 -> Maybe BS.ByteString -> BS.ByteString + packReceiver typeCode receiver' = + case receiver' of + Just receiver -> + if BS.length receiver > 1 + then BS.singleton typeCode `BS.append` + (BS.singleton . toEnum . BS.length) receiver `BS.append` + receiver + else BS.empty + Nothing -> BS.empty -- | Attempts to decode the given bytestring into a Unified Full Viewing Key decodeUfvk :: BS.ByteString -> Maybe UnifiedFullViewingKey diff --git a/src/ZcashHaskell/Types.hs b/src/ZcashHaskell/Types.hs index 931828e..41e41e8 100644 --- a/src/ZcashHaskell/Types.hs +++ b/src/ZcashHaskell/Types.hs @@ -280,8 +280,8 @@ instance FromJSON ShieldedOutput where -- | Type to represent a Unified Address data UnifiedAddress = UnifiedAddress { ua_net :: !ZcashNet - , o_rec :: !OrchardReceiver - , s_rec :: !SaplingReceiver + , o_rec :: !(Maybe OrchardReceiver) + , s_rec :: !(Maybe SaplingReceiver) , t_rec :: !(Maybe TransparentAddress) } deriving (Prelude.Show, Eq, Read) diff --git a/zcash-haskell.cabal b/zcash-haskell.cabal index 435f12f..11cbd72 100644 --- a/zcash-haskell.cabal +++ b/zcash-haskell.cabal @@ -5,7 +5,7 @@ cabal-version: 3.0 -- see: https://github.com/sol/hpack name: zcash-haskell -version: 0.4.3.2 +version: 0.4.4.0 synopsis: Utilities to interact with the Zcash blockchain description: Please see the README on the repo at category: Blockchain