@@ -105,7 +105,7 @@ pub enum ShelleyAddressPaymentPart {
105105
106106impl Default for ShelleyAddressPaymentPart {
107107 fn default ( ) -> Self {
108- Self :: PaymentKeyHash ( KeyHash :: new ( [ 0u8 ; 28 ] ) )
108+ Self :: PaymentKeyHash ( [ 0u8 ; 28 ] . into ( ) )
109109 }
110110}
111111
@@ -211,19 +211,31 @@ impl ShelleyAddress {
211211
212212 let header = * header;
213213
214- let to_28_bytes = |slice : & [ u8 ] | -> Result < KeyHash > {
215- slice. try_into ( ) . map_err ( |_| anyhow ! ( "Invalid hash" ) )
216- } ;
217-
218214 let payment_part = match ( header >> 4 ) & 0x01 {
219- 0 => ShelleyAddressPaymentPart :: PaymentKeyHash ( to_28_bytes ( & data[ 1 ..29 ] ) ?) ,
220- 1 => ShelleyAddressPaymentPart :: ScriptHash ( to_28_bytes ( & data[ 1 ..29 ] ) ?) ,
215+ 0 => ShelleyAddressPaymentPart :: PaymentKeyHash (
216+ data[ 1 ..29 ]
217+ . try_into ( )
218+ . map_err ( |e| anyhow ! ( "Failed to parse payment key hash: {}" , e) ) ?,
219+ ) ,
220+ 1 => ShelleyAddressPaymentPart :: ScriptHash (
221+ data[ 1 ..29 ]
222+ . try_into ( )
223+ . map_err ( |e| anyhow ! ( "Failed to parse payment script hash: {}" , e) ) ?,
224+ ) ,
221225 _ => panic ! ( ) ,
222226 } ;
223227
224228 let delegation_part = match ( header >> 5 ) & 0x03 {
225- 0 => ShelleyAddressDelegationPart :: StakeKeyHash ( to_28_bytes ( & data[ 29 ..57 ] ) ?) ,
226- 1 => ShelleyAddressDelegationPart :: ScriptHash ( to_28_bytes ( & data[ 29 ..57 ] ) ?) ,
229+ 0 => ShelleyAddressDelegationPart :: StakeKeyHash (
230+ data[ 29 ..57 ]
231+ . try_into ( )
232+ . map_err ( |e| anyhow ! ( "Failed to parse stake key hash: {}" , e) ) ?,
233+ ) ,
234+ 1 => ShelleyAddressDelegationPart :: ScriptHash (
235+ data[ 29 ..57 ]
236+ . try_into ( )
237+ . map_err ( |e| anyhow ! ( "Failed to parse stake script hash: {}" , e) ) ?,
238+ ) ,
227239 2 => {
228240 let mut decoder = VarIntDecoder :: new ( & data[ 29 ..] ) ;
229241 let slot = decoder. read ( ) ?;
@@ -301,24 +313,24 @@ impl ShelleyAddress {
301313 ShelleyAddressDelegationPart :: None => {
302314 let header = build_header ( 3 ) ;
303315 data. push ( header) ;
304- data. extend ( payment_hash. as_ref ( ) ) ;
316+ data. extend_from_slice ( payment_hash. as_ref ( ) ) ;
305317 }
306318 ShelleyAddressDelegationPart :: StakeKeyHash ( hash) => {
307319 let header = build_header ( 0 ) ;
308320 data. push ( header) ;
309- data. extend ( payment_hash. as_ref ( ) ) ;
310- data. extend ( hash. as_ref ( ) ) ;
321+ data. extend_from_slice ( payment_hash. as_ref ( ) ) ;
322+ data. extend_from_slice ( hash. as_ref ( ) ) ;
311323 }
312324 ShelleyAddressDelegationPart :: ScriptHash ( hash) => {
313325 let header = build_header ( 1 ) ;
314326 data. push ( header) ;
315- data. extend ( payment_hash. as_ref ( ) ) ;
316- data. extend ( hash. as_ref ( ) ) ;
327+ data. extend_from_slice ( payment_hash. as_ref ( ) ) ;
328+ data. extend_from_slice ( hash. as_ref ( ) ) ;
317329 }
318330 ShelleyAddressDelegationPart :: Pointer ( pointer) => {
319331 let header = build_header ( 2 ) ;
320332 data. push ( header) ;
321- data. extend ( payment_hash. as_ref ( ) ) ;
333+ data. extend_from_slice ( payment_hash. as_ref ( ) ) ;
322334
323335 let mut encoder = VarIntEncoder :: new ( ) ;
324336 encoder. push ( pointer. slot ) ;
@@ -413,10 +425,12 @@ impl StakeAddress {
413425
414426 let credential = match ( header >> 4 ) & 0x0Fu8 {
415427 0b1110 => StakeCredential :: AddrKeyHash (
416- data[ 1 ..] . try_into ( ) . map_err ( |_ | anyhow ! ( "Invalid key hash size" ) ) ?,
428+ data[ 1 ..] . try_into ( ) . map_err ( |e | anyhow ! ( "Failed to parse key hash: {}" , e ) ) ?,
417429 ) ,
418430 0b1111 => StakeCredential :: ScriptHash (
419- data[ 1 ..] . try_into ( ) . map_err ( |_| anyhow ! ( "Invalid script hash size" ) ) ?,
431+ data[ 1 ..]
432+ . try_into ( )
433+ . map_err ( |e| anyhow ! ( "Failed to parse script hash: {}" , e) ) ?,
420434 ) ,
421435 _ => return Err ( anyhow ! ( "Unknown header {header} in stake address" ) ) ,
422436 } ;
@@ -437,9 +451,9 @@ impl StakeAddress {
437451 NetworkId :: Testnet => 0b0u8 ,
438452 } ;
439453
440- let ( stake_bits, stake_hash) : ( u8 , & Vec < u8 > ) = match & self . credential {
441- StakeCredential :: AddrKeyHash ( data) => ( 0b1110 , & data. to_vec ( ) ) ,
442- StakeCredential :: ScriptHash ( data) => ( 0b1111 , & data. to_vec ( ) ) ,
454+ let ( stake_bits, stake_hash) = match & self . credential {
455+ StakeCredential :: AddrKeyHash ( data) => ( 0b1110 , data. as_ref ( ) ) ,
456+ StakeCredential :: ScriptHash ( data) => ( 0b1111 , data. as_ref ( ) ) ,
443457 } ;
444458
445459 let mut data = vec ! [ network_bits | ( stake_bits << 4 ) ] ;
@@ -526,7 +540,7 @@ impl Default for StakeAddress {
526540 fn default ( ) -> Self {
527541 StakeAddress {
528542 network : NetworkId :: Mainnet ,
529- credential : StakeCredential :: AddrKeyHash ( KeyHash :: new ( [ 0u8 ; 28 ] ) ) ,
543+ credential : StakeCredential :: AddrKeyHash ( [ 0u8 ; 28 ] . into ( ) ) ,
530544 }
531545 }
532546}
0 commit comments