Merge pull request #1226 from zcash/tex-addrs
zcash_address 0.3.2: ZIP 320 TEX address support
This commit is contained in:
commit
81303590ab
|
@ -2994,7 +2994,7 @@ checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_address"
|
name = "zcash_address"
|
||||||
version = "0.3.1"
|
version = "0.3.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"bech32",
|
"bech32",
|
||||||
|
@ -3234,7 +3234,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_protocol"
|
name = "zcash_protocol"
|
||||||
version = "0.0.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"document-features",
|
"document-features",
|
||||||
"incrementalmerkletree",
|
"incrementalmerkletree",
|
||||||
|
|
|
@ -33,7 +33,7 @@ zcash_address = { version = "0.3", path = "components/zcash_address" }
|
||||||
zcash_client_backend = { version = "0.11", path = "zcash_client_backend" }
|
zcash_client_backend = { version = "0.11", path = "zcash_client_backend" }
|
||||||
zcash_encoding = { version = "0.2", path = "components/zcash_encoding" }
|
zcash_encoding = { version = "0.2", path = "components/zcash_encoding" }
|
||||||
zcash_keys = { version = "0.1", path = "zcash_keys" }
|
zcash_keys = { version = "0.1", path = "zcash_keys" }
|
||||||
zcash_protocol = { version = "0.0", path = "components/zcash_protocol" }
|
zcash_protocol = { version = "0.1", path = "components/zcash_protocol" }
|
||||||
|
|
||||||
zcash_note_encryption = "0.4"
|
zcash_note_encryption = "0.4"
|
||||||
zcash_primitives = { version = "0.14", path = "zcash_primitives", default-features = false }
|
zcash_primitives = { version = "0.14", path = "zcash_primitives", default-features = false }
|
||||||
|
|
|
@ -7,6 +7,13 @@ and this library adheres to Rust's notion of
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.3.2] - 2024-03-06
|
||||||
|
### Added
|
||||||
|
- `zcash_address::convert`:
|
||||||
|
- `TryFromRawAddress::try_from_raw_tex`
|
||||||
|
- `TryFromAddress::try_from_tex`
|
||||||
|
- `ToAddress::from_tex`
|
||||||
|
|
||||||
## [0.3.1] - 2024-01-12
|
## [0.3.1] - 2024-01-12
|
||||||
### Fixed
|
### Fixed
|
||||||
- Stubs for `zcash_address::convert` traits that are created by `rust-analyzer`
|
- Stubs for `zcash_address::convert` traits that are created by `rust-analyzer`
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "zcash_address"
|
name = "zcash_address"
|
||||||
description = "Zcash address parsing and serialization"
|
description = "Zcash address parsing and serialization"
|
||||||
version = "0.3.1"
|
version = "0.3.2"
|
||||||
authors = [
|
authors = [
|
||||||
"Jack Grigg <jack@electriccoin.co>",
|
"Jack Grigg <jack@electriccoin.co>",
|
||||||
]
|
]
|
||||||
|
|
|
@ -137,6 +137,13 @@ pub trait TryFromRawAddress: Sized {
|
||||||
"transparent P2SH",
|
"transparent P2SH",
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_from_raw_tex(data: [u8; 20]) -> Result<Self, ConversionError<Self::Error>> {
|
||||||
|
let _ = data;
|
||||||
|
Err(ConversionError::Unsupported(UnsupportedAddress(
|
||||||
|
"transparent-source restricted P2PKH",
|
||||||
|
)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A helper trait for converting a [`ZcashAddress`] into another type.
|
/// A helper trait for converting a [`ZcashAddress`] into another type.
|
||||||
|
@ -225,6 +232,13 @@ pub trait TryFromAddress: Sized {
|
||||||
"transparent P2SH",
|
"transparent P2SH",
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_from_tex(net: Network, data: [u8; 20]) -> Result<Self, ConversionError<Self::Error>> {
|
||||||
|
let _ = (net, data);
|
||||||
|
Err(ConversionError::Unsupported(UnsupportedAddress(
|
||||||
|
"transparent-source restricted P2PKH",
|
||||||
|
)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: TryFromRawAddress> TryFromAddress for (Network, T) {
|
impl<T: TryFromRawAddress> TryFromAddress for (Network, T) {
|
||||||
|
@ -261,6 +275,10 @@ impl<T: TryFromRawAddress> TryFromAddress for (Network, T) {
|
||||||
) -> Result<Self, ConversionError<Self::Error>> {
|
) -> Result<Self, ConversionError<Self::Error>> {
|
||||||
T::try_from_raw_transparent_p2sh(data).map(|addr| (net, addr))
|
T::try_from_raw_transparent_p2sh(data).map(|addr| (net, addr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_from_tex(net: Network, data: [u8; 20]) -> Result<Self, ConversionError<Self::Error>> {
|
||||||
|
T::try_from_raw_tex(data).map(|addr| (net, addr))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A helper trait for converting another type into a [`ZcashAddress`].
|
/// A helper trait for converting another type into a [`ZcashAddress`].
|
||||||
|
@ -304,6 +322,8 @@ pub trait ToAddress: private::Sealed {
|
||||||
fn from_transparent_p2pkh(net: Network, data: [u8; 20]) -> Self;
|
fn from_transparent_p2pkh(net: Network, data: [u8; 20]) -> Self;
|
||||||
|
|
||||||
fn from_transparent_p2sh(net: Network, data: [u8; 20]) -> Self;
|
fn from_transparent_p2sh(net: Network, data: [u8; 20]) -> Self;
|
||||||
|
|
||||||
|
fn from_tex(net: Network, data: [u8; 20]) -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToAddress for ZcashAddress {
|
impl ToAddress for ZcashAddress {
|
||||||
|
@ -353,6 +373,13 @@ impl ToAddress for ZcashAddress {
|
||||||
kind: AddressKind::P2sh(data),
|
kind: AddressKind::P2sh(data),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn from_tex(net: Network, data: [u8; 20]) -> Self {
|
||||||
|
ZcashAddress {
|
||||||
|
net,
|
||||||
|
kind: AddressKind::Tex(data),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod private {
|
mod private {
|
||||||
|
|
|
@ -56,34 +56,56 @@ impl FromStr for ZcashAddress {
|
||||||
kind: AddressKind::Unified(data),
|
kind: AddressKind::Unified(data),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Err(unified::ParseError::NotUnified) => {
|
Err(unified::ParseError::NotUnified | unified::ParseError::UnknownPrefix(_)) => {
|
||||||
// allow decoding to fall through to Sapling/Transparent
|
// allow decoding to fall through to Sapling/TEX/Transparent
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
return Err(ParseError::from(e));
|
return Err(ParseError::from(e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try decoding as a Sapling address (Bech32)
|
// Try decoding as a Sapling or TEX address (Bech32/Bech32m)
|
||||||
if let Ok((hrp, data, Variant::Bech32)) = bech32::decode(s) {
|
if let Ok((hrp, data, variant)) = bech32::decode(s) {
|
||||||
// If we reached this point, the encoding is supposed to be valid Bech32.
|
// If we reached this point, the encoding is found to be valid Bech32 or Bech32m.
|
||||||
let data = Vec::<u8>::from_base32(&data).map_err(|_| ParseError::InvalidEncoding)?;
|
let data = Vec::<u8>::from_base32(&data).map_err(|_| ParseError::InvalidEncoding)?;
|
||||||
|
|
||||||
let net = match hrp.as_str() {
|
match variant {
|
||||||
mainnet::HRP_SAPLING_PAYMENT_ADDRESS => NetworkType::Main,
|
Variant::Bech32 => {
|
||||||
testnet::HRP_SAPLING_PAYMENT_ADDRESS => NetworkType::Test,
|
let net = match hrp.as_str() {
|
||||||
regtest::HRP_SAPLING_PAYMENT_ADDRESS => NetworkType::Regtest,
|
mainnet::HRP_SAPLING_PAYMENT_ADDRESS => NetworkType::Main,
|
||||||
// We will not define new Bech32 address encodings.
|
testnet::HRP_SAPLING_PAYMENT_ADDRESS => NetworkType::Test,
|
||||||
_ => {
|
regtest::HRP_SAPLING_PAYMENT_ADDRESS => NetworkType::Regtest,
|
||||||
return Err(ParseError::NotZcash);
|
// We will not define new Bech32 address encodings.
|
||||||
}
|
_ => {
|
||||||
};
|
return Err(ParseError::NotZcash);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return data[..]
|
return data[..]
|
||||||
.try_into()
|
.try_into()
|
||||||
.map(AddressKind::Sapling)
|
.map(AddressKind::Sapling)
|
||||||
.map_err(|_| ParseError::InvalidEncoding)
|
.map_err(|_| ParseError::InvalidEncoding)
|
||||||
.map(|kind| ZcashAddress { net, kind });
|
.map(|kind| ZcashAddress { net, kind });
|
||||||
|
}
|
||||||
|
Variant::Bech32m => {
|
||||||
|
// Try decoding as a TEX address (Bech32m)
|
||||||
|
let net = match hrp.as_str() {
|
||||||
|
mainnet::HRP_TEX_ADDRESS => NetworkType::Main,
|
||||||
|
testnet::HRP_TEX_ADDRESS => NetworkType::Test,
|
||||||
|
regtest::HRP_TEX_ADDRESS => NetworkType::Regtest,
|
||||||
|
// Not recognized as a Zcash address type
|
||||||
|
_ => {
|
||||||
|
return Err(ParseError::NotZcash);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return data[..]
|
||||||
|
.try_into()
|
||||||
|
.map(AddressKind::Tex)
|
||||||
|
.map_err(|_| ParseError::InvalidEncoding)
|
||||||
|
.map(|kind| ZcashAddress { net, kind });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The rest use Base58Check.
|
// The rest use Base58Check.
|
||||||
|
@ -122,8 +144,8 @@ impl FromStr for ZcashAddress {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_bech32(hrp: &str, data: &[u8]) -> String {
|
fn encode_bech32(hrp: &str, data: &[u8], variant: Variant) -> String {
|
||||||
bech32::encode(hrp, data.to_base32(), Variant::Bech32).expect("hrp is invalid")
|
bech32::encode(hrp, data.to_base32(), variant).expect("hrp is invalid")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_b58(prefix: [u8; 2], data: &[u8]) -> String {
|
fn encode_b58(prefix: [u8; 2], data: &[u8]) -> String {
|
||||||
|
@ -137,12 +159,17 @@ impl fmt::Display for ZcashAddress {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
let encoded = match &self.kind {
|
let encoded = match &self.kind {
|
||||||
AddressKind::Sprout(data) => encode_b58(self.net.b58_sprout_address_prefix(), data),
|
AddressKind::Sprout(data) => encode_b58(self.net.b58_sprout_address_prefix(), data),
|
||||||
AddressKind::Sapling(data) => {
|
AddressKind::Sapling(data) => encode_bech32(
|
||||||
encode_bech32(self.net.hrp_sapling_payment_address(), data)
|
self.net.hrp_sapling_payment_address(),
|
||||||
}
|
data,
|
||||||
|
Variant::Bech32,
|
||||||
|
),
|
||||||
AddressKind::Unified(addr) => addr.encode(&self.net),
|
AddressKind::Unified(addr) => addr.encode(&self.net),
|
||||||
AddressKind::P2pkh(data) => encode_b58(self.net.b58_pubkey_address_prefix(), data),
|
AddressKind::P2pkh(data) => encode_b58(self.net.b58_pubkey_address_prefix(), data),
|
||||||
AddressKind::P2sh(data) => encode_b58(self.net.b58_script_address_prefix(), data),
|
AddressKind::P2sh(data) => encode_b58(self.net.b58_script_address_prefix(), data),
|
||||||
|
AddressKind::Tex(data) => {
|
||||||
|
encode_bech32(self.net.hrp_tex_address(), data, Variant::Bech32m)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
write!(f, "{}", encoded)
|
write!(f, "{}", encoded)
|
||||||
}
|
}
|
||||||
|
@ -150,6 +177,8 @@ impl fmt::Display for ZcashAddress {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use assert_matches::assert_matches;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::{kind::unified, Network};
|
use crate::{kind::unified, Network};
|
||||||
|
|
||||||
|
@ -258,6 +287,74 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn tex() {
|
||||||
|
let p2pkh_str = "t1VmmGiyjVNeCjxDZzg7vZmd99WyzVby9yC";
|
||||||
|
let tex_str = "tex1s2rt77ggv6q989lr49rkgzmh5slsksa9khdgte";
|
||||||
|
|
||||||
|
// Transcode P2PKH to TEX
|
||||||
|
let p2pkh_zaddr: ZcashAddress = p2pkh_str.parse().unwrap();
|
||||||
|
assert_matches!(p2pkh_zaddr.net, Network::Main);
|
||||||
|
if let AddressKind::P2pkh(zaddr_data) = p2pkh_zaddr.kind {
|
||||||
|
let tex_zaddr = ZcashAddress {
|
||||||
|
net: p2pkh_zaddr.net,
|
||||||
|
kind: AddressKind::Tex(zaddr_data),
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(tex_zaddr.to_string(), tex_str);
|
||||||
|
} else {
|
||||||
|
panic!("Decoded address should have been a P2PKH address.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transcode TEX to P2PKH
|
||||||
|
let tex_zaddr: ZcashAddress = tex_str.parse().unwrap();
|
||||||
|
assert_matches!(tex_zaddr.net, Network::Main);
|
||||||
|
if let AddressKind::Tex(zaddr_data) = tex_zaddr.kind {
|
||||||
|
let p2pkh_zaddr = ZcashAddress {
|
||||||
|
net: tex_zaddr.net,
|
||||||
|
kind: AddressKind::P2pkh(zaddr_data),
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(p2pkh_zaddr.to_string(), p2pkh_str);
|
||||||
|
} else {
|
||||||
|
panic!("Decoded address should have been a TEX address.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn tex_testnet() {
|
||||||
|
let p2pkh_str = "tm9ofD7kHR7AF8MsJomEzLqGcrLCBkD9gDj";
|
||||||
|
let tex_str = "textest1qyqszqgpqyqszqgpqyqszqgpqyqszqgpfcjgfy";
|
||||||
|
|
||||||
|
// Transcode P2PKH to TEX
|
||||||
|
let p2pkh_zaddr: ZcashAddress = p2pkh_str.parse().unwrap();
|
||||||
|
assert_matches!(p2pkh_zaddr.net, Network::Test);
|
||||||
|
if let AddressKind::P2pkh(zaddr_data) = p2pkh_zaddr.kind {
|
||||||
|
let tex_zaddr = ZcashAddress {
|
||||||
|
net: p2pkh_zaddr.net,
|
||||||
|
kind: AddressKind::Tex(zaddr_data),
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(tex_zaddr.to_string(), tex_str);
|
||||||
|
} else {
|
||||||
|
panic!("Decoded address should have been a P2PKH address.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transcode TEX to P2PKH
|
||||||
|
let tex_zaddr: ZcashAddress = tex_str.parse().unwrap();
|
||||||
|
assert_matches!(tex_zaddr.net, Network::Test);
|
||||||
|
if let AddressKind::Tex(zaddr_data) = tex_zaddr.kind {
|
||||||
|
let p2pkh_zaddr = ZcashAddress {
|
||||||
|
net: tex_zaddr.net,
|
||||||
|
kind: AddressKind::P2pkh(zaddr_data),
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(p2pkh_zaddr.to_string(), p2pkh_str);
|
||||||
|
} else {
|
||||||
|
panic!("Decoded address should have been a TEX address.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn whitespace() {
|
fn whitespace() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
|
@ -158,6 +158,7 @@ enum AddressKind {
|
||||||
Unified(unified::Address),
|
Unified(unified::Address),
|
||||||
P2pkh([u8; 20]),
|
P2pkh([u8; 20]),
|
||||||
P2sh([u8; 20]),
|
P2sh([u8; 20]),
|
||||||
|
Tex([u8; 20]),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ZcashAddress {
|
impl ZcashAddress {
|
||||||
|
@ -222,6 +223,7 @@ impl ZcashAddress {
|
||||||
AddressKind::Unified(data) => T::try_from_unified(self.net, data),
|
AddressKind::Unified(data) => T::try_from_unified(self.net, data),
|
||||||
AddressKind::P2pkh(data) => T::try_from_transparent_p2pkh(self.net, data),
|
AddressKind::P2pkh(data) => T::try_from_transparent_p2pkh(self.net, data),
|
||||||
AddressKind::P2sh(data) => T::try_from_transparent_p2sh(self.net, data),
|
AddressKind::P2sh(data) => T::try_from_transparent_p2sh(self.net, data),
|
||||||
|
AddressKind::Tex(data) => T::try_from_tex(self.net, data),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,6 +259,7 @@ impl ZcashAddress {
|
||||||
T::try_from_raw_transparent_p2pkh(data)
|
T::try_from_raw_transparent_p2pkh(data)
|
||||||
}
|
}
|
||||||
AddressKind::P2sh(data) if regtest_exception => T::try_from_raw_transparent_p2sh(data),
|
AddressKind::P2sh(data) if regtest_exception => T::try_from_raw_transparent_p2sh(data),
|
||||||
|
AddressKind::Tex(data) if network_matches => T::try_from_raw_tex(data),
|
||||||
_ => Err(ConversionError::IncorrectNetwork {
|
_ => Err(ConversionError::IncorrectNetwork {
|
||||||
expected: net,
|
expected: net,
|
||||||
actual: self.net,
|
actual: self.net,
|
||||||
|
|
|
@ -6,6 +6,8 @@ and this library adheres to Rust's notion of
|
||||||
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.1.0] - 2024-03-06
|
||||||
The entries below are relative to the `zcash_primitives` crate as of the tag
|
The entries below are relative to the `zcash_primitives` crate as of the tag
|
||||||
`zcash_primitives-0.14.0`.
|
`zcash_primitives-0.14.0`.
|
||||||
|
|
||||||
|
@ -17,8 +19,9 @@ The entries below are relative to the `zcash_primitives` crate as of the tag
|
||||||
- `zcash_protocol::value` replaces `zcash_primitives::transaction::components::amount`
|
- `zcash_protocol::value` replaces `zcash_primitives::transaction::components::amount`
|
||||||
- `zcash_protocol::consensus`:
|
- `zcash_protocol::consensus`:
|
||||||
- `NetworkConstants` has been extracted from the `Parameters` trait. Relative to the
|
- `NetworkConstants` has been extracted from the `Parameters` trait. Relative to the
|
||||||
state prior to the extraction, the bech32 prefixes now return `&'static str` instead
|
state prior to the extraction:
|
||||||
of `&str`.
|
- The Bech32 prefixes now return `&'static str` instead of `&str`.
|
||||||
|
- Added `NetworkConstants::hrp_tex_address`.
|
||||||
- `NetworkType`
|
- `NetworkType`
|
||||||
- `Parameters::b58_sprout_address_prefix`
|
- `Parameters::b58_sprout_address_prefix`
|
||||||
- `zcash_protocol::consensus`:
|
- `zcash_protocol::consensus`:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "zcash_protocol"
|
name = "zcash_protocol"
|
||||||
description = "Zcash protocol network constants and value types."
|
description = "Zcash protocol network constants and value types."
|
||||||
version = "0.0.0"
|
version = "0.1.0"
|
||||||
authors = [
|
authors = [
|
||||||
"Jack Grigg <jack@electriccoin.co>",
|
"Jack Grigg <jack@electriccoin.co>",
|
||||||
"Kris Nuttycombe <kris@nutty.land>",
|
"Kris Nuttycombe <kris@nutty.land>",
|
||||||
|
|
|
@ -190,6 +190,14 @@ pub trait NetworkConstants: Clone {
|
||||||
///
|
///
|
||||||
/// [`TransparentAddress::Script`]: zcash_primitives::legacy::TransparentAddress::Script
|
/// [`TransparentAddress::Script`]: zcash_primitives::legacy::TransparentAddress::Script
|
||||||
fn b58_script_address_prefix(&self) -> [u8; 2];
|
fn b58_script_address_prefix(&self) -> [u8; 2];
|
||||||
|
|
||||||
|
/// Returns the Bech32-encoded human-readable prefix for TEX addresses, for the
|
||||||
|
/// network to which this `NetworkConstants` value applies.
|
||||||
|
///
|
||||||
|
/// Defined in [ZIP 320].
|
||||||
|
///
|
||||||
|
/// [ZIP 320]: https://zips.z.cash/zip-0320
|
||||||
|
fn hrp_tex_address(&self) -> &'static str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The enumeration of known Zcash network types.
|
/// The enumeration of known Zcash network types.
|
||||||
|
@ -264,6 +272,14 @@ impl NetworkConstants for NetworkType {
|
||||||
NetworkType::Regtest => regtest::B58_SCRIPT_ADDRESS_PREFIX,
|
NetworkType::Regtest => regtest::B58_SCRIPT_ADDRESS_PREFIX,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn hrp_tex_address(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
NetworkType::Main => mainnet::HRP_TEX_ADDRESS,
|
||||||
|
NetworkType::Test => testnet::HRP_TEX_ADDRESS,
|
||||||
|
NetworkType::Regtest => regtest::HRP_TEX_ADDRESS,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Zcash consensus parameters.
|
/// Zcash consensus parameters.
|
||||||
|
@ -310,6 +326,10 @@ impl<P: Parameters> NetworkConstants for P {
|
||||||
fn b58_script_address_prefix(&self) -> [u8; 2] {
|
fn b58_script_address_prefix(&self) -> [u8; 2] {
|
||||||
self.network_type().b58_script_address_prefix()
|
self.network_type().b58_script_address_prefix()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn hrp_tex_address(&self) -> &'static str {
|
||||||
|
self.network_type().hrp_tex_address()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Marker struct for the production network.
|
/// Marker struct for the production network.
|
||||||
|
|
|
@ -45,3 +45,8 @@ pub const B58_PUBKEY_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xb8];
|
||||||
///
|
///
|
||||||
/// [`ScriptHash`]: https://docs.rs/zcash_primitives/latest/zcash_primitives/legacy/enum.TransparentAddress.html
|
/// [`ScriptHash`]: https://docs.rs/zcash_primitives/latest/zcash_primitives/legacy/enum.TransparentAddress.html
|
||||||
pub const B58_SCRIPT_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xbd];
|
pub const B58_SCRIPT_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xbd];
|
||||||
|
|
||||||
|
/// The HRP for a Bech32m-encoded mainnet [ZIP 320] TEX address.
|
||||||
|
///
|
||||||
|
/// [ZIP 320]: https://zips.z.cash/zip-0320
|
||||||
|
pub const HRP_TEX_ADDRESS: &str = "tex";
|
||||||
|
|
|
@ -52,3 +52,8 @@ pub const B58_PUBKEY_ADDRESS_PREFIX: [u8; 2] = [0x1d, 0x25];
|
||||||
///
|
///
|
||||||
/// [`ScriptHash`]: https://docs.rs/zcash_primitives/latest/zcash_primitives/legacy/enum.TransparentAddress.html
|
/// [`ScriptHash`]: https://docs.rs/zcash_primitives/latest/zcash_primitives/legacy/enum.TransparentAddress.html
|
||||||
pub const B58_SCRIPT_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xba];
|
pub const B58_SCRIPT_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xba];
|
||||||
|
|
||||||
|
/// The HRP for a Bech32m-encoded regtest [ZIP 320] TEX address.
|
||||||
|
///
|
||||||
|
/// [ZIP 320]: https://zips.z.cash/zip-0320
|
||||||
|
pub const HRP_TEX_ADDRESS: &str = "texregtest";
|
||||||
|
|
|
@ -45,3 +45,8 @@ pub const B58_PUBKEY_ADDRESS_PREFIX: [u8; 2] = [0x1d, 0x25];
|
||||||
///
|
///
|
||||||
/// [`ScriptHash`]: https://docs.rs/zcash_primitives/latest/zcash_primitives/legacy/enum.TransparentAddress.html
|
/// [`ScriptHash`]: https://docs.rs/zcash_primitives/latest/zcash_primitives/legacy/enum.TransparentAddress.html
|
||||||
pub const B58_SCRIPT_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xba];
|
pub const B58_SCRIPT_ADDRESS_PREFIX: [u8; 2] = [0x1c, 0xba];
|
||||||
|
|
||||||
|
/// The HRP for a Bech32m-encoded testnet [ZIP 320] TEX address.
|
||||||
|
///
|
||||||
|
/// [ZIP 320]: https://zips.z.cash/zip-0320
|
||||||
|
pub const HRP_TEX_ADDRESS: &str = "textest";
|
||||||
|
|
Loading…
Reference in New Issue