Skip to content

Commit 213ec8d

Browse files
committed
ENG-1544 add DLC accept address overrides
1 parent 0d8aa46 commit 213ec8d

4 files changed

Lines changed: 47 additions & 4 deletions

File tree

ddk-manager/src/channel_updater.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ where
105105
wallet,
106106
&signer,
107107
blockchain,
108+
None,
108109
)
109110
.await?;
110111
let party_points = crate::utils::get_party_base_points(secp, signer_provider)?;
@@ -176,6 +177,7 @@ where
176177
wallet,
177178
&signer,
178179
blockchain,
180+
None,
179181
)
180182
.await?;
181183

ddk-manager/src/contract_updater.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use secp256k1_zkp::{
2020
};
2121

2222
use crate::dlc_input::{get_dlc_inputs_from_funding_inputs, get_signature_for_dlc_input};
23+
use crate::utils::PartyAddressOverride;
2324
use crate::Storage;
2425
use crate::{
2526
contract::{
@@ -78,6 +79,7 @@ where
7879
wallet,
7980
&signer,
8081
blockchain,
82+
None,
8183
)
8284
.await?;
8385

@@ -120,6 +122,7 @@ pub async fn accept_contract<W: Deref, X: ContractSigner, SP: Deref, B: Deref, L
120122
signer_provider: &SP,
121123
blockchain: &B,
122124
logger: &L,
125+
address_override: Option<&PartyAddressOverride>,
123126
) -> Result<(AcceptedContract, AcceptDlc), Error>
124127
where
125128
W::Target: Wallet,
@@ -140,6 +143,7 @@ where
140143
wallet,
141144
&signer,
142145
blockchain,
146+
address_override,
143147
)
144148
.await?;
145149

ddk-manager/src/manager.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::contract::{
1717
};
1818
use crate::contract_updater::{accept_contract, verify_accepted_and_sign_contract};
1919
use crate::error::Error;
20-
use crate::utils::get_object_in_state;
20+
use crate::utils::{get_object_in_state, PartyAddressOverride};
2121
use crate::{ChannelId, ContractId, ContractSignerProvider};
2222
use bitcoin::absolute::Height;
2323
use bitcoin::consensus::encode::serialize_hex;
@@ -460,6 +460,30 @@ where
460460
pub async fn accept_contract_offer(
461461
&self,
462462
contract_id: &ContractId,
463+
) -> Result<(ContractId, PublicKey, AcceptDlc), Error> {
464+
self.accept_contract_offer_with_address_override(contract_id, None)
465+
.await
466+
}
467+
468+
/// Accepts a DLC offer using explicit payout and change addresses for the accepting party.
469+
pub async fn accept_contract_offer_with_addresses(
470+
&self,
471+
contract_id: &ContractId,
472+
payout_address: Address,
473+
change_address: Address,
474+
) -> Result<(ContractId, PublicKey, AcceptDlc), Error> {
475+
let address_override = PartyAddressOverride {
476+
payout_address,
477+
change_address,
478+
};
479+
self.accept_contract_offer_with_address_override(contract_id, Some(&address_override))
480+
.await
481+
}
482+
483+
async fn accept_contract_offer_with_address_override(
484+
&self,
485+
contract_id: &ContractId,
486+
address_override: Option<&PartyAddressOverride>,
463487
) -> Result<(ContractId, PublicKey, AcceptDlc), Error> {
464488
let offered_contract =
465489
get_contract_in_state!(self, contract_id, Offered, None as Option<PublicKey>)?;
@@ -473,6 +497,7 @@ where
473497
&self.signer_provider,
474498
&self.blockchain,
475499
&self.logger,
500+
address_override,
476501
)
477502
.await?;
478503

ddk-manager/src/utils.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! #Utils
22
use std::ops::Deref;
33

4-
use bitcoin::{consensus::Encodable, Amount, ScriptBuf, Txid};
4+
use bitcoin::{consensus::Encodable, Address, Amount, ScriptBuf, Txid};
55
use ddk_dlc::{dlc_input::DlcInputInfo, util::get_common_fee, PartyParams, TxInputInfo};
66
use ddk_messages::{
77
oracle_msgs::{OracleAnnouncement, OracleAttestation},
@@ -19,6 +19,11 @@ use crate::{
1919
Blockchain, ContractSigner, ContractSignerProvider, Wallet,
2020
};
2121

22+
pub struct PartyAddressOverride {
23+
pub payout_address: Address,
24+
pub change_address: Address,
25+
}
26+
2227
macro_rules! get_object_in_state {
2328
($manager: expr, $id: expr, $state: ident, $peer_id: expr, $object_type: ident, $get_call: ident) => {{
2429
let object = $manager.get_store().$get_call($id).await?;
@@ -99,17 +104,24 @@ pub(crate) async fn get_party_params<W: Deref, B: Deref, X: ContractSigner, C: S
99104
wallet: &W,
100105
signer: &X,
101106
blockchain: &B,
107+
address_override: Option<&PartyAddressOverride>,
102108
) -> Result<(PartyParams, Vec<FundingInput>), Error>
103109
where
104110
W::Target: Wallet,
105111
B::Target: Blockchain,
106112
{
107113
let funding_pubkey = signer.get_public_key(secp)?;
108114

109-
let payout_addr = wallet.get_new_address().await?;
115+
let payout_addr = match address_override {
116+
Some(address_override) => address_override.payout_address.clone(),
117+
None => wallet.get_new_address().await?,
118+
};
110119
let payout_spk = payout_addr.script_pubkey();
111120
let payout_serial_id = get_new_serial_id();
112-
let change_addr = wallet.get_new_change_address().await?;
121+
let change_addr = match address_override {
122+
Some(address_override) => address_override.change_address.clone(),
123+
None => wallet.get_new_change_address().await?,
124+
};
113125
let change_spk = change_addr.script_pubkey();
114126
let change_serial_id = get_new_serial_id();
115127

0 commit comments

Comments
 (0)