{- Copyright 2022-2024 Vergara Technologies LLC This file is part of Zcash-Haskell. Zcash-Haskell is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Zcash-Haskell is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Zcash-Haskell. If not, see . -} {-# LANGUAGE OverloadedStrings #-} -- | -- Module : ZcashHaskell.Transparent -- Copyright : 2022-2024 Vergara Technologies -- License : LGPL-3 -- -- Maintainer : pitmutt@vergara.tech -- Stability : experimental -- Portability : unknown -- -- Functions to interact with the transparent addresses in the Zcash blockchain -- module ZcashHaskell.Transparent where import Crypto.Hash import qualified Data.ByteArray as BA import qualified Data.ByteString as BS import Data.ByteString.Base58 (bitcoinAlphabet, encodeBase58) import qualified Data.Text as T import qualified Data.Text.Encoding as E import Data.Word import ZcashHaskell.Types ( TransparentAddress(..) , TransparentType(..) , ZcashNet(..) ) encodeTransparent :: TransparentAddress -> T.Text encodeTransparent t = case ta_type t of P2SH -> case ta_net t of MainNet -> encodeTransparent' (0x1c, 0xbd) $ ta_bytes t _ -> encodeTransparent' (0x1c, 0xba) $ ta_bytes t P2PKH -> case ta_net t of MainNet -> encodeTransparent' (0x1c, 0xb8) $ ta_bytes t _ -> encodeTransparent' (0x1d, 0x25) $ ta_bytes t where encodeTransparent' :: (Word8, Word8) -> BS.ByteString -> T.Text encodeTransparent' (a, b) h = E.decodeUtf8 $ encodeBase58 bitcoinAlphabet $ digest <> BS.take 4 checksum where sha256 :: BS.ByteString -> BS.ByteString sha256 bs = BA.convert (hash bs :: Digest SHA256) digest = BS.pack [a, b] <> h checksum = sha256 $ sha256 digest