Skip to content

Commit

Permalink
pczt: Add Zip32Derivation::extract_account_index
Browse files Browse the repository at this point in the history
  • Loading branch information
str4d committed Dec 17, 2024
1 parent 762bc40 commit aa0891d
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ and this project adheres to Rust's notion of

## [Unreleased]

### Added
- `orchard::pczt::Zip32Derivation::extract_account_index`

### Changed
- Migrated to `nonempty 0.11`.

Expand Down
29 changes: 29 additions & 0 deletions src/pczt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,35 @@ pub struct Zip32Derivation {
derivation_path: Vec<ChildIndex>,
}

impl Zip32Derivation {
/// Extracts the ZIP 32 account index from this derivation path.
///
/// Returns `None` if the seed fingerprints don't match, or if this is a non-standard
/// derivation path.
pub fn extract_account_index(
&self,
seed_fp: &zip32::fingerprint::SeedFingerprint,
expected_coin_type: zip32::ChildIndex,
) -> Option<zip32::AccountId> {
if self.seed_fingerprint == seed_fp.to_bytes() {
match &self.derivation_path[..] {
[purpose, coin_type, account_index]
if purpose == &zip32::ChildIndex::hardened(32)
&& coin_type == &expected_coin_type =>
{
Some(
zip32::AccountId::try_from(account_index.index() - (1 << 31))
.expect("zip32::ChildIndex only supports hardened"),
)
}
_ => None,
}
} else {
None
}
}
}

#[cfg(test)]
mod tests {
use bridgetree::BridgeTree;
Expand Down

0 comments on commit aa0891d

Please sign in to comment.