From 947a5cb8e07217e9fe78f44754f4e5e94e4cc1b4 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 00:43:26 +0530 Subject: [PATCH 1/8] Allow cloning transaction --- src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 1510fee..05614f1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -70,6 +70,8 @@ pub struct TransactionDetails { } type Confirmation = ConfirmationTime; + +#[derive(Debug, Clone, PartialEq, Eq)] pub enum Transaction { Unconfirmed { details: TransactionDetails, From 7e61659cb7d8b4294d98f93d8d9e5806f1450dbe Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 00:43:55 +0530 Subject: [PATCH 2/8] Add a way to convert TransactionDetails to Transaction --- src/lib.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 05614f1..9bc441f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -82,6 +82,22 @@ pub enum Transaction { }, } +fn to_transaction(x: &bdk::TransactionDetails) -> Transaction { + let details = TransactionDetails { + fees: x.fee, + id: x.txid.to_string(), + received: x.received, + sent: x.sent, + }; + match x.confirmation_time.clone() { + Some(confirmation) => Transaction::Confirmed { + details, + confirmation, + }, + None => Transaction::Unconfirmed { details }, + } +} + trait OfflineWalletOperations: WalletHolder { fn get_new_address(&self) -> String { self.get_wallet() From 2ac26fa060e1dedee2ab5b3d8b59e0074a751fcc Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 00:45:02 +0530 Subject: [PATCH 3/8] Add details to PSBT --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 9bc441f..a7a159b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -193,6 +193,7 @@ impl Progress for BdkProgressHolder { struct PartiallySignedBitcoinTransaction { internal: Mutex, + details: bdk::TransactionDetails, } impl PartiallySignedBitcoinTransaction { @@ -205,7 +206,7 @@ impl PartiallySignedBitcoinTransaction { let wallet = online_wallet.get_wallet(); match Address::from_str(&recipient) { Ok(address) => { - let (psbt, _) = { + let (psbt, details) = { let mut builder = wallet.build_tx(); builder.add_recipient(address.script_pubkey(), amount); if let Some(sat_per_vb) = fee_rate { @@ -215,6 +216,7 @@ impl PartiallySignedBitcoinTransaction { }; Ok(PartiallySignedBitcoinTransaction { internal: Mutex::new(psbt), + details, }) } Err(..) => Err(BdkError::Generic( From 8a9e025e2f53029730cfab7afe3fa3f38f6a1194 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 00:45:16 +0530 Subject: [PATCH 4/8] Simplify --- src/lib.rs | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a7a159b..ffa133a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -133,24 +133,7 @@ trait OfflineWalletOperations: WalletHolder { fn get_transactions(&self) -> Result, Error> { let transactions = self.get_wallet().list_transactions(true)?; - Ok(transactions - .iter() - .map(|x| -> Transaction { - let details = TransactionDetails { - fees: x.fee, - id: x.txid.to_string(), - received: x.received, - sent: x.sent, - }; - match x.confirmation_time.clone() { - Some(confirmation) => Transaction::Confirmed { - details, - confirmation, - }, - None => Transaction::Unconfirmed { details }, - } - }) - .collect()) + Ok(transactions.iter().map(to_transaction).collect()) } } From c58a31f711b624d068060c03206b80af970ddfb8 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 00:45:27 +0530 Subject: [PATCH 5/8] Return transaction on broadcast --- src/lib.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ffa133a..944197e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -269,10 +269,13 @@ impl OnlineWallet { .sync(BdkProgressHolder { progress_update }, max_address_param) } - fn broadcast<'a>(&self, psbt: &'a PartiallySignedBitcoinTransaction) -> Result { + fn broadcast<'a>( + &self, + psbt: &'a PartiallySignedBitcoinTransaction, + ) -> Result { let tx = psbt.internal.lock().unwrap().clone().extract_tx(); - let tx_id = self.get_wallet().broadcast(tx)?; - Ok(tx_id.to_string()) + self.get_wallet().broadcast(tx)?; + Ok(to_transaction(&psbt.details)) } } From 358cc35b604e6a36d01cf498892a3d20b03042c6 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 00:45:40 +0530 Subject: [PATCH 6/8] Update Wallet::broadcast API --- src/bdk.udl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bdk.udl b/src/bdk.udl index dc2a996..2d8061c 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -144,7 +144,7 @@ interface OnlineWallet { [Throws=BdkError] void sync(BdkProgress progress_update, u32? max_address_param); [Throws=BdkError] - string broadcast([ByRef] PartiallySignedBitcoinTransaction psbt); + Transaction broadcast([ByRef] PartiallySignedBitcoinTransaction psbt); }; interface PartiallySignedBitcoinTransaction { From c6c4446092356e5e97e110575d69dcd864e8f93f Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 01:08:50 +0530 Subject: [PATCH 7/8] Use From trait for conversion --- src/lib.rs | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 944197e..3ad57a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -82,19 +82,21 @@ pub enum Transaction { }, } -fn to_transaction(x: &bdk::TransactionDetails) -> Transaction { - let details = TransactionDetails { - fees: x.fee, - id: x.txid.to_string(), - received: x.received, - sent: x.sent, - }; - match x.confirmation_time.clone() { - Some(confirmation) => Transaction::Confirmed { - details, - confirmation, - }, - None => Transaction::Unconfirmed { details }, +impl From<&bdk::TransactionDetails> for Transaction { + fn from(x: &bdk::TransactionDetails) -> Transaction { + let details = TransactionDetails { + fees: x.fee, + id: x.txid.to_string(), + received: x.received, + sent: x.sent, + }; + match x.confirmation_time.clone() { + Some(confirmation) => Transaction::Confirmed { + details, + confirmation, + }, + None => Transaction::Unconfirmed { details }, + } } } @@ -133,7 +135,7 @@ trait OfflineWalletOperations: WalletHolder { fn get_transactions(&self) -> Result, Error> { let transactions = self.get_wallet().list_transactions(true)?; - Ok(transactions.iter().map(to_transaction).collect()) + Ok(transactions.iter().map(Transaction::from).collect()) } } @@ -275,7 +277,7 @@ impl OnlineWallet { ) -> Result { let tx = psbt.internal.lock().unwrap().clone().extract_tx(); self.get_wallet().broadcast(tx)?; - Ok(to_transaction(&psbt.details)) + Ok(Transaction::from(&psbt.details)) } } From 4fd4a7ee6f953f35729d3e78c91aa21f2766f394 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 5 Nov 2021 01:13:45 +0530 Subject: [PATCH 8/8] Use From trait for conversion --- src/lib.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3ad57a2..63505de 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -82,20 +82,25 @@ pub enum Transaction { }, } -impl From<&bdk::TransactionDetails> for Transaction { - fn from(x: &bdk::TransactionDetails) -> Transaction { - let details = TransactionDetails { +impl From<&bdk::TransactionDetails> for TransactionDetails { + fn from(x: &bdk::TransactionDetails) -> TransactionDetails { + TransactionDetails { fees: x.fee, id: x.txid.to_string(), received: x.received, sent: x.sent, - }; + } + } +} + +impl From<&bdk::TransactionDetails> for Transaction { + fn from(x: &bdk::TransactionDetails) -> Transaction { match x.confirmation_time.clone() { Some(confirmation) => Transaction::Confirmed { - details, + details: TransactionDetails::from(x), confirmation, }, - None => Transaction::Unconfirmed { details }, + None => Transaction::Unconfirmed { details: TransactionDetails::from(x) }, } } }