@@ -971,6 +971,44 @@ fn test_receive_message_fails_with_nonce_already_used() {
971971 client. receive_message ( & caller, & fixture. message , & fixture. attestation ) ;
972972}
973973
974+ #[ test]
975+ fn test_nonce_expiry_allows_message_replay ( ) {
976+ let ctx = setup_contract ( ) ;
977+ let client = ctx. client ( ) ;
978+ let caller = Address :: generate ( & ctx. env ) ;
979+
980+ let _mock_handler_address = ctx. env . register ( MockMessageHandler , ( ) ) ;
981+ let fixture = fixture_valid_message ( & ctx. env ) ;
982+
983+ mock_receive_message_auth (
984+ & ctx. env ,
985+ & ctx. contract_id ,
986+ & caller,
987+ fixture. message . clone ( ) ,
988+ fixture. attestation . clone ( ) ,
989+ ) ;
990+ client. receive_message ( & caller, & fixture. message , & fixture. attestation ) ;
991+
992+ let nonce = MessageV2 :: get_nonce ( & fixture. message ) . unwrap ( ) ;
993+ assert ! ( client. is_nonce_used( & nonce) ) ;
994+
995+ let nonce_key = storage:: MessageTransmitterStorageKey :: UsedNonce ( nonce. clone ( ) ) ;
996+ ctx. env . as_contract ( & ctx. contract_id , || {
997+ ctx. env . storage ( ) . persistent ( ) . remove ( & nonce_key) ;
998+ } ) ;
999+
1000+ assert ! ( !client. is_nonce_used( & nonce) ) ;
1001+
1002+ mock_receive_message_auth (
1003+ & ctx. env ,
1004+ & ctx. contract_id ,
1005+ & caller,
1006+ fixture. message . clone ( ) ,
1007+ fixture. attestation . clone ( ) ,
1008+ ) ;
1009+ client. receive_message ( & caller, & fixture. message , & fixture. attestation ) ;
1010+ }
1011+
9741012// =============================================================
9751013// Attestable Tests
9761014// =============================================================
0 commit comments