diff --git a/ddk-manager/src/channel_updater.rs b/ddk-manager/src/channel_updater.rs index 6dc9c30..ad89745 100644 --- a/ddk-manager/src/channel_updater.rs +++ b/ddk-manager/src/channel_updater.rs @@ -105,6 +105,7 @@ where wallet, &signer, blockchain, + None, ) .await?; let party_points = crate::utils::get_party_base_points(secp, signer_provider)?; @@ -176,6 +177,7 @@ where wallet, &signer, blockchain, + None, ) .await?; diff --git a/ddk-manager/src/contract_updater.rs b/ddk-manager/src/contract_updater.rs index 34e44e0..14affa8 100644 --- a/ddk-manager/src/contract_updater.rs +++ b/ddk-manager/src/contract_updater.rs @@ -20,6 +20,7 @@ use secp256k1_zkp::{ }; use crate::dlc_input::{get_dlc_inputs_from_funding_inputs, get_signature_for_dlc_input}; +use crate::utils::PartyAddressOverride; use crate::Storage; use crate::{ contract::{ @@ -78,6 +79,7 @@ where wallet, &signer, blockchain, + None, ) .await?; @@ -121,6 +123,40 @@ pub async fn accept_contract Result<(AcceptedContract, AcceptDlc), Error> +where + W::Target: Wallet, + B::Target: Blockchain, + SP::Target: ContractSignerProvider, + L::Target: Logger, +{ + accept_contract_with_address_override( + secp, + offered_contract, + wallet, + signer_provider, + blockchain, + logger, + None, + ) + .await +} + +/// Creates an [`AcceptedContract`] using explicit accepting-party payout and change addresses. +pub async fn accept_contract_with_address_override< + W: Deref, + X: ContractSigner, + SP: Deref, + B: Deref, + L: Deref, +>( + secp: &Secp256k1, + offered_contract: &OfferedContract, + wallet: &W, + signer_provider: &SP, + blockchain: &B, + logger: &L, + address_override: Option<&PartyAddressOverride>, +) -> Result<(AcceptedContract, AcceptDlc), Error> where W::Target: Wallet, B::Target: Blockchain, @@ -140,6 +176,7 @@ where wallet, &signer, blockchain, + address_override, ) .await?; diff --git a/ddk-manager/src/manager.rs b/ddk-manager/src/manager.rs index 5b9fcf8..ea488b6 100644 --- a/ddk-manager/src/manager.rs +++ b/ddk-manager/src/manager.rs @@ -15,9 +15,11 @@ use crate::contract::{ signed_contract::SignedContract, AdaptorInfo, ClosedContract, Contract, FailedAcceptContract, FailedSignContract, PreClosedContract, }; -use crate::contract_updater::{accept_contract, verify_accepted_and_sign_contract}; +use crate::contract_updater::{ + accept_contract_with_address_override, verify_accepted_and_sign_contract, +}; use crate::error::Error; -use crate::utils::get_object_in_state; +use crate::utils::{get_object_in_state, PartyAddressOverride}; use crate::{ChannelId, ContractId, ContractSignerProvider}; use bitcoin::absolute::Height; use bitcoin::consensus::encode::serialize_hex; @@ -460,19 +462,44 @@ where pub async fn accept_contract_offer( &self, contract_id: &ContractId, + ) -> Result<(ContractId, PublicKey, AcceptDlc), Error> { + self.accept_contract_offer_with_address_override(contract_id, None) + .await + } + + /// Accepts a DLC offer using explicit payout and change addresses for the accepting party. + pub async fn accept_contract_offer_with_addresses( + &self, + contract_id: &ContractId, + payout_address: Address, + change_address: Address, + ) -> Result<(ContractId, PublicKey, AcceptDlc), Error> { + let address_override = PartyAddressOverride { + payout_address, + change_address, + }; + self.accept_contract_offer_with_address_override(contract_id, Some(&address_override)) + .await + } + + async fn accept_contract_offer_with_address_override( + &self, + contract_id: &ContractId, + address_override: Option<&PartyAddressOverride>, ) -> Result<(ContractId, PublicKey, AcceptDlc), Error> { let offered_contract = get_contract_in_state!(self, contract_id, Offered, None as Option)?; let counter_party = offered_contract.counter_party; - let (accepted_contract, accept_msg) = accept_contract( + let (accepted_contract, accept_msg) = accept_contract_with_address_override( &self.secp, &offered_contract, &self.wallet, &self.signer_provider, &self.blockchain, &self.logger, + address_override, ) .await?; diff --git a/ddk-manager/src/utils.rs b/ddk-manager/src/utils.rs index d320612..9b21b87 100644 --- a/ddk-manager/src/utils.rs +++ b/ddk-manager/src/utils.rs @@ -1,7 +1,7 @@ //! #Utils use std::ops::Deref; -use bitcoin::{consensus::Encodable, Amount, ScriptBuf, Txid}; +use bitcoin::{consensus::Encodable, Address, Amount, ScriptBuf, Txid}; use ddk_dlc::{dlc_input::DlcInputInfo, util::get_common_fee, PartyParams, TxInputInfo}; use ddk_messages::{ oracle_msgs::{OracleAnnouncement, OracleAttestation}, @@ -19,6 +19,11 @@ use crate::{ Blockchain, ContractSigner, ContractSignerProvider, Wallet, }; +pub struct PartyAddressOverride { + pub payout_address: Address, + pub change_address: Address, +} + macro_rules! get_object_in_state { ($manager: expr, $id: expr, $state: ident, $peer_id: expr, $object_type: ident, $get_call: ident) => {{ let object = $manager.get_store().$get_call($id).await?; @@ -99,6 +104,7 @@ pub(crate) async fn get_party_params, ) -> Result<(PartyParams, Vec), Error> where W::Target: Wallet, @@ -106,10 +112,16 @@ where { let funding_pubkey = signer.get_public_key(secp)?; - let payout_addr = wallet.get_new_address().await?; + let payout_addr = match address_override { + Some(address_override) => address_override.payout_address.clone(), + None => wallet.get_new_address().await?, + }; let payout_spk = payout_addr.script_pubkey(); let payout_serial_id = get_new_serial_id(); - let change_addr = wallet.get_new_change_address().await?; + let change_addr = match address_override { + Some(address_override) => address_override.change_address.clone(), + None => wallet.get_new_change_address().await?, + }; let change_spk = change_addr.script_pubkey(); let change_serial_id = get_new_serial_id();