diff --git a/src/ZcashHaskell/Orchard.hs b/src/ZcashHaskell/Orchard.hs index d7c3e38..145c503 100644 --- a/src/ZcashHaskell/Orchard.hs +++ b/src/ZcashHaskell/Orchard.hs @@ -37,6 +37,11 @@ import qualified Data.Text as T import qualified Data.Text.Encoding as E import Data.Word import Foreign.Rust.Marshall.Variable +import ZcashHaskell.Sapling (decodeSaplingAddress) +import ZcashHaskell.Transparent + ( decodeExchangeAddress + , decodeTransparentAddress + ) import ZcashHaskell.Types import ZcashHaskell.Utils (encodeBech32, encodeBech32m, f4Jumble) @@ -221,8 +226,33 @@ getOrchardNotePosition :: OrchardWitness -> Integer getOrchardNotePosition = fromIntegral . rustWrapperReadOrchardPosition . hexBytes . orchWit +-- | Update the witness of an Orchard note updateOrchardWitness :: OrchardWitness -> [HexString] -> OrchardWitness updateOrchardWitness wit cmus = OrchardWitness $ withPureBorshVarBuffer $ rustWrapperUpdateOrchardWitness (toBytes $ orchWit wit) (map toBytes cmus) + +-- | Parse a potential Zcash address +parseAddress :: BS.ByteString -> Maybe ValidAddress +parseAddress t = + case isValidUnifiedAddress t of + Nothing -> + case decodeSaplingAddress t of + Nothing -> + case decodeTransparentAddress t of + Nothing -> + case decodeExchangeAddress t of + Nothing -> Nothing + Just x -> Just $ Exchange x + Just t -> Just $ Transparent t + Just s -> Just $ Sapling s + Just u -> Just $ Unified u + +compareAddress :: ValidAddress -> UnifiedAddress -> Bool +compareAddress a u = + case a of + Unified i -> i == u + Sapling s -> s_rec u == Just (sa_receiver s) && ua_net u == net_type s + Transparent t -> t_rec u == Just (ta_receiver t) && ua_net u == ta_network t + Exchange x -> False