@@ -46,6 +46,7 @@ pub mod v1 {
4646 } ,
4747 } ;
4848 pub const PYTHNET_ACCUMULATOR_UPDATE_MAGIC : & [ u8 ; 4 ] = b"PNAU" ;
49+ pub const CURRENT_MINOR_VERSION : u8 = 0 ;
4950
5051 // Transfer Format.
5152 // --------------------------------------------------------------------------------
@@ -79,7 +80,10 @@ pub mod v1 {
7980 Error :: InvalidMagic
8081 ) ;
8182 require ! ( message. major_version == 1 , Error :: InvalidVersion ) ;
82- require ! ( message. minor_version == 0 , Error :: InvalidVersion ) ;
83+ require ! (
84+ message. minor_version >= CURRENT_MINOR_VERSION ,
85+ Error :: InvalidVersion
86+ ) ;
8387 Ok ( message)
8488 }
8589 }
@@ -385,4 +389,28 @@ mod tests {
385389 // The deserialized value should be the same as the original.
386390 assert_eq ! ( deserialized_update, empty_update) ;
387391 }
392+
393+ // Test if the AccumulatorUpdateData major and minor version increases work as expected
394+ #[ test]
395+ fn test_accumulator_forward_compatibility ( ) {
396+ use serde:: Serialize ;
397+ // Serialize an empty update into a buffer.
398+
399+ let empty_update = AccumulatorUpdateData :: new ( Proof :: WormholeMerkle {
400+ vaa : PrefixedVec :: from ( vec ! [ ] ) ,
401+ updates : vec ! [ ] ,
402+ } ) ;
403+ let mut buffer = Vec :: new ( ) ;
404+ let mut cursor = std:: io:: Cursor :: new ( & mut buffer) ;
405+ let mut serializer: Serializer < _ , byteorder:: LE > = Serializer :: new ( & mut cursor) ;
406+ empty_update. serialize ( & mut serializer) . unwrap ( ) ;
407+
408+ // Test if bumping minor version is still compatible
409+ buffer[ 5 ] = 0x03 ;
410+ AccumulatorUpdateData :: try_from_slice ( & buffer) . unwrap ( ) ;
411+
412+ // Test if bumping major version makes it incompatible
413+ buffer[ 4 ] = 0x03 ;
414+ AccumulatorUpdateData :: try_from_slice ( & buffer) . unwrap_err ( ) ;
415+ }
388416}
0 commit comments