Skip to content
This repository was archived by the owner on Feb 3, 2025. It is now read-only.

Commit 1400c87

Browse files
Merge pull request #1168 from MutinyWallet/federation-meta-parsing
More federation metadata parsing
2 parents 75e295d + f85e8d4 commit 1400c87

File tree

2 files changed

+95
-32
lines changed

2 files changed

+95
-32
lines changed

mutiny-core/src/federation.rs

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,30 @@ pub struct FederationIdentity {
144144
pub federation_expiry_timestamp: Option<String>,
145145
pub welcome_message: Option<String>,
146146
pub gateway_fees: Option<GatewayFees>,
147+
// undocumented parameters that fedi uses: https://meta.dev.fedibtc.com/meta.json
148+
pub default_currency: Option<String>,
149+
pub federation_icon_url: Option<String>,
150+
pub max_balance_msats: Option<u32>,
151+
pub max_invoice_msats: Option<u32>,
152+
pub meta_external_url: Option<String>,
153+
pub onchain_deposits_disabled: Option<bool>,
154+
pub preview_message: Option<String>,
155+
pub sites: Option<Site>,
156+
pub public: Option<bool>,
157+
pub tos_url: Option<String>,
158+
pub popup_end_timestamp: Option<u32>,
159+
pub popup_countdown_message: Option<String>,
160+
pub invite_codes_disabled: Option<bool>,
161+
pub stability_pool_disabled: Option<bool>,
162+
pub social_recovery_disabled: Option<bool>,
163+
}
164+
165+
#[derive(Default, Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
166+
pub struct Site {
167+
pub id: Option<String>,
168+
pub url: Option<String>,
169+
pub title: Option<String>,
170+
pub image_url: Option<String>,
147171
}
148172

149173
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Default)]
@@ -658,18 +682,12 @@ impl<S: MutinyStorage> FederationClient<S> {
658682

659683
pub async fn get_mutiny_federation_identity(&self) -> FederationIdentity {
660684
let gateway_fees = self.gateway_fee().await.ok();
661-
662-
FederationIdentity {
663-
uuid: self.uuid.clone(),
664-
federation_id: self.fedimint_client.federation_id(),
665-
invite_code: self.invite_code.clone(),
666-
federation_name: self.fedimint_client.get_meta("federation_name"),
667-
federation_expiry_timestamp: self
668-
.fedimint_client
669-
.get_meta("federation_expiry_timestamp"),
670-
welcome_message: self.fedimint_client.get_meta("welcome_message"),
685+
get_federation_identity(
686+
self.uuid.clone(),
687+
self.fedimint_client.clone(),
688+
self.invite_code.clone(),
671689
gateway_fees,
672-
}
690+
)
673691
}
674692

675693
// delete_fedimint_storage is not suggested at the moment due to the lack of easy restores
@@ -679,6 +697,56 @@ impl<S: MutinyStorage> FederationClient<S> {
679697
}
680698
}
681699

700+
pub(crate) fn get_federation_identity(
701+
uuid: String,
702+
fedimint_client: ClientHandleArc,
703+
invite_code: InviteCode,
704+
gateway_fees: Option<GatewayFees>,
705+
) -> FederationIdentity {
706+
FederationIdentity {
707+
uuid: uuid.clone(),
708+
federation_id: fedimint_client.federation_id(),
709+
invite_code: invite_code.clone(),
710+
federation_name: fedimint_client.get_meta("federation_name"),
711+
federation_expiry_timestamp: fedimint_client.get_meta("federation_expiry_timestamp"),
712+
welcome_message: fedimint_client.get_meta("welcome_message"),
713+
gateway_fees,
714+
default_currency: fedimint_client.get_meta("default_currency"),
715+
federation_icon_url: fedimint_client.get_meta("federation_icon_url"),
716+
max_balance_msats: fedimint_client
717+
.get_meta("max_balance_msats")
718+
.map(|v| v.parse().unwrap_or(0)),
719+
max_invoice_msats: fedimint_client
720+
.get_meta("max_invoice_msats")
721+
.map(|v| v.parse().unwrap_or(0)),
722+
meta_external_url: fedimint_client.get_meta("meta_external_url"),
723+
onchain_deposits_disabled: fedimint_client
724+
.get_meta("onchain_deposits_disabled")
725+
.map(|v| v.parse().unwrap_or(false)),
726+
preview_message: fedimint_client.get_meta("preview_message"),
727+
sites: fedimint_client
728+
.get_meta("sites")
729+
.map(|v| serde_json::from_str(&v).unwrap_or_default()),
730+
public: fedimint_client
731+
.get_meta("public")
732+
.map(|v| v.parse().unwrap_or(false)),
733+
tos_url: fedimint_client.get_meta("tos_url"),
734+
popup_end_timestamp: fedimint_client
735+
.get_meta("popup_end_timestamp")
736+
.map(|v| v.parse().unwrap_or(0)),
737+
popup_countdown_message: fedimint_client.get_meta("popup_countdown_message"),
738+
invite_codes_disabled: fedimint_client
739+
.get_meta("invite_codes_disabled")
740+
.map(|v| v.parse().unwrap_or(false)),
741+
stability_pool_disabled: fedimint_client
742+
.get_meta("stability_pool_disabled")
743+
.map(|v| v.parse().unwrap_or(false)),
744+
social_recovery_disabled: fedimint_client
745+
.get_meta("social_recovery_disabled")
746+
.map(|v| v.parse().unwrap_or(false)),
747+
}
748+
}
749+
682750
fn subscribe_operation_ext<S: MutinyStorage>(
683751
entry: OperationLogEntry,
684752
hash: [u8; 32],

mutiny-core/src/lib.rs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,6 @@ mod test_utils;
4646
pub use crate::gossip::{GOSSIP_SYNC_TIME_KEY, NETWORK_GRAPH_KEY, PROB_SCORER_KEY};
4747
pub use crate::keymanager::generate_seed;
4848
pub use crate::ldkstorage::{CHANNEL_CLOSURE_PREFIX, CHANNEL_MANAGER_KEY, MONITORS_PREFIX_KEY};
49-
use crate::storage::{
50-
get_payment_hash_from_key, list_payment_info, persist_payment_info, update_nostr_contact_list,
51-
IndexItem, MutinyStorage, DEVICE_ID_KEY, EXPECTED_NETWORK_KEY, NEED_FULL_SYNC_KEY,
52-
ONCHAIN_PREFIX, PAYMENT_INBOUND_PREFIX_KEY, PAYMENT_OUTBOUND_PREFIX_KEY,
53-
SUBSCRIPTION_TIMESTAMP,
54-
};
5549
use crate::utils::spawn;
5650
use crate::{auth::MutinyAuthClient, hermes::HermesClient, logging::MutinyLogger};
5751
use crate::{blindauth::BlindAuthClient, cashu::CashuHttpClient};
@@ -60,6 +54,15 @@ use crate::{
6054
event::{HTLCStatus, MillisatAmount, PaymentInfo},
6155
onchain::FULL_SYNC_STOP_GAP,
6256
};
57+
use crate::{
58+
federation::get_federation_identity,
59+
storage::{
60+
get_payment_hash_from_key, list_payment_info, persist_payment_info,
61+
update_nostr_contact_list, IndexItem, MutinyStorage, DEVICE_ID_KEY, EXPECTED_NETWORK_KEY,
62+
NEED_FULL_SYNC_KEY, ONCHAIN_PREFIX, PAYMENT_INBOUND_PREFIX_KEY,
63+
PAYMENT_OUTBOUND_PREFIX_KEY, SUBSCRIPTION_TIMESTAMP,
64+
},
65+
};
6366
use crate::{
6467
federation::{
6568
FederationClient, FederationIdentity, FederationIndex, FederationStorage, GatewayFees,
@@ -3191,28 +3194,20 @@ pub(crate) async fn create_new_federation<S: MutinyStorage>(
31913194
storage.insert_federations(federation_mutex.clone()).await?;
31923195

31933196
let federation_id = new_federation.fedimint_client.federation_id();
3194-
let federation_name = new_federation.fedimint_client.get_meta("federation_name");
3195-
let federation_expiry_timestamp = new_federation
3196-
.fedimint_client
3197-
.get_meta("federation_expiry_timestamp");
3198-
let welcome_message = new_federation.fedimint_client.get_meta("welcome_message");
31993197
let gateway_fees = new_federation.gateway_fee().await.ok();
32003198

3199+
let new_federation_identity = get_federation_identity(
3200+
next_federation_uuid.clone(),
3201+
new_federation.fedimint_client.clone(),
3202+
federation_code.clone(),
3203+
gateway_fees,
3204+
);
3205+
32013206
federations
32023207
.write()
32033208
.await
32043209
.insert(federation_id, Arc::new(new_federation));
32053210

3206-
let new_federation_identity = FederationIdentity {
3207-
uuid: next_federation_uuid.clone(),
3208-
federation_id,
3209-
invite_code: federation_code,
3210-
federation_name,
3211-
federation_expiry_timestamp,
3212-
welcome_message,
3213-
gateway_fees,
3214-
};
3215-
32163211
// change the federation with hermes, if available
32173212
if let Some(h) = hermes_client {
32183213
match h

0 commit comments

Comments
 (0)