diff --git a/cfd_protocol/src/lib.rs b/cfd_protocol/src/lib.rs index 02480b0..d908c38 100644 --- a/cfd_protocol/src/lib.rs +++ b/cfd_protocol/src/lib.rs @@ -1,3 +1,4 @@ +pub use interval::Interval; pub use secp256k1_zkp; use anyhow::{bail, Context, Result}; @@ -448,15 +449,23 @@ pub struct Payout { impl Payout { pub fn new( - msg_nonce_pairs: Vec<(Vec, schnorrsig::PublicKey)>, + interval: Interval, + nonce_pks: Vec, maker_amount: Amount, taker_amount: Amount, - ) -> Self { - Self { - msg_nonce_pairs, - maker_amount, - taker_amount, - } + ) -> Vec { + interval + .as_digits() + .into_iter() + .map(|digits| { + let msg_nonce_pairs = digits.zip(nonce_pks.clone()).collect(); + Self { + msg_nonce_pairs, + maker_amount, + taker_amount, + } + }) + .collect() } fn into_txouts(self, maker_address: &Address, taker_address: &Address) -> Vec { @@ -942,24 +951,28 @@ mod tests { let orig_maker_amount = 1000; let orig_taker_amount = 1000; - let payout = Payout::new( - vec![(b"win".to_vec(), nonce_pk)], + let payouts = Payout::new( + Interval::new(0, 10_000).unwrap(), + vec![nonce_pk; 20], Amount::from_sat(orig_maker_amount), Amount::from_sat(orig_taker_amount), ); let fee = 100; - let updated_payout = payout - .with_updated_fee(Amount::from_sat(fee), dummy_dust_limit, dummy_dust_limit) - .unwrap(); - assert_eq!( - updated_payout.maker_amount, - Amount::from_sat(orig_maker_amount - fee / 2) - ); - assert_eq!( - updated_payout.taker_amount, - Amount::from_sat(orig_taker_amount - fee / 2) - ); + for payout in payouts { + let updated_payout = payout + .with_updated_fee(Amount::from_sat(fee), dummy_dust_limit, dummy_dust_limit) + .unwrap(); + + assert_eq!( + updated_payout.maker_amount, + Amount::from_sat(orig_maker_amount - fee / 2) + ); + assert_eq!( + updated_payout.taker_amount, + Amount::from_sat(orig_taker_amount - fee / 2) + ); + } } #[test] @@ -975,20 +988,24 @@ mod tests { let orig_maker_amount = dummy_dust_limit.as_sat() - 1; let orig_taker_amount = 1000; - let payout = Payout::new( - vec![(b"win".to_vec(), nonce_pk)], + let payouts = Payout::new( + Interval::new(0, 10_000).unwrap(), + vec![nonce_pk; 20], Amount::from_sat(orig_maker_amount), Amount::from_sat(orig_taker_amount), ); let fee = 100; - let updated_payout = payout - .with_updated_fee(Amount::from_sat(fee), dummy_dust_limit, dummy_dust_limit) - .unwrap(); - assert_eq!(updated_payout.maker_amount, Amount::from_sat(0)); - assert_eq!( - updated_payout.taker_amount, - Amount::from_sat(orig_taker_amount - (fee + orig_maker_amount)) - ); + for payout in payouts { + let updated_payout = payout + .with_updated_fee(Amount::from_sat(fee), dummy_dust_limit, dummy_dust_limit) + .unwrap(); + + assert_eq!(updated_payout.maker_amount, Amount::from_sat(0)); + assert_eq!( + updated_payout.taker_amount, + Amount::from_sat(orig_taker_amount - (fee + orig_maker_amount)) + ); + } } } diff --git a/cfd_protocol/tests/cfds.rs b/cfd_protocol/tests/cfds.rs index b1e18ee..33aa373 100644 --- a/cfd_protocol/tests/cfds.rs +++ b/cfd_protocol/tests/cfds.rs @@ -7,6 +7,7 @@ use bdk::wallet::AddressIndex; use bdk::SignOptions; use bitcoin::util::psbt::PartiallySignedTransaction; use bitcoin::Txid; +use cfd_protocol::interval::Interval; use cfd_protocol::{ commit_descriptor, compute_adaptor_point, create_cfd_transactions, finalize_spend_transaction, lock_descriptor, punish_transaction, renew_cfd_transactions, spending_tx_sighash, @@ -32,22 +33,19 @@ fn create_cfd() { let payouts = vec![ Payout::new( - vec![vec![0u8]; 20] - .into_iter() - .zip(announcement.nonce_pks()) - .collect(), + Interval::new(0, 10_000).unwrap(), + announcement.nonce_pks(), Amount::from_btc(1.5).unwrap(), Amount::from_btc(0.5).unwrap(), ), Payout::new( - vec![vec![1u8]; 20] - .into_iter() - .zip(announcement.nonce_pks()) - .collect(), + Interval::new(10_001, 20_000).unwrap(), + announcement.nonce_pks(), Amount::ZERO, Amount::from_btc(2.0).unwrap(), ), - ]; + ] + .concat(); let refund_timelock = 0; @@ -119,22 +117,19 @@ fn renew_cfd() { let payouts = vec![ Payout::new( - vec![vec![0u8]; 20] - .into_iter() - .zip(announcement.nonce_pks()) - .collect(), + Interval::new(0, 10_000).unwrap(), + announcement.nonce_pks(), Amount::from_btc(2.0).unwrap(), Amount::ZERO, ), Payout::new( - vec![vec![1u8]; 20] - .into_iter() - .zip(announcement.nonce_pks()) - .collect(), + Interval::new(10_001, 20_000).unwrap(), + announcement.nonce_pks(), Amount::ZERO, Amount::from_btc(2.0).unwrap(), ), - ]; + ] + .concat(); let refund_timelock = 0; @@ -159,22 +154,19 @@ fn renew_cfd() { let payouts = vec![ Payout::new( - vec![vec![0u8]; 20] - .into_iter() - .zip(announcement.nonce_pks()) - .collect(), + Interval::new(0, 10_000).unwrap(), + announcement.nonce_pks(), Amount::from_btc(1.5).unwrap(), Amount::from_btc(0.5).unwrap(), ), Payout::new( - vec![vec![1u8]; 20] - .into_iter() - .zip(announcement.nonce_pks()) - .collect(), + Interval::new(10_001, 20_000).unwrap(), + announcement.nonce_pks(), Amount::from_btc(0.5).unwrap(), Amount::from_btc(1.5).unwrap(), ), - ]; + ] + .concat(); let maker_cfd_txs = renew_cfd_transactions( maker_cfd_txs.lock, diff --git a/daemon/src/model/cfd.rs b/daemon/src/model/cfd.rs index ad90f4e..2646e12 100644 --- a/daemon/src/model/cfd.rs +++ b/daemon/src/model/cfd.rs @@ -597,6 +597,7 @@ pub struct FinalizedCfd { pub lock: PartiallySignedTransaction, pub commit: (Transaction, EcdsaAdaptorSignature), + #[allow(clippy::type_complexity)] pub cets: Vec<( Transaction, EcdsaAdaptorSignature, diff --git a/daemon/src/setup_contract_actor.rs b/daemon/src/setup_contract_actor.rs index f3de698..edcd24e 100644 --- a/daemon/src/setup_contract_actor.rs +++ b/daemon/src/setup_contract_actor.rs @@ -219,6 +219,7 @@ impl AllParams { } } +#[allow(clippy::type_complexity)] fn verify_cets( oracle_pk: &schnorrsig::PublicKey, other: &PartyParams, @@ -240,7 +241,7 @@ fn verify_cets( verify_cet_encsig( tx, other_encsig, - &msg_nonce_pairs, + msg_nonce_pairs, &other.identity_pk, oracle_pk, commit_desc,