@@ -46,6 +46,7 @@ pub mod v1 {
46
46
} ,
47
47
} ;
48
48
pub const PYTHNET_ACCUMULATOR_UPDATE_MAGIC : & [ u8 ; 4 ] = b"PNAU" ;
49
+ pub const CURRENT_MINOR_VERSION : u8 = 0 ;
49
50
50
51
// Transfer Format.
51
52
// --------------------------------------------------------------------------------
@@ -79,7 +80,10 @@ pub mod v1 {
79
80
Error :: InvalidMagic
80
81
) ;
81
82
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
+ ) ;
83
87
Ok ( message)
84
88
}
85
89
}
@@ -385,4 +389,28 @@ mod tests {
385
389
// The deserialized value should be the same as the original.
386
390
assert_eq ! ( deserialized_update, empty_update) ;
387
391
}
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
+ }
388
416
}
0 commit comments