Skip to content

Commit c2192e4

Browse files
committed
Fetch and redeem provider keys using tokens
1 parent 759411c commit c2192e4

File tree

21 files changed

+1212
-438
lines changed

21 files changed

+1212
-438
lines changed

liana-gui/src/app/settings.rs

+19
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,31 @@ impl WalletSetting {
8989
}
9090
map
9191
}
92+
93+
pub fn provider_keys(&self) -> HashMap<Fingerprint, ProviderKey> {
94+
let mut map = HashMap::new();
95+
for (fingerprint, provider_key) in self
96+
.keys
97+
.iter()
98+
.filter_map(|k| k.provider_key.as_ref().map(|pk| (k.master_fingerprint, pk)))
99+
{
100+
map.insert(fingerprint, provider_key.clone());
101+
}
102+
map
103+
}
104+
}
105+
106+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
107+
pub struct ProviderKey {
108+
pub uuid: String,
109+
pub token: String,
92110
}
93111

94112
#[derive(Debug, Clone, Deserialize, Serialize)]
95113
pub struct KeySetting {
96114
pub name: String,
97115
pub master_fingerprint: Fingerprint,
116+
pub provider_key: Option<ProviderKey>,
98117
}
99118

100119
#[derive(PartialEq, Eq, Debug, Clone)]

liana-gui/src/app/state/settings/wallet.rs

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ impl State for WalletSettingsState {
8282
self.warning.as_ref(),
8383
&self.descriptor,
8484
&self.keys_aliases,
85+
&self.wallet.provider_keys,
8586
self.processing,
8687
self.updated,
8788
);
@@ -389,6 +390,7 @@ async fn update_keys_aliases(
389390
.map(|(master_fingerprint, name)| settings::KeySetting {
390391
master_fingerprint: *master_fingerprint,
391392
name: name.clone(),
393+
provider_key: wallet.provider_keys.get(master_fingerprint).cloned(),
392394
})
393395
.collect();
394396
}

liana-gui/src/app/view/settings.rs

+25-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::collections::HashSet;
1+
use std::collections::{HashMap, HashSet};
22
use std::str::FromStr;
33

44
use iced::{
@@ -27,6 +27,7 @@ use crate::{
2727
cache::Cache,
2828
error::Error,
2929
menu::Menu,
30+
settings::ProviderKey,
3031
view::{hw, warning::warn},
3132
},
3233
hw::HardwareWallet,
@@ -849,6 +850,7 @@ pub fn wallet_settings<'a>(
849850
warning: Option<&Error>,
850851
descriptor: &'a LianaDescriptor,
851852
keys_aliases: &'a [(Fingerprint, form::Value<String>)],
853+
provider_keys: &'a HashMap<Fingerprint, ProviderKey>,
852854
processing: bool,
853855
updated: bool,
854856
) -> Element<'a, Message> {
@@ -943,16 +945,22 @@ pub fn wallet_settings<'a>(
943945
.push(header)
944946
.push(descr)
945947
.push(
946-
card::simple(display_policy(descriptor.policy(), keys_aliases)).width(Length::Fill),
948+
card::simple(display_policy(
949+
descriptor.policy(),
950+
keys_aliases,
951+
provider_keys,
952+
))
953+
.width(Length::Fill),
947954
)
948955
.push(aliases),
949956
)
950957
}
951958

952-
fn display_policy(
959+
fn display_policy<'a>(
953960
policy: LianaPolicy,
954-
keys_aliases: &[(Fingerprint, form::Value<String>)],
955-
) -> Element<'_, Message> {
961+
keys_aliases: &'a [(Fingerprint, form::Value<String>)],
962+
provider_keys: &'a HashMap<Fingerprint, ProviderKey>,
963+
) -> Element<'a, Message> {
956964
let (primary_threshold, primary_keys) = policy.primary_path().thresh_origins();
957965
let recovery_paths = policy.recovery_paths();
958966

@@ -1068,7 +1076,18 @@ fn display_policy(
10681076
))
10691077
.bold(),
10701078
)
1071-
.push(text(format!("(Recovery path #{})", i + 1))),
1079+
.push(text(
1080+
// If max timelock and all keys are from provider, then it's a safety net path.
1081+
if *sequence == u16::MAX
1082+
&& recovery_keys
1083+
.iter()
1084+
.all(|fg| provider_keys.contains_key(fg))
1085+
{
1086+
"(Safety Net path)".to_string()
1087+
} else {
1088+
format!("(Recovery path #{})", i + 1)
1089+
},
1090+
)),
10721091
);
10731092
}
10741093
Column::new()

liana-gui/src/app/wallet.rs

+13
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ pub fn wallet_name(main_descriptor: &LianaDescriptor) -> String {
3131
pub struct Wallet {
3232
pub name: String,
3333
pub main_descriptor: LianaDescriptor,
34+
// TODO: We could replace these two fields with `keys: HashMap<Fingerprint, settings::KeySetting>`.
3435
pub keys_aliases: HashMap<Fingerprint, String>,
36+
pub provider_keys: HashMap<Fingerprint, settings::ProviderKey>,
3537
pub hardware_wallets: Vec<HardwareWalletConfig>,
3638
pub signer: Option<Arc<Signer>>,
3739
}
@@ -42,6 +44,7 @@ impl Wallet {
4244
name: wallet_name(&main_descriptor),
4345
main_descriptor,
4446
keys_aliases: HashMap::new(),
47+
provider_keys: HashMap::new(),
4548
hardware_wallets: Vec::new(),
4649
signer: None,
4750
}
@@ -57,6 +60,14 @@ impl Wallet {
5760
self
5861
}
5962

63+
pub fn with_provider_keys(
64+
mut self,
65+
provider_keys: HashMap<Fingerprint, settings::ProviderKey>,
66+
) -> Self {
67+
self.provider_keys = provider_keys;
68+
self
69+
}
70+
6071
pub fn with_hardware_wallets(mut self, hardware_wallets: Vec<HardwareWalletConfig>) -> Self {
6172
self.hardware_wallets = hardware_wallets;
6273
self
@@ -101,6 +112,7 @@ impl Wallet {
101112
self.with_name(wallet_setting.name.clone())
102113
.with_hardware_wallets(wallet_setting.hardware_wallets.clone())
103114
.with_key_aliases(wallet_setting.keys_aliases())
115+
.with_provider_keys(wallet_setting.provider_keys())
104116
} else {
105117
self
106118
}
@@ -117,6 +129,7 @@ impl Wallet {
117129
.map(|(master_fingerprint, name)| settings::KeySetting {
118130
name,
119131
master_fingerprint,
132+
provider_key: self.provider_keys.get(&master_fingerprint).cloned(),
120133
})
121134
.collect(),
122135
descriptor_checksum: self.descriptor_checksum(),

0 commit comments

Comments
 (0)