Skip to content

Commit 0ee999d

Browse files
committed
Add UncheckHrpstring::witness_version function
Add a function to the `UncheckedHrpstring` that attempts to treat the first byte of the data part as a witness version. Note, later calls to `data_part_ascii` will still include it.
1 parent b91207c commit 0ee999d

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/primitives/decode.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,39 @@ impl<'s> UncheckedHrpstring<'s> {
164164
#[inline]
165165
pub fn data_part_ascii(&self) -> &[u8] { self.data_part_ascii }
166166

167+
/// Returns the segwit witness version if there is one.
168+
///
169+
/// Attempts to convert the first character of the data part to a witness version. If this
170+
/// succeeds, and it is a valid version (0..16 inclusive) we return it, otherwise `None`.
171+
///
172+
/// This function makes no guarantees on the validity of the checksum.
173+
///
174+
/// # Examples
175+
///
176+
/// ```
177+
/// use bech32::{primitives::decode::UncheckedHrpstring, Fe32};
178+
///
179+
/// // Note the invalid checksum!
180+
/// let addr = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzffffff";
181+
///
182+
/// let unchecked = UncheckedHrpstring::new(&addr).unwrap();
183+
/// assert_eq!(unchecked.witness_version(), Some(Fe32::Q));
184+
/// ```
185+
#[inline]
186+
pub fn witness_version(&self) -> Option<Fe32> {
187+
let data_part = self.data_part_ascii();
188+
if data_part.is_empty() {
189+
return None;
190+
}
191+
192+
// unwrap ok because we know we gave valid bech32 characters.
193+
let witness_version = Fe32::from_char(data_part[0].into()).unwrap();
194+
if witness_version.to_u8() > 16 {
195+
return None;
196+
}
197+
Some(witness_version)
198+
}
199+
167200
/// Validates that data has a valid checksum for the `Ck` algorithm and returns a [`CheckedHrpstring`].
168201
#[inline]
169202
pub fn validate_and_remove_checksum<Ck: Checksum>(

0 commit comments

Comments
 (0)