From 323402eb54996756c61b5cc1c5805ddaadc79e75 Mon Sep 17 00:00:00 2001 From: Santiago Carmuega Date: Thu, 24 Nov 2022 18:13:32 +0100 Subject: [PATCH] feat(addresses): Add helper for shelley into stake address (#208) --- pallas-addresses/src/lib.rs | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/pallas-addresses/src/lib.rs b/pallas-addresses/src/lib.rs index 215a3a5..cb78d6f 100644 --- a/pallas-addresses/src/lib.rs +++ b/pallas-addresses/src/lib.rs @@ -242,6 +242,14 @@ impl StakePayload { pub fn is_script(&self) -> bool { matches!(self, StakePayload::Script(_)) } + + /// Get a reference to the inner hash of this address part + pub fn as_hash(&self) -> &Hash<28> { + match self { + StakePayload::Stake(x) => x, + StakePayload::Script(x) => x, + } + } } /// The network tag of an address @@ -494,6 +502,20 @@ impl ShelleyAddress { } } +impl TryFrom for StakeAddress { + type Error = Error; + + fn try_from(value: ShelleyAddress) -> Result { + let payload = match value.delegation() { + ShelleyDelegationPart::Key(h) => StakePayload::Stake(*h), + ShelleyDelegationPart::Script(h) => StakePayload::Script(*h), + _ => return Err(Error::InvalidForContent), + }; + + Ok(StakeAddress(value.network(), payload)) + } +} + impl AsRef<[u8]> for StakePayload { fn as_ref(&self) -> &[u8] { match self { @@ -860,4 +882,21 @@ mod tests { let addr = Address::from_hex("40C19D7D05E90EEB6394B53313FE79D47077DE33068C6B813BBE5C9D5681FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F81FFFFFFFFFFFFFFFF7F81FFFFFFFFFFFFFFFF7F"); assert!(matches!(addr, Ok(Address::Shelley(_)))); } + + #[test] + fn test_shelley_into_stake() { + let addr = Address::from_bech32("addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x").unwrap(); + + match addr { + Address::Shelley(shelley_addr) => { + let stake_addr: StakeAddress = shelley_addr.clone().try_into().unwrap(); + assert_eq!(stake_addr.network(), shelley_addr.network()); + + let stake_hash = stake_addr.payload().as_hash(); + let shelley_hash = shelley_addr.delegation().as_hash().unwrap(); + assert_eq!(stake_hash, shelley_hash); + } + _ => panic!(), + } + } }