Skip to content

Commit d45f8e2

Browse files
committed
Move onchain payments API to OnchainPaymentHandler
1 parent 851b654 commit d45f8e2

File tree

12 files changed

+108
-63
lines changed

12 files changed

+108
-63
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn main() {
3131

3232
node.start().unwrap();
3333

34-
let funding_address = node.new_onchain_address();
34+
let funding_address = node.onchain_payment().new_address();
3535

3636
// .. fund address ..
3737

bindings/kotlin/ldk-node-android/lib/src/androidTest/kotlin/org/lightningdevkit/ldknode/AndroidLibTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ class AndroidLibTest {
5151
val nodeId2 = node2.nodeId()
5252
println("Node Id 2: $nodeId2")
5353

54-
val address1 = node1.newOnchainAddress()
54+
val address1 = node1.onchain_payment().newOnchainAddress()
5555
println("Funding address 1: $address1")
5656

57-
val address2 = node2.newOnchainAddress()
57+
val address2 = node2.onchain_payment().newOnchainAddress()
5858
println("Funding address 2: $address2")
5959

6060
node1.stop()

bindings/kotlin/ldk-node-jvm/lib/src/test/kotlin/org/lightningdevkit/ldknode/LibraryTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,10 @@ class LibraryTest {
146146
val nodeId2 = node2.nodeId()
147147
println("Node Id 2: $nodeId2")
148148

149-
val address1 = node1.newOnchainAddress()
149+
val address1 = node1.onchainPayment().newAddress()
150150
println("Funding address 1: $address1")
151151

152-
val address2 = node2.newOnchainAddress()
152+
val address2 = node2.onchainPayment().newAddress()
153153
println("Funding address 2: $address2")
154154

155155
val txid1 = sendToAddress(address1, 100000u)

bindings/ldk_node.udl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,7 @@ interface Node {
5353
sequence<SocketAddress>? listening_addresses();
5454
Bolt11PaymentHandler bolt11_payment();
5555
SpontaneousPaymentHandler spontaneous_payment();
56-
[Throws=NodeError]
57-
Address new_onchain_address();
58-
[Throws=NodeError]
59-
Txid send_to_onchain_address([ByRef]Address address, u64 amount_msat);
60-
[Throws=NodeError]
61-
Txid send_all_to_onchain_address([ByRef]Address address);
56+
OnchainPaymentHandler onchain_payment();
6257
[Throws=NodeError]
6358
void connect(PublicKey node_id, SocketAddress address, boolean persist);
6459
[Throws=NodeError]
@@ -110,6 +105,15 @@ interface SpontaneousPaymentHandler {
110105
void send_probes(u64 amount_msat, PublicKey node_id);
111106
};
112107

108+
interface OnchainPaymentHandler {
109+
[Throws=NodeError]
110+
Address new_address();
111+
[Throws=NodeError]
112+
Txid send_to_address([ByRef]Address address, u64 amount_msat);
113+
[Throws=NodeError]
114+
Txid send_all_to_address([ByRef]Address address);
115+
};
116+
113117
[Error]
114118
enum NodeError {
115119
"AlreadyRunning",

bindings/python/src/ldk_node/test_ldk_node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ def test_channel_full_cycle(self):
125125
node_id_2 = node_2.node_id()
126126
print("Node ID 2:", node_id_2)
127127

128-
address_1 = node_1.new_onchain_address()
128+
address_1 = node_1.onchain_payment().new_address()
129129
txid_1 = send_to_address(address_1, 100000)
130-
address_2 = node_2.new_onchain_address()
130+
address_2 = node_2.onchain_payment().new_address()
131131
txid_2 = send_to_address(address_2, 100000)
132132

133133
wait_for_tx(esplora_endpoint, txid_1)

src/lib.rs

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
//!
4444
//! node.start().unwrap();
4545
//!
46-
//! let funding_address = node.new_onchain_address();
46+
//! let funding_address = node.onchain_payment().new_address();
4747
//!
4848
//! // .. fund address ..
4949
//!
@@ -130,7 +130,7 @@ use connection::ConnectionManager;
130130
use event::{EventHandler, EventQueue};
131131
use gossip::GossipSource;
132132
use liquidity::LiquiditySource;
133-
use payment::{Bolt11PaymentHandler, SpontaneousPaymentHandler};
133+
use payment::{Bolt11PaymentHandler, OnchainPaymentHandler, SpontaneousPaymentHandler};
134134
use payment_store::PaymentStore;
135135
pub use payment_store::{LSPFeeLimits, PaymentDetails, PaymentDirection, PaymentStatus};
136136
use peer_store::{PeerInfo, PeerStore};
@@ -154,7 +154,6 @@ use lightning_background_processor::process_events_async;
154154
use lightning_transaction_sync::EsploraSyncClient;
155155

156156
use bitcoin::secp256k1::PublicKey;
157-
use bitcoin::{Address, Txid};
158157

159158
use rand::Rng;
160159

@@ -770,38 +769,13 @@ impl Node {
770769
))
771770
}
772771

773-
/// Retrieve a new on-chain/funding address.
774-
pub fn new_onchain_address(&self) -> Result<Address, Error> {
775-
let funding_address = self.wallet.get_new_address()?;
776-
log_info!(self.logger, "Generated new funding address: {}", funding_address);
777-
Ok(funding_address)
778-
}
779-
780-
/// Send an on-chain payment to the given address.
781-
pub fn send_to_onchain_address(
782-
&self, address: &bitcoin::Address, amount_sats: u64,
783-
) -> Result<Txid, Error> {
784-
let rt_lock = self.runtime.read().unwrap();
785-
if rt_lock.is_none() {
786-
return Err(Error::NotRunning);
787-
}
788-
789-
let cur_balance = self.wallet.get_balance()?;
790-
if cur_balance.get_spendable() < amount_sats {
791-
log_error!(self.logger, "Unable to send payment due to insufficient funds.");
792-
return Err(Error::InsufficientFunds);
793-
}
794-
self.wallet.send_to_address(address, Some(amount_sats))
795-
}
796-
797-
/// Send an on-chain payment to the given address, draining all the available funds.
798-
pub fn send_all_to_onchain_address(&self, address: &bitcoin::Address) -> Result<Txid, Error> {
799-
let rt_lock = self.runtime.read().unwrap();
800-
if rt_lock.is_none() {
801-
return Err(Error::NotRunning);
802-
}
803-
804-
self.wallet.send_to_address(address, None)
772+
/// Returns a payment handler allowing to send and receive on-chain payments.
773+
pub fn onchain_payment(&self) -> Arc<OnchainPaymentHandler> {
774+
Arc::new(OnchainPaymentHandler::new(
775+
Arc::clone(&self.runtime),
776+
Arc::clone(&self.wallet),
777+
Arc::clone(&self.logger),
778+
))
805779
}
806780

807781
/// Retrieve a list of known channels.

src/payment/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
//! Handlers for different types of payments.
22
33
mod bolt11;
4+
mod onchain;
45
mod spontaneous;
56

67
pub use bolt11::Bolt11PaymentHandler;
8+
pub use onchain::OnchainPaymentHandler;
79
pub use spontaneous::SpontaneousPaymentHandler;

src/payment/onchain.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//! Holds a payment handler allowing to send and receive on-chain payments.
2+
3+
use crate::error::Error;
4+
use crate::logger::{log_error, log_info, FilesystemLogger, Logger};
5+
use crate::types::Wallet;
6+
7+
use bitcoin::{Address, Txid};
8+
9+
use std::sync::{Arc, RwLock};
10+
11+
/// A payment handler allowing to send and receive on-chain payments.
12+
///
13+
/// Should be retrieved by calling [`Node::onchain_payment`].
14+
///
15+
/// [`Node::onchain_payment`]: crate::Node::onchain_payment
16+
pub struct OnchainPaymentHandler {
17+
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
18+
wallet: Arc<Wallet>,
19+
logger: Arc<FilesystemLogger>,
20+
}
21+
22+
impl OnchainPaymentHandler {
23+
pub(crate) fn new(
24+
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, wallet: Arc<Wallet>,
25+
logger: Arc<FilesystemLogger>,
26+
) -> Self {
27+
Self { runtime, wallet, logger }
28+
}
29+
30+
/// Retrieve a new on-chain/funding address.
31+
pub fn new_address(&self) -> Result<Address, Error> {
32+
let funding_address = self.wallet.get_new_address()?;
33+
log_info!(self.logger, "Generated new funding address: {}", funding_address);
34+
Ok(funding_address)
35+
}
36+
37+
/// Send an on-chain payment to the given address.
38+
pub fn send_to_address(
39+
&self, address: &bitcoin::Address, amount_sats: u64,
40+
) -> Result<Txid, Error> {
41+
let rt_lock = self.runtime.read().unwrap();
42+
if rt_lock.is_none() {
43+
return Err(Error::NotRunning);
44+
}
45+
46+
let cur_balance = self.wallet.get_balance()?;
47+
if cur_balance.get_spendable() < amount_sats {
48+
log_error!(self.logger, "Unable to send payment due to insufficient funds.");
49+
return Err(Error::InsufficientFunds);
50+
}
51+
self.wallet.send_to_address(address, Some(amount_sats))
52+
}
53+
54+
/// Send an on-chain payment to the given address, draining all the available funds.
55+
pub fn send_all_to_address(&self, address: &bitcoin::Address) -> Result<Txid, Error> {
56+
let rt_lock = self.runtime.read().unwrap();
57+
if rt_lock.is_none() {
58+
return Err(Error::NotRunning);
59+
}
60+
61+
self.wallet.send_to_address(address, None)
62+
}
63+
}

src/uniffi_types.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pub use lightning::util::string::UntrustedString;
44

55
pub use lightning_invoice::Bolt11Invoice;
66

7-
pub use bitcoin::{BlockHash, Network, OutPoint};
7+
pub use bitcoin::{Address, BlockHash, Network, OutPoint, Txid};
88

99
pub use bip39::Mnemonic;
1010

@@ -17,7 +17,6 @@ use crate::{SocketAddress, UserChannelId};
1717
use bitcoin::hashes::sha256::Hash as Sha256;
1818
use bitcoin::hashes::Hash;
1919
use bitcoin::secp256k1::PublicKey;
20-
use bitcoin::{Address, Txid};
2120
use lightning_invoice::SignedRawBolt11Invoice;
2221

2322
use std::convert::TryInto;

tests/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,8 @@ pub fn open_channel(
317317
pub(crate) fn do_channel_full_cycle<E: ElectrumApi>(
318318
node_a: TestNode, node_b: TestNode, bitcoind: &BitcoindClient, electrsd: &E, allow_0conf: bool,
319319
) {
320-
let addr_a = node_a.new_onchain_address().unwrap();
321-
let addr_b = node_b.new_onchain_address().unwrap();
320+
let addr_a = node_a.onchain_payment().new_address().unwrap();
321+
let addr_b = node_b.onchain_payment().new_address().unwrap();
322322

323323
let premine_amount_sat = 100_000;
324324

0 commit comments

Comments
 (0)