Implement address comparison and validation #87
1 changed files with 30 additions and 0 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue