From 8a293f4e79cd1398c2cf22740be783bd77cf4713 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Thu, 14 Mar 2024 11:12:31 -0500 Subject: [PATCH] Enable for internal/external Orchard receivers --- librustzcash-wrapper/src/lib.rs | 6 +++++- src/C/Zcash.chs | 1 + src/ZcashHaskell/Orchard.hs | 9 +++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/librustzcash-wrapper/src/lib.rs b/librustzcash-wrapper/src/lib.rs index 1921f73..9d09942 100644 --- a/librustzcash-wrapper/src/lib.rs +++ b/librustzcash-wrapper/src/lib.rs @@ -702,13 +702,17 @@ pub extern "C" fn rust_wrapper_derive_orchard_receiver( spend_key: *const u8, spend_key_len: usize, add_id: u32, + scope: bool, out: *mut u8, out_len: &mut usize ){ let sk_in: Vec = marshall_from_haskell_var(spend_key, spend_key_len, RW); let sk = SpendingKey::from_bytes(sk_in[0..32].try_into().unwrap()).unwrap(); let fvk = FullViewingKey::from(&sk); - let o_rec = fvk.address_at(add_id, Scope::External); + let sc = if scope { + Scope::External + } else {Scope::Internal}; + let o_rec = fvk.address_at(add_id, sc); marshall_to_haskell_var(&o_rec.to_raw_address_bytes().to_vec(), out, out_len, RW); } diff --git a/src/C/Zcash.chs b/src/C/Zcash.chs index 94204db..0f93729 100644 --- a/src/C/Zcash.chs +++ b/src/C/Zcash.chs @@ -163,6 +163,7 @@ import ZcashHaskell.Types {# fun unsafe rust_wrapper_derive_orchard_receiver as rustWrapperGenOrchardReceiver { toBorshVar* `BS.ByteString'& , `Word32' + , `Bool' , getVarBuffer `Buffer (BS.ByteString)'& } -> `()' diff --git a/src/ZcashHaskell/Orchard.hs b/src/ZcashHaskell/Orchard.hs index 26c9fa1..5dd000f 100644 --- a/src/ZcashHaskell/Orchard.hs +++ b/src/ZcashHaskell/Orchard.hs @@ -46,20 +46,21 @@ genOrchardSpendingKey s coinType accountId = k = withPureBorshVarBuffer $ rustWrapperGenOrchardSpendKey - s + (getBytes s) (getValue coinType) (fromIntegral accountId) -- | Derives an Orchard receiver for the given spending key and index -genOrchardReceiver :: Int -> OrchardSpendingKey -> Maybe OrchardReceiver -genOrchardReceiver i osk = +genOrchardReceiver :: + Int -> Scope -> OrchardSpendingKey -> Maybe OrchardReceiver +genOrchardReceiver i scope osk = if BS.length k /= 43 then Nothing else Just k where k = withPureBorshVarBuffer $ - rustWrapperGenOrchardReceiver osk (fromIntegral i) + rustWrapperGenOrchardReceiver osk (fromIntegral i) (scope == External) -- | Checks if given bytestring is a valid encoded unified address isValidUnifiedAddress :: BS.ByteString -> Maybe UnifiedAddress