fix contract setup retries

This commit is contained in:
wiesche
2026-09-12 08:45:28 +02:00
parent b7b9fdc225
commit 1527537b57
2 changed files with 22 additions and 1 deletions
+16
View File
@@ -684,9 +684,25 @@ fn contract_srs_tx_impl(test_dir: &'static str) -> Result<(), libwallet::Error>
};
let signed = {
wallet_inst!(recv_wallet, w);
let mut retry_args = receiver_args.clone();
retry_args.net_change = None;
let err = libwallet::contract::setup(w, recv_mask, &incoming, &retry_args).unwrap_err();
assert!(matches!(err, libwallet::Error::GenericError(ref msg)
if msg == "Contract requires a net change (--send or --receive)"));
let first = libwallet::contract::setup(w, recv_mask, &incoming, &receiver_args)?;
let retried = libwallet::contract::setup(w, recv_mask, &incoming, &receiver_args)?;
assert_eq!(retried.fee_fields, first.fee_fields);
let retried = libwallet::contract::setup(w, recv_mask, &incoming, &retry_args)?;
assert_eq!(retried.fee_fields, first.fee_fields);
assert_eq!(retried.participant_data.len(), first.participant_data.len());
for (retried, first) in retried.participant_data.iter().zip(&first.participant_data) {
assert_eq!(retried.public_blind_excess, first.public_blind_excess);
assert_eq!(retried.public_nonce, first.public_nonce);
}
retry_args.net_change = Some(2_000_000_000);
let err = libwallet::contract::setup(w, recv_mask, &incoming, &retry_args).unwrap_err();
assert!(matches!(err, libwallet::Error::GenericError(ref msg)
if msg == "Expected net change mismatch! Context.net_change: 1000000000, setup_args.net_change: 2000000000"));
libwallet::contract::sign(w, recv_mask, &incoming, &receiver_args)?
};
{
+6 -1
View File
@@ -86,12 +86,17 @@ where
Some(context) => context,
None => contract::context::get_or_create(w, keychain_mask, &mut sl, setup_args)?,
};
let mut setup_args = setup_args.clone();
setup_args.net_change = Some(contract::utils::get_net_change(
Some(&context),
setup_args.net_change,
)?);
contract::utils::verify_ttl(context.contract_ttl_cutoff_height, &sl)?;
let context_args = context
.setup_args
.as_ref()
.ok_or_else(|| Error::GenericError("Context carries no contract setup args".to_string()))?;
contract::utils::verify_setup_args_consistency(context_args, setup_args)?;
contract::utils::verify_setup_args_consistency(context_args, &setup_args)?;
// Add keys and payment proof to slate (both are idempotent operations)
let keychain = w.keychain(keychain_mask)?;