diff --git a/librustzcash-wrapper/Cargo.toml b/librustzcash-wrapper/Cargo.toml index 5d1340c..55744d5 100644 --- a/librustzcash-wrapper/Cargo.toml +++ b/librustzcash-wrapper/Cargo.toml @@ -14,7 +14,7 @@ borsh = "0.10" bech32 = "0.9.1" orchard = "0.4.0" zcash_note_encryption = "0.3.0" -zcash_primitives = "0.12.0" +zcash_primitives = "0.11.0" zcash_client_backend = "0.9.0" [features] diff --git a/librustzcash-wrapper/src/lib.rs b/librustzcash-wrapper/src/lib.rs index 93a1245..12f68cc 100644 --- a/librustzcash-wrapper/src/lib.rs +++ b/librustzcash-wrapper/src/lib.rs @@ -16,7 +16,10 @@ use haskell_ffi::{ FromHaskell, HaskellSize, ToHaskell }; -use zcash_primitives::{sapling::keys::FullViewingKey as SaplingViewingKey, zip32::DiversifiableFullViewingKey}; +use zcash_primitives:: sapling::{ + keys::FullViewingKey as SaplingViewingKey, + PaymentAddress +}; use zcash_address::{ Network, @@ -195,7 +198,6 @@ pub extern "C" fn rust_wrapper_bech32decode( out_len: &mut usize ) { let input: String = marshall_from_haskell_var(input, input_len, RW); - let (hrp, bytes, variant) = bech32::decode(&input).unwrap(); let decodedBytes = bech32::decode(&input); match decodedBytes { Ok((hrp, bytes, variant)) => { @@ -227,6 +229,28 @@ pub extern "C" fn rust_wrapper_svk_decode( } } +#[no_mangle] +pub extern "C" fn rust_wrapper_svk_check_address( + key_input: *const u8, + key_input_len: usize, + address_input: *const u8, + address_input_len: usize + ) -> bool { + let key_input: Vec = marshall_from_haskell_var(key_input, key_input_len, RW); + let address_input: Vec = marshall_from_haskell_var(address_input, address_input_len, RW); + let svk = ExtendedFullViewingKey::read(&*key_input); + let sa = PaymentAddress::from_bytes(&to_array(address_input)).unwrap(); + match svk { + Ok(k) => { + let (div_index, def_address) = k.default_address(); + sa == def_address + } + Err(e) => { + false + } + } +} + #[no_mangle] pub extern "C" fn rust_wrapper_ufvk_decode( input: *const u8,