Skip to content

Commit d79984d

Browse files
committed
Add segwiw version field element consts
Add two field element consts for segwit version 0 an version 1. This makes reading the code much easier since one does not have to remember p ad q.
1 parent 6c1379b commit d79984d

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed

src/primitives/decode.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
//! ```
3636
//! use bech32::{Bech32, Bech32m, Fe32, Hrp};
3737
//! use bech32::primitives::decode::{CheckedHrpstring, SegwitHrpstring, UncheckedHrpstring};
38+
//! use bech32::segwit::VERSION_1;
3839
//!
3940
//! // An arbitrary HRP and a string of valid bech32 characters.
4041
//! let s = "abcd143hj65vxw49rts6kcw35u6r6tgzguyr03vvveeewjqpn05efzq444444";
@@ -66,7 +67,7 @@
6667
//! let segwit = SegwitHrpstring::new(address).expect("valid segwit address");
6768
//! let _encoded_data = segwit.byte_iter();
6869
//! assert_eq!(segwit.hrp(), Hrp::parse("bc").unwrap());
69-
//! assert_eq!(segwit.witness_version(), Fe32::P);
70+
//! assert_eq!(segwit.witness_version(), VERSION_1);
7071
//! ```
7172
//!
7273
//! [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
@@ -78,7 +79,7 @@ use crate::primitives::checksum::{self, Checksum};
7879
use crate::primitives::gf32::Fe32;
7980
use crate::primitives::hrp::{self, Hrp};
8081
use crate::primitives::iter::{Fe32IterExt, FesToBytes};
81-
use crate::primitives::segwit::{self, WitnessLengthError};
82+
use crate::primitives::segwit::{self, WitnessLengthError, VERSION_0};
8283
use crate::{write_err, Bech32, Bech32m};
8384

8485
/// Separator between the hrp and payload (as defined by BIP-173).
@@ -363,7 +364,7 @@ impl<'s> SegwitHrpstring<'s> {
363364
}
364365

365366
let checked: CheckedHrpstring<'s> = match witness_version {
366-
Fe32::Q => unchecked.validate_and_remove_checksum::<Bech32>()?,
367+
VERSION_0 => unchecked.validate_and_remove_checksum::<Bech32>()?,
367368
_ => unchecked.validate_and_remove_checksum::<Bech32m>()?,
368369
};
369370

src/primitives/segwit.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ use core::fmt;
99

1010
use crate::primitives::gf32::Fe32;
1111

12+
/// The field element representing segwit version 0.
13+
pub const VERSION_0: Fe32 = Fe32::Q;
14+
/// The field element representing segwit version 1 (taproot).
15+
pub const VERSION_1: Fe32 = Fe32::P;
16+
1217
/// Returns true if given field element represents a valid segwit version.
1318
pub fn is_valid_witness_version(witness_version: Fe32) -> bool {
1419
validate_witness_version(witness_version).is_ok()
@@ -41,7 +46,7 @@ pub fn validate_witness_program_length(
4146
if length > 40 {
4247
return Err(TooLong);
4348
}
44-
if version == Fe32::Q && length != 20 && length != 32 {
49+
if version == VERSION_0 && length != 20 && length != 32 {
4550
return Err(InvalidSegwitV0);
4651
}
4752
Ok(())

src/segwit.rs

+11-12
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
//! let _ = segwit::encode_v0(&hrp::TB, &witness_prog);
2828
//!
2929
//! // If you have the witness version already you can use:
30-
//! # let witness_version = Fe32::Q;
30+
//! # let witness_version = segwit::VERSION_0;
3131
//! let _ = segwit::encode(&hrp::BC, witness_version, &witness_prog);
3232
//!
3333
//! // Decode a Bitcoin bech32 segwit address.
@@ -50,9 +50,8 @@ use crate::primitives::decode::{SegwitHrpstring, SegwitHrpstringError};
5050
use crate::primitives::gf32::Fe32;
5151
use crate::primitives::hrp::Hrp;
5252
use crate::primitives::iter::{ByteIterExt, Fe32IterExt};
53-
#[cfg(feature = "alloc")]
54-
use crate::primitives::segwit;
55-
use crate::primitives::segwit::{InvalidWitnessVersionError, WitnessLengthError};
53+
use crate::primitives::segwit::{self, InvalidWitnessVersionError, WitnessLengthError};
54+
pub use crate::primitives::segwit::{VERSION_0, VERSION_1};
5655
use crate::primitives::{Bech32, Bech32m};
5756
use crate::write_err;
5857

@@ -102,13 +101,13 @@ pub fn encode(
102101
/// Encodes a segwit version 0 address.
103102
#[cfg(feature = "alloc")]
104103
pub fn encode_v0(hrp: &Hrp, witness_program: &[u8]) -> Result<String, EncodeError> {
105-
encode(hrp, Fe32::Q, witness_program)
104+
encode(hrp, segwit::VERSION_0, witness_program)
106105
}
107106

108107
/// Encodes a segwit version 1 address.
109108
#[cfg(feature = "alloc")]
110109
pub fn encode_v1(hrp: &Hrp, witness_program: &[u8]) -> Result<String, EncodeError> {
111-
encode(hrp, Fe32::P, witness_program)
110+
encode(hrp, segwit::VERSION_1, witness_program)
112111
}
113112

114113
/// Encodes a segwit address to a writer ([`fmt::Write`]) using lowercase characters.
@@ -123,8 +122,8 @@ pub fn encode_to_fmt_unchecked<W: fmt::Write>(
123122
) -> fmt::Result {
124123
let iter = witness_program.iter().copied().bytes_to_fes();
125124
match witness_version {
126-
Fe32::Q => {
127-
for c in iter.with_checksum::<Bech32>(hrp).with_witness_version(Fe32::Q).chars() {
125+
VERSION_0 => {
126+
for c in iter.with_checksum::<Bech32>(hrp).with_witness_version(VERSION_0).chars() {
128127
fmt.write_char(c)?;
129128
}
130129
}
@@ -151,8 +150,8 @@ pub fn encode_to_fmt_unchecked_uppercase<W: fmt::Write>(
151150
) -> fmt::Result {
152151
let iter = witness_program.iter().copied().bytes_to_fes();
153152
match witness_version {
154-
Fe32::Q => {
155-
for c in iter.with_checksum::<Bech32>(hrp).with_witness_version(Fe32::Q).chars() {
153+
VERSION_0 => {
154+
for c in iter.with_checksum::<Bech32>(hrp).with_witness_version(VERSION_0).chars() {
156155
fmt.write_char(c.to_ascii_uppercase())?;
157156
}
158157
}
@@ -247,7 +246,7 @@ mod tests {
247246
fn encode_to_fmt_lowercase() {
248247
let program = witness_program();
249248
let mut address = String::new();
250-
encode_to_fmt_unchecked(&mut address, &hrp::BC, Fe32::Q, &program)
249+
encode_to_fmt_unchecked(&mut address, &hrp::BC, VERSION_0, &program)
251250
.expect("failed to encode address to QR code");
252251

253252
let want = "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4";
@@ -258,7 +257,7 @@ mod tests {
258257
fn encode_to_fmt_uppercase() {
259258
let program = witness_program();
260259
let mut address = String::new();
261-
encode_to_fmt_unchecked_uppercase(&mut address, &hrp::BC, Fe32::Q, &program)
260+
encode_to_fmt_unchecked_uppercase(&mut address, &hrp::BC, VERSION_0, &program)
262261
.expect("failed to encode address to QR code");
263262

264263
let want = "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4";

0 commit comments

Comments
 (0)