diff --git a/librustzcash/src/rustzcash.rs b/librustzcash/src/rustzcash.rs index 9df4437..e3a85e4 100644 --- a/librustzcash/src/rustzcash.rs +++ b/librustzcash/src/rustzcash.rs @@ -1215,14 +1215,7 @@ pub extern "system" fn librustzcash_zip32_xfvk_address( let addr_ret = unsafe { &mut *addr_ret }; j_ret.copy_from_slice(&(addr.0).0); - addr_ret - .get_mut(..11) - .unwrap() - .copy_from_slice(&addr.1.diversifier.0); - addr.1 - .pk_d - .write(addr_ret.get_mut(11..).unwrap()) - .expect("should be able to serialize a PaymentAddress"); + addr_ret.copy_from_slice(&addr.1.to_bytes()); true } diff --git a/zcash_client_backend/src/encoding.rs b/zcash_client_backend/src/encoding.rs index 9e9f2fc..4d87587 100644 --- a/zcash_client_backend/src/encoding.rs +++ b/zcash_client_backend/src/encoding.rs @@ -121,10 +121,7 @@ pub fn decode_extended_full_viewing_key( /// ); /// ``` pub fn encode_payment_address(hrp: &str, addr: &PaymentAddress) -> String { - bech32_encode(hrp, |w| { - w.write_all(&addr.diversifier.0)?; - addr.pk_d.write(w) - }) + bech32_encode(hrp, |w| w.write_all(&addr.to_bytes())) } /// Decodes a [`PaymentAddress`] from a Bech32-encoded string. diff --git a/zcash_primitives/src/primitives.rs b/zcash_primitives/src/primitives.rs index ac22f15..00ff2bf 100644 --- a/zcash_primitives/src/primitives.rs +++ b/zcash_primitives/src/primitives.rs @@ -155,6 +155,14 @@ impl PaymentAddress { }) } + /// Returns the byte encoding of this `PaymentAddress`. + pub fn to_bytes(&self) -> [u8; 43] { + let mut bytes = [0; 43]; + bytes[0..11].copy_from_slice(&self.diversifier.0); + self.pk_d.write(&mut bytes[11..]).unwrap(); + bytes + } + pub fn g_d(&self, params: &E::Params) -> Option> { self.diversifier.g_d(params) }