@@ -4165,6 +4165,58 @@ mod tests {
41654165 ) ;
41664166 }
41674167
4168+ #[ test]
4169+ fn respond_verify_foreign_tx__should_reject_request_with_erased_expected_payload_hash ( ) {
4170+ // Given
4171+ let mut rng = rand:: rngs:: StdRng :: from_seed ( [ 42u8 ; 32 ] ) ;
4172+ let ( context, mut contract, secret_key) =
4173+ basic_setup_with_protocol ( Protocol :: CaitSith , DomainPurpose :: ForeignTx , & mut rng) ;
4174+ register_supported_chains ( & mut contract, [ dtos:: ForeignChain :: Bitcoin ] ) ;
4175+ testing_env ! ( context. clone( ) ) ;
4176+ let SharedSecretKey :: Secp256k1 ( secret_key) = secret_key else {
4177+ unreachable ! ( ) ;
4178+ } ;
4179+ let request_args = VerifyForeignTransactionRequestArgs {
4180+ domain_id : DomainId :: default ( ) . 0 . into ( ) ,
4181+ payload_version : ForeignTxPayloadVersion :: V1 ,
4182+ expected_payload_hash : Some ( dtos:: Hash256 ( [ 1u8 ; 32 ] ) ) ,
4183+ request : dtos:: ForeignChainRpcRequest :: Bitcoin ( BitcoinRpcRequest {
4184+ tx_id : [ 7u8 ; 32 ] . into ( ) ,
4185+ confirmations : 2 . into ( ) ,
4186+ extractors : vec ! [ BitcoinExtractor :: BlockHash ] ,
4187+ } ) ,
4188+ } ;
4189+ let request = args_into_verify_foreign_tx_request ( request_args. clone ( ) ) ;
4190+ contract. verify_foreign_transaction ( request_args) ;
4191+ let payload = ForeignTxSignPayload :: V1 ( ForeignTxSignPayloadV1 {
4192+ request : request. request . clone ( ) ,
4193+ values : vec ! [ ExtractedValue :: BitcoinExtractedValue (
4194+ BitcoinExtractedValue :: BlockHash ( [ 42u8 ; 32 ] . into( ) ) ,
4195+ ) ] ,
4196+ } ) ;
4197+ let response = sign_foreign_tx_payload ( & secret_key, & payload) ;
4198+ with_active_participant_and_attested_context ( & contract) ;
4199+
4200+ // When
4201+ let tampered_request = VerifyForeignTransactionRequest {
4202+ expected_payload_hash : None ,
4203+ ..request. clone ( )
4204+ } ;
4205+ let result = contract. respond_verify_foreign_tx ( tampered_request, response) ;
4206+
4207+ // Then
4208+ assert_matches ! (
4209+ result. unwrap_err( ) ,
4210+ Error :: InvalidParameters ( InvalidParameters :: RequestNotFound )
4211+ ) ;
4212+ assert ! (
4213+ contract
4214+ . get_pending_verify_foreign_tx_request( & request)
4215+ . is_some( ) ,
4216+ "the pending request must remain unresolved" ,
4217+ ) ;
4218+ }
4219+
41684220 fn sign_foreign_tx_payload (
41694221 secret_key : & k256:: Scalar ,
41704222 payload : & ForeignTxSignPayload ,
0 commit comments