diff --git a/zcash_client_backend/src/encoding.rs b/zcash_client_backend/src/encoding.rs index 6a6de8d..edca745 100644 --- a/zcash_client_backend/src/encoding.rs +++ b/zcash_client_backend/src/encoding.rs @@ -9,9 +9,10 @@ use bech32::{self, Error, FromBase32, ToBase32}; use pairing::bls12_381::Bls12; use std::io::{self, Write}; use zcash_primitives::{ - primitives::{PaymentAddress}, + primitives::PaymentAddress, zip32::{ExtendedFullViewingKey, ExtendedSpendingKey}, JUBJUB, + legacy::TransparentAddress, }; fn bech32_encode(hrp: &str, write: F) -> String @@ -176,6 +177,63 @@ pub fn decode_payment_address(hrp: &str, s: &str) -> Result Result, bs58::decode::Error> { + let decoded = bs58::decode(s).with_check(None).into_vec()?; + if &decoded[..pubkey_version.len()] == pubkey_version { + if decoded.len() == pubkey_version.len() + 20 { + let mut data = [0; 20]; + data.copy_from_slice(&decoded[pubkey_version.len()..]); + Ok(Some(TransparentAddress::PublicKey(data))) + } else { + Ok(None) + } + } else if &decoded[..script_version.len()] == script_version { + if decoded.len() == script_version.len() + 20 { + let mut data = [0; 20]; + data.copy_from_slice(&decoded[script_version.len()..]); + Ok(Some(TransparentAddress::Script(data))) + } else { + Ok(None) + } + } else { + Ok(None) + } +} + #[cfg(test)] mod tests { use pairing::bls12_381::Bls12; diff --git a/zcash_client_backend/src/proto/mod.rs b/zcash_client_backend/src/proto/mod.rs index 167cfbe..0872fbb 100644 --- a/zcash_client_backend/src/proto/mod.rs +++ b/zcash_client_backend/src/proto/mod.rs @@ -1,6 +1,6 @@ //! Generated code for handling light client protobuf structs. -use ff::{PrimeField}; +use ff::PrimeField; use pairing::bls12_381::{Bls12, Fr, FrRepr}; use zcash_primitives::{ block::{BlockHash, BlockHeader},