@@ -31,6 +31,7 @@ use ergo_chain_types::ADDigest;
3131use ergo_chain_types:: Base16DecodedBytes ;
3232use ergo_chain_types:: Digest32 ;
3333use ergo_chain_types:: EcPoint ;
34+ use ergo_chain_types:: Header ;
3435use impl_trait_for_tuples:: impl_for_tuples;
3536use sigma_util:: AsVecI8 ;
3637use sigma_util:: AsVecU8 ;
@@ -83,6 +84,8 @@ pub enum Literal {
8384 GroupElement ( Arc < EcPoint > ) ,
8485 /// AVL tree
8586 AvlTree ( Box < AvlTreeData > ) ,
87+ /// Block Header type
88+ Header ( Box < Header > ) ,
8689 /// Ergo box
8790 CBox ( Ref < ' static , ErgoBox > ) ,
8891 /// Collection
@@ -165,6 +168,7 @@ impl core::fmt::Debug for Literal {
165168 Literal :: GroupElement ( v) => v. fmt ( f) ,
166169 Literal :: UnsignedBigInt ( v) => v. fmt ( f) ,
167170 Literal :: AvlTree ( v) => v. fmt ( f) ,
171+ Literal :: Header ( v) => v. fmt ( f) ,
168172 Literal :: CBox ( v) => v. fmt ( f) ,
169173 Literal :: String ( v) => v. fmt ( f) ,
170174 }
@@ -224,6 +228,7 @@ impl core::fmt::Display for Literal {
224228 Literal :: UnsignedBigInt ( v) => v. fmt ( f) ,
225229 Literal :: GroupElement ( v) => v. fmt ( f) ,
226230 Literal :: AvlTree ( v) => write ! ( f, "AvlTree({:?})" , v) ,
231+ Literal :: Header ( v) => write ! ( f, "Header({:?})" , v) ,
227232 Literal :: CBox ( v) => write ! ( f, "ErgoBox({:?})" , v) ,
228233 Literal :: String ( v) => write ! ( f, "String({v})" ) ,
229234 }
@@ -422,9 +427,9 @@ impl<'ctx> TryFrom<Value<'ctx>> for Constant {
422427 }
423428 }
424429 Value :: AvlTree ( a) => Ok ( Constant :: from ( * a) ) ,
430+ Value :: Header ( h) => Ok ( Constant :: from ( * h) ) ,
425431 Value :: String ( s) => Ok ( Constant :: from ( s) ) ,
426432 Value :: Context => Err ( "Cannot convert Value::Context into Constant" . into ( ) ) ,
427- Value :: Header ( _) => Err ( "Cannot convert Value::Header(_) into Constant" . into ( ) ) ,
428433 Value :: PreHeader ( _) => Err ( "Cannot convert Value::PreHeader(_) into Constant" . into ( ) ) ,
429434 Value :: Global => Err ( "Cannot convert Value::Global into Constant" . into ( ) ) ,
430435 Value :: Lambda ( _) => Err ( "Cannot convert Value::Lambda(_) into Constant" . into ( ) ) ,
@@ -643,6 +648,15 @@ impl From<AvlTreeData> for Constant {
643648 }
644649}
645650
651+ impl From < Header > for Constant {
652+ fn from ( h : Header ) -> Self {
653+ Constant {
654+ tpe : SType :: SHeader ,
655+ v : Literal :: Header ( h. into ( ) ) ,
656+ }
657+ }
658+ }
659+
646660impl From < AvlTreeFlags > for Constant {
647661 fn from ( a : AvlTreeFlags ) -> Self {
648662 Constant {
@@ -1209,6 +1223,8 @@ pub(crate) mod arbitrary {
12091223#[ cfg( feature = "arbitrary" ) ]
12101224#[ allow( clippy:: panic) ]
12111225mod tests {
1226+ use crate :: { ergo_tree:: ErgoTreeVersion , serialization:: roundtrip_new_feature} ;
1227+
12121228 use super :: * ;
12131229 use core:: fmt;
12141230 use proptest:: prelude:: * ;
@@ -1424,5 +1440,10 @@ mod tests {
14241440 test_constant_roundtrip( v) ;
14251441 }
14261442
1443+ #[ test]
1444+ fn header_ser_roundtrip( h in any:: <Header >( ) ) {
1445+ roundtrip_new_feature( & Constant :: from( h) , ErgoTreeVersion :: V3 ) ;
1446+ }
1447+
14271448 }
14281449}
0 commit comments