Skip to content

Commit 1357289

Browse files
committed
enhance spend transaction view
1 parent 2b8eb28 commit 1357289

File tree

4 files changed

+195
-166
lines changed

4 files changed

+195
-166
lines changed

src/app/context.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
use std::future::Future;
2+
use std::pin::Pin;
3+
use std::sync::Arc;
4+
5+
use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;
6+
17
use super::menu::Menu;
28
use crate::{app::config, conversion::Converter, daemon::Daemon, revault::Role};
39
use revaultd::config::Config as DaemonConfig;
410
use revaultd::revault_tx::miniscript::DescriptorPublicKey;
511

612
use revault_hwi::{app::revault::RevaultHWI, HWIError};
7-
use std::future::Future;
8-
use std::pin::Pin;
9-
use std::sync::Arc;
1013

1114
pub type HardwareWallet =
1215
Box<dyn Future<Output = Result<Box<dyn RevaultHWI + Send>, HWIError>> + Send + Sync>;
@@ -82,6 +85,34 @@ impl Context {
8285
})
8386
.collect()
8487
}
88+
89+
pub fn user_signed(&self, psbt: &Psbt) -> bool {
90+
let man_fp = &self
91+
.config
92+
.daemon
93+
.manager_config
94+
.as_ref()
95+
.map(|key| key.xpub.fingerprint());
96+
let stk_fp = &self
97+
.config
98+
.daemon
99+
.stakeholder_config
100+
.as_ref()
101+
.map(|key| key.xpub.fingerprint());
102+
if let Some(input) = psbt.inputs.first() {
103+
input.partial_sigs.keys().any(|key| {
104+
input
105+
.bip32_derivation
106+
.get(key)
107+
.map(|(fingerprint, _)| {
108+
Some(*fingerprint) == *man_fp || Some(*fingerprint) == *stk_fp
109+
})
110+
.unwrap_or(false)
111+
})
112+
} else {
113+
false
114+
}
115+
}
85116
}
86117

87118
pub struct ConfigContext {

src/app/state/spend_transaction.rs

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use bitcoin::util::{
2-
bip32::{ExtendedPubKey, Fingerprint},
3-
psbt::PartiallySignedTransaction as Psbt,
4-
};
1+
use bitcoin::util::{bip32::Fingerprint, psbt::PartiallySignedTransaction as Psbt};
52
use std::convert::From;
63

74
use bitcoin::OutPoint;
@@ -52,12 +49,7 @@ impl SpendTransactionState {
5249
change_index: None,
5350
action: SpendTransactionAction::new(
5451
ctx.managers_threshold,
55-
&ctx.config
56-
.daemon
57-
.manager_config
58-
.as_ref()
59-
.expect("User is a manager")
60-
.xpub,
52+
ctx.user_signed(&psbt),
6153
&ctx.managers_xpubs(),
6254
&psbt,
6355
),
@@ -142,6 +134,7 @@ impl State for SpendTransactionState {
142134
self.action.view(ctx, &self.psbt),
143135
self.warning.as_ref(),
144136
show_delete_button,
137+
ctx.user_signed(&self.psbt),
145138
)
146139
}
147140

@@ -185,7 +178,7 @@ pub enum SpendTransactionAction {
185178
impl SpendTransactionAction {
186179
fn new(
187180
managers_threshold: usize,
188-
user_manager_xpub: &ExtendedPubKey,
181+
user_signed: bool,
189182
managers_xpubs: &Vec<DescriptorPublicKey>,
190183
psbt: &Psbt,
191184
) -> Self {
@@ -198,13 +191,7 @@ impl SpendTransactionAction {
198191
warning: None,
199192
view: SpendTransactionBroadcastView::new(),
200193
};
201-
} else if input.partial_sigs.keys().any(|key| {
202-
input
203-
.bip32_derivation
204-
.get(key)
205-
.map(|(fingerprint, _)| user_manager_xpub.fingerprint() == *fingerprint)
206-
.unwrap_or(false)
207-
}) {
194+
} else if user_signed {
208195
return Self::SharePsbt {
209196
psbt_input: form::Value::default(),
210197
processing: false,
@@ -277,12 +264,7 @@ impl SpendTransactionAction {
277264
SpendTxMessage::UnselectDelete => {
278265
*self = Self::new(
279266
ctx.managers_threshold,
280-
&ctx.config
281-
.daemon
282-
.manager_config
283-
.as_ref()
284-
.expect("User is a manager")
285-
.xpub,
267+
ctx.user_signed(psbt),
286268
&ctx.managers_xpubs(),
287269
psbt,
288270
);
@@ -320,12 +302,7 @@ impl SpendTransactionAction {
320302
*psbt = signer.target.spend_tx.clone();
321303
*self = Self::new(
322304
ctx.managers_threshold,
323-
&ctx.config
324-
.daemon
325-
.manager_config
326-
.as_ref()
327-
.expect("User is a manager")
328-
.xpub,
305+
true,
329306
&ctx.managers_xpubs(),
330307
psbt,
331308
);
@@ -599,7 +576,7 @@ mod tests {
599576
let mut psbt = Psbt::from_str("cHNidP8BALQCAAAAAc1946BSKWX5trghNlBq/IIYScLPYqr9Bqs2LfqOYuqcAAAAAAAIAAAAA+BAAAAAAAAAIgAgCOQxrx6W/t0dSZikMBNYG2Yyam/3LIoVrAy6e8ZDUAyA8PoCAAAAACIAIMuwqNTx88KHHtIR0EeURzEu9pUmbnUxd22KzYKi25A2CBH6AgAAAAAiACB18mkXdMgWd4MYRrAoIgDiiLLFlxC1j3Qxg9SSVQfbxQAAAAAAAQEruFn1BQAAAAAiACBI6M9l6zams92tyCK/4gbWyNfJMJzgoOv34L0X7GTovAEDBAEAAAABBWEhAgKTOrEDfq0KpKeFjG1J1nBeH7O8X2awCRive58A7NUmrFGHZHapFHKpXyKvmhuuuFL5qVJy+MIdmPJkiKxrdqkUtsmtuJyMk3Jsg+KhtdlHidd7lWGIrGyTUodnWLJoIgYCApM6sQN+rQqkp4WMbUnWcF4fs7xfZrAJGK97nwDs1SYIJR1gCQAAAAAAIgICUHL04HZXilyJ1B118e1Smr+S8c1qtja46Le7DzMCaUMI+93szQAAAAAAACICAlgt7b9E9GVk5djNsGdTbWDr40zR0YAc/1G7+desKJtDCNZ9f+kAAAAAIgIDRwTey1W1qoj/0e9dBjZiSMExThllURNv8U6ri7pKSQ4IcqlfIgAAAAAA").unwrap();
600577
let user_manager_xpub = ExtendedPubKey::from_str("xpub6CZFHPW1GiB8YgV7zGpeQDB6mMHZYPQyUaHrM1nMvKMgLxwok4xCtnzjuxQ3p1LHJUkz5i1Y7bRy5fmGrdg8UBVb39XdXNtWWd2wTsNd7T9").unwrap();
601578

602-
let action = SpendTransactionAction::new(2, &user_manager_xpub, &Vec::new(), &psbt);
579+
let action = SpendTransactionAction::new(2, false, &Vec::new(), &psbt);
603580
assert!(matches!(action, SpendTransactionAction::Sign { .. }));
604581

605582
psbt.inputs[0].partial_sigs.insert(
@@ -610,13 +587,13 @@ mod tests {
610587
"304402202f5eec50f34929e4bd8f6b7e81426795b0cd3608a4dad53ffab3e7af38ab627a02204ff61d9df2432ff3272c17d9baee1ec6b6dcb72b198be7f4ef843d5d47010a0401".as_bytes().to_vec(),
611588
);
612589

613-
let action = SpendTransactionAction::new(2, &user_manager_xpub, &Vec::new(), &psbt);
590+
let action = SpendTransactionAction::new(2, true, &Vec::new(), &psbt);
614591
assert!(matches!(action, SpendTransactionAction::SharePsbt { .. }));
615592

616-
let action = SpendTransactionAction::new(1, &user_manager_xpub, &Vec::new(), &psbt);
593+
let action = SpendTransactionAction::new(1, true, &Vec::new(), &psbt);
617594
assert!(matches!(action, SpendTransactionAction::Broadcast { .. }));
618595

619-
let action = SpendTransactionAction::new(0, &user_manager_xpub, &Vec::new(), &psbt);
596+
let action = SpendTransactionAction::new(0, true, &Vec::new(), &psbt);
620597
assert!(matches!(action, SpendTransactionAction::Broadcast { .. }));
621598
}
622599
}

src/app/view/manager.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -829,9 +829,9 @@ pub fn spend_tx_with_feerate_view<'a, T: 'a>(
829829
),
830830
)
831831
.push(
832-
Row::new()
833-
.push(col_input.width(Length::FillPortion(1)))
834-
.push(right_column.width(Length::FillPortion(1)))
832+
Column::new()
833+
.push(col_input.width(Length::Fill))
834+
.push(right_column.width(Length::Fill))
835835
.spacing(20),
836836
)
837837
.spacing(20),

0 commit comments

Comments
 (0)