diff --git a/controller/tests/contract_srs.rs b/controller/tests/contract_srs.rs index 460a01b..81992a2 100644 --- a/controller/tests/contract_srs.rs +++ b/controller/tests/contract_srs.rs @@ -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)? }; { diff --git a/libwallet/src/contract/actions/setup.rs b/libwallet/src/contract/actions/setup.rs index 56e1b54..e18f225 100644 --- a/libwallet/src/contract/actions/setup.rs +++ b/libwallet/src/contract/actions/setup.rs @@ -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)?;