diff --git a/tests/contract_test.rs b/tests/contract_test.rs index 988ecf0..9f8a432 100644 --- a/tests/contract_test.rs +++ b/tests/contract_test.rs @@ -966,6 +966,7 @@ fn mark_processing_on_non_pending_tx_panics() { &usd(&env), &None, &None, + &None, ); client.mark_processing(&relayer, &tx_id); client.mark_completed(&relayer, &tx_id); @@ -1205,18 +1206,11 @@ fn finalize_settlement_stores_record() { #[test] fn finalize_settlement_emits_settlement_finalized_event() { let env = Env::default(); - let (admin, _, client) = setup(&env); + let (admin, contract_id, client) = setup(&env); let relayer = Address::generate(&env); client.grant_relayer(&admin, &relayer); client.add_asset(&admin, &usd(&env)); - let tx_id_1 = client.register_deposit(&relayer, &SorobanString::from_str(&env, "a4"), - &Address::generate(&env), &40_000_000, &usd(&env), &None, &None); - client.mark_processing(&relayer, &tx_id_1); - client.mark_completed(&relayer, &tx_id_1); - - let tx_id_2 = client.register_deposit(&relayer, &SorobanString::from_str(&env, "a5"), - &Address::generate(&env), &60_000_000, &usd(&env), &None, &None); let tx_id_1 = client.register_deposit( &relayer, &SorobanString::from_str(&env, "a4"), @@ -1225,6 +1219,7 @@ fn finalize_settlement_emits_settlement_finalized_event() { &usd(&env), &None, &None, + &None, ); client.mark_processing(&relayer, &tx_id_1); client.mark_completed(&relayer, &tx_id_1); @@ -1237,14 +1232,15 @@ fn finalize_settlement_emits_settlement_finalized_event() { &usd(&env), &None, &None, + &None, ); client.mark_processing(&relayer, &tx_id_2); client.mark_completed(&relayer, &tx_id_2); - let _settlement_id = client.finalize_settlement( + let settlement_id = client.finalize_settlement( &relayer, &usd(&env), - &vec![&env, tx_id_1, tx_id_2], + &vec![&env, tx_id_1.clone(), tx_id_2.clone()], &100_000_000, &0u64, &1u64, @@ -1253,6 +1249,7 @@ fn finalize_settlement_emits_settlement_finalized_event() { let all_events = env.events().all(); let topics: soroban_sdk::Vec = (symbol_short!("synapse"),).into_val(&env); let ledger = env.ledger().sequence(); + let event_count = all_events.len(); let (event_contract_1, event_topics_1, event_data_1) = all_events.get(event_count - 3).unwrap(); let (event_contract_2, event_topics_2, event_data_2) = all_events.get(event_count - 2).unwrap(); @@ -1280,6 +1277,79 @@ fn finalize_settlement_emits_settlement_finalized_event() { ); } +#[test] +#[should_panic(expected = "total_amount mismatch")] +fn test_finalize_settlement_panics_on_total_mismatch() { + let env = Env::default(); + let (admin, _, client) = setup(&env); + let relayer = Address::generate(&env); + client.grant_relayer(&admin, &relayer); + client.add_asset(&admin, &usd(&env)); + + let tx_id = client.register_deposit( + &relayer, + &SorobanString::from_str(&env, "mismatch-total-1"), + &Address::generate(&env), + &100_000_000, + &usd(&env), + &None, + &None, + &None, + ); + client.mark_processing(&relayer, &tx_id); + client.mark_completed(&relayer, &tx_id); + + client.finalize_settlement( + &relayer, + &usd(&env), + &vec![&env, tx_id], + &999_999_999, + &0u64, + &1u64, + ); +} + +#[test] +#[should_panic(expected = "transaction already settled")] +fn test_finalize_settlement_panics_on_double_settle() { + let env = Env::default(); + let (admin, _, client) = setup(&env); + let relayer = Address::generate(&env); + client.grant_relayer(&admin, &relayer); + client.add_asset(&admin, &usd(&env)); + + let tx_id = client.register_deposit( + &relayer, + &SorobanString::from_str(&env, "double-settle-1"), + &Address::generate(&env), + &50_000_000, + &usd(&env), + &None, + &None, + &None, + ); + client.mark_processing(&relayer, &tx_id); + client.mark_completed(&relayer, &tx_id); + + client.finalize_settlement( + &relayer, + &usd(&env), + &vec![&env, tx_id.clone()], + &50_000_000, + &0u64, + &1u64, + ); + + client.finalize_settlement( + &relayer, + &usd(&env), + &vec![&env, tx_id], + &50_000_000, + &0u64, + &1u64, + ); +} + #[test] #[should_panic(expected = "transaction not completed")] fn settle_non_completed_tx_panics() {