From 3822e9f2ff966f9c271e9b5a316ec016168fd172 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Tue, 5 Mar 2024 15:09:35 -0600 Subject: [PATCH] Add tests for Orchard spending key --- librustzcash-wrapper/src/lib.rs | 2 +- src/ZcashHaskell/Orchard.hs | 14 +++++++++++--- test/Spec.hs | 7 +++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/librustzcash-wrapper/src/lib.rs b/librustzcash-wrapper/src/lib.rs index ed160e6..3b7297a 100644 --- a/librustzcash-wrapper/src/lib.rs +++ b/librustzcash-wrapper/src/lib.rs @@ -625,7 +625,7 @@ pub extern "C" fn rust_wrapper_derive_orchard_spending_key( let sk = SpendingKey::from_zip32_seed(&s, coin_type, zip32::AccountId::try_from(acc_id).unwrap()); match sk { Ok(key) => { - marshall_to_haskell_var(&key.to_bytes(), out, out_len, RW); + marshall_to_haskell_var(&key.to_bytes().to_vec(), out, out_len, RW); }, Err(_e) => { marshall_to_haskell_var(&vec![0], out, out_len, RW); diff --git a/src/ZcashHaskell/Orchard.hs b/src/ZcashHaskell/Orchard.hs index ffe5248..9d33959 100644 --- a/src/ZcashHaskell/Orchard.hs +++ b/src/ZcashHaskell/Orchard.hs @@ -34,10 +34,18 @@ import ZcashHaskell.Types import ZcashHaskell.Utils (encodeBech32m, f4Jumble) -- | Derives an Orchard spending key for the given seed and account ID -genOrchardSpendingKey :: Seed -> CoinType -> AccountId -> BS.ByteString +genOrchardSpendingKey :: Seed -> CoinType -> AccountId -> Maybe BS.ByteString genOrchardSpendingKey s coinType accountId = - withPureBorshVarBuffer $ - rustWrapperGenOrchardSpendKey s (getValue coinType) (fromIntegral accountId) + if BS.length k /= 32 + then Nothing + else Just k + where + k = + withPureBorshVarBuffer $ + rustWrapperGenOrchardSpendKey + s + (getValue coinType) + (fromIntegral accountId) -- | Checks if given bytestring is a valid encoded unified address isValidUnifiedAddress :: BS.ByteString -> Maybe UnifiedAddress diff --git a/test/Spec.hs b/test/Spec.hs index 08e08e4..c06a689 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -19,6 +19,7 @@ {-# LANGUAGE OverloadedStrings #-} import C.Zcash (rustWrapperUADecode) +import Control.Monad.IO.Class (liftIO) import Data.Aeson import Data.Bool (Bool(True)) import qualified Data.ByteString as BS @@ -45,6 +46,7 @@ import ZcashHaskell.Sapling import ZcashHaskell.Transparent (encodeTransparent) import ZcashHaskell.Types ( BlockResponse(..) + , CoinType(..) , DecodedNote(..) , OrchardAction(..) , RawData(..) @@ -453,6 +455,11 @@ main = do p <- generateWalletSeedPhrase let s = getWalletSeed p maybe 0 BS.length s `shouldBe` 64 + it "Generate Orchard spending key" $ do + p <- generateWalletSeedPhrase + let s = getWalletSeed p + genOrchardSpendingKey (fromMaybe "" s) MainNetCoin 1 `shouldNotBe` + Nothing describe "Address tests" $ do it "Encode transparent" $ do let ua =