Skip to content

Commit 63e84dd

Browse files
committed
tests: Add test to ensure contract rejects request with erased expected payload hash
1 parent 7af44d7 commit 63e84dd

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

crates/contract/src/lib.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)