From 463f7ee21fc07b94b634f17a812b74090b856386 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Wed, 6 Dec 2023 04:34:34 -0600 Subject: [PATCH] Add is_change flag to get_new_address A lot of wallets treat change addresses vs external addresses differently. Being able to specificy what the address is being used for lets the wallet generate the correct kind. --- bitcoin-rpc-provider/src/lib.rs | 2 +- dlc-manager/src/lib.rs | 3 ++- dlc-manager/src/manager.rs | 4 ++-- dlc-manager/src/utils.rs | 4 ++-- dlc-manager/tests/channel_execution_tests.rs | 4 ++-- dlc-manager/tests/manager_execution_tests.rs | 4 ++-- mocks/src/mock_wallet.rs | 5 ++++- simple-wallet/src/lib.rs | 2 +- 8 files changed, 16 insertions(+), 12 deletions(-) diff --git a/bitcoin-rpc-provider/src/lib.rs b/bitcoin-rpc-provider/src/lib.rs index 112a4b00..d8d9e096 100644 --- a/bitcoin-rpc-provider/src/lib.rs +++ b/bitcoin-rpc-provider/src/lib.rs @@ -219,7 +219,7 @@ impl Signer for BitcoinCoreProvider { } impl Wallet for BitcoinCoreProvider { - fn get_new_address(&self) -> Result { + fn get_new_address(&self, _is_change: bool) -> Result { self.client .lock() .unwrap() diff --git a/dlc-manager/src/lib.rs b/dlc-manager/src/lib.rs index d6707ec8..e085018d 100644 --- a/dlc-manager/src/lib.rs +++ b/dlc-manager/src/lib.rs @@ -93,7 +93,8 @@ pub trait Signer { /// managing bitcoin addresses and UTXOs. pub trait Wallet: Signer { /// Returns a new (unused) address. - fn get_new_address(&self) -> Result; + /// If `is_change` is set, the address will be used for change. + fn get_new_address(&self, is_change: bool) -> Result; /// Generate a new secret key and store it in the wallet so that it can later /// be retrieved. fn get_new_secret_key(&self) -> Result; diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index 1e916096..b0363bcb 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -2012,7 +2012,7 @@ where &counter_sk, &counter_revocation_sk, &tx, - &self.wallet.get_new_address()?, + &self.wallet.get_new_address(false)?, 0, fee_rate_per_vb, )? @@ -2026,7 +2026,7 @@ where &counter_sk, &counter_revocation_sk, &tx, - &self.wallet.get_new_address()?, + &self.wallet.get_new_address(false)?, CET_NSEQUENCE, 0, fee_rate_per_vb, diff --git a/dlc-manager/src/utils.rs b/dlc-manager/src/utils.rs index 6066a764..9ca8c5af 100644 --- a/dlc-manager/src/utils.rs +++ b/dlc-manager/src/utils.rs @@ -73,10 +73,10 @@ where let funding_privkey = wallet.get_new_secret_key()?; let funding_pubkey = PublicKey::from_secret_key(secp, &funding_privkey); - let payout_addr = wallet.get_new_address()?; + let payout_addr = wallet.get_new_address(false)?; let payout_spk = payout_addr.script_pubkey(); let payout_serial_id = get_new_serial_id(); - let change_addr = wallet.get_new_address()?; + let change_addr = wallet.get_new_address(true)?; let change_spk = change_addr.script_pubkey(); let change_serial_id = get_new_serial_id(); diff --git a/dlc-manager/tests/channel_execution_tests.rs b/dlc-manager/tests/channel_execution_tests.rs index 0fe286c2..5025b968 100644 --- a/dlc-manager/tests/channel_execution_tests.rs +++ b/dlc-manager/tests/channel_execution_tests.rs @@ -289,8 +289,8 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { bitcoin::Network::Regtest, )); - let alice_fund_address = alice_wallet.get_new_address().unwrap(); - let bob_fund_address = bob_wallet.get_new_address().unwrap(); + let alice_fund_address = alice_wallet.get_new_address(false).unwrap(); + let bob_fund_address = bob_wallet.get_new_address(false).unwrap(); sink_rpc .send_to_address( diff --git a/dlc-manager/tests/manager_execution_tests.rs b/dlc-manager/tests/manager_execution_tests.rs index f90e4f90..294b5c02 100644 --- a/dlc-manager/tests/manager_execution_tests.rs +++ b/dlc-manager/tests/manager_execution_tests.rs @@ -444,8 +444,8 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { bitcoin::Network::Regtest, )); - let alice_fund_address = alice_wallet.get_new_address().unwrap(); - let bob_fund_address = bob_wallet.get_new_address().unwrap(); + let alice_fund_address = alice_wallet.get_new_address(false).unwrap(); + let bob_fund_address = bob_wallet.get_new_address(false).unwrap(); sink_rpc .send_to_address( diff --git a/mocks/src/mock_wallet.rs b/mocks/src/mock_wallet.rs index b83b60d0..f02f23e5 100644 --- a/mocks/src/mock_wallet.rs +++ b/mocks/src/mock_wallet.rs @@ -64,7 +64,10 @@ impl Signer for MockWallet { } impl Wallet for MockWallet { - fn get_new_address(&self) -> Result { + fn get_new_address( + &self, + _is_change_address: bool, + ) -> Result { Ok(get_address()) } diff --git a/simple-wallet/src/lib.rs b/simple-wallet/src/lib.rs index 3f835866..6895f3ca 100644 --- a/simple-wallet/src/lib.rs +++ b/simple-wallet/src/lib.rs @@ -204,7 +204,7 @@ where B::Target: WalletBlockchainProvider, W::Target: WalletStorage, { - fn get_new_address(&self) -> Result
{ + fn get_new_address(&self, _is_change: bool) -> Result
{ let seckey = SecretKey::new(&mut thread_rng()); let pubkey = PublicKey::from_secret_key(&self.secp_ctx, &seckey); let address = Address::p2wpkh(