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

Commit 3606842

Browse files
authored
Merge pull request #1128 from MutinyWallet/lots-o-tests
Tests for lots new nostr functionality
2 parents 3d47049 + 2d5a078 commit 3606842

5 files changed

Lines changed: 659 additions & 94 deletions

File tree

mutiny-core/src/lib.rs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ 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::nostr::primal::{PrimalApi, PrimalClient};
4950
use crate::storage::{
5051
get_payment_hash_from_key, list_payment_info, persist_payment_info, update_nostr_contact_list,
5152
IndexItem, MutinyStorage, DEVICE_ID_KEY, EXPECTED_NETWORK_KEY, NEED_FULL_SYNC_KEY,
@@ -109,7 +110,7 @@ use moksha_core::primitives::{
109110
PostMeltQuoteBolt11Response,
110111
};
111112
use moksha_core::token::TokenV3;
112-
use nostr_sdk::{NostrSigner, RelayPoolNotification};
113+
use nostr_sdk::{Client, NostrSigner, RelayPoolNotification};
113114
use reqwest::multipart::{Form, Part};
114115
use serde::{Deserialize, Serialize};
115116
use serde_json::Value;
@@ -848,15 +849,28 @@ impl<S: MutinyStorage> MutinyWalletBuilder<S> {
848849
// start syncing node manager
849850
NodeManager::start_sync(node_manager.clone());
850851

852+
let primal_client = PrimalClient::new(
853+
config
854+
.primal_url
855+
.clone()
856+
.unwrap_or("https://primal-cache.mutinywallet.com/api".to_string()),
857+
);
858+
859+
let client = Client::default();
860+
851861
// create nostr manager
852-
let nostr = Arc::new(NostrManager::from_mnemonic(
853-
self.xprivkey,
854-
self.nostr_key_source,
855-
self.storage.clone(),
856-
config.primal_url.clone(),
857-
logger.clone(),
858-
stop.clone(),
859-
)?);
862+
let nostr = Arc::new(
863+
NostrManager::from_mnemonic(
864+
self.xprivkey,
865+
self.nostr_key_source,
866+
self.storage.clone(),
867+
primal_client,
868+
client,
869+
logger.clone(),
870+
stop.clone(),
871+
)
872+
.await?,
873+
);
860874

861875
// connect to relays when not in tests
862876
#[cfg(not(test))]
@@ -1099,7 +1113,7 @@ pub struct MutinyWallet<S: MutinyStorage> {
10991113
config: MutinyWalletConfig,
11001114
pub(crate) storage: S,
11011115
pub node_manager: Arc<NodeManager<S>>,
1102-
pub nostr: Arc<NostrManager<S>>,
1116+
pub nostr: Arc<NostrManager<S, PrimalClient, nostr_sdk::Client>>,
11031117
pub federation_storage: Arc<RwLock<FederationStorage>>,
11041118
pub(crate) federations: Arc<RwLock<HashMap<FederationId, Arc<FederationClient<S>>>>>,
11051119
lnurl_client: Arc<LnUrlClient>,
@@ -1172,7 +1186,7 @@ impl<S: MutinyStorage> MutinyWallet<S> {
11721186
log_warn!(logger, "Failed to clear invalid NWC invoices: {e}");
11731187
}
11741188

1175-
let client = &nostr.client;
1189+
let client = nostr_sdk::Client::default();
11761190

11771191
client
11781192
.add_relays(nostr.get_relays())

mutiny-core/src/nostr/client.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
use nostr::{Event, EventBuilder, EventId, Filter, PublicKey, SubscriptionId};
2+
use nostr_sdk::client::Error;
3+
use nostr_sdk::{NostrSigner, SubscribeAutoCloseOptions};
4+
use std::time::Duration;
5+
6+
#[cfg_attr(test, mockall::automock)]
7+
pub trait NostrClient {
8+
async fn add_relays(&self, relays: Vec<String>) -> nostr::Result<(), Error>;
9+
async fn add_relay(&self, relay: &str) -> nostr::Result<bool, Error>;
10+
async fn connect_relay(&self, relay: &str) -> nostr::Result<(), Error>;
11+
async fn connect(&self);
12+
async fn disconnect(&self) -> nostr::Result<(), Error>;
13+
14+
async fn sign_event_builder(&self, builder: EventBuilder) -> nostr::Result<Event, Error>;
15+
async fn send_event_builder(&self, builder: EventBuilder) -> nostr::Result<EventId, Error>;
16+
async fn send_event(&self, event: Event) -> nostr::Result<EventId, Error>;
17+
async fn send_event_to(&self, urls: Vec<String>, event: Event)
18+
-> nostr::Result<EventId, Error>;
19+
async fn send_direct_msg(
20+
&self,
21+
receiver: PublicKey,
22+
msg: String,
23+
reply_to: Option<EventId>,
24+
) -> nostr::Result<EventId, Error>;
25+
26+
async fn subscribe(
27+
&self,
28+
filters: Vec<Filter>,
29+
opts: Option<SubscribeAutoCloseOptions>,
30+
) -> SubscriptionId;
31+
async fn get_events_of(
32+
&self,
33+
filters: Vec<Filter>,
34+
timeout: Option<Duration>,
35+
) -> Result<Vec<Event>, Error>;
36+
37+
async fn set_signer(&self, signer: Option<NostrSigner>);
38+
}
39+
40+
impl NostrClient for nostr_sdk::Client {
41+
async fn add_relays(&self, relays: Vec<String>) -> nostr::Result<(), Error> {
42+
self.add_relays(relays).await
43+
}
44+
45+
async fn add_relay(&self, relay: &str) -> nostr::Result<bool, Error> {
46+
self.add_relay(relay).await
47+
}
48+
49+
async fn connect_relay(&self, relay: &str) -> nostr::Result<(), Error> {
50+
self.connect_relay(relay).await
51+
}
52+
53+
async fn connect(&self) {
54+
self.connect().await
55+
}
56+
57+
async fn disconnect(&self) -> nostr::Result<(), Error> {
58+
self.disconnect().await
59+
}
60+
61+
async fn sign_event_builder(&self, builder: EventBuilder) -> nostr::Result<Event, Error> {
62+
self.sign_event_builder(builder).await
63+
}
64+
65+
async fn send_event_builder(&self, builder: EventBuilder) -> nostr::Result<EventId, Error> {
66+
self.send_event_builder(builder).await
67+
}
68+
69+
async fn send_event(&self, event: Event) -> nostr::Result<EventId, Error> {
70+
self.send_event(event).await
71+
}
72+
73+
async fn send_event_to(
74+
&self,
75+
urls: Vec<String>,
76+
event: Event,
77+
) -> nostr::Result<EventId, Error> {
78+
self.send_event_to(urls, event).await
79+
}
80+
81+
async fn send_direct_msg(
82+
&self,
83+
receiver: PublicKey,
84+
msg: String,
85+
reply_to: Option<EventId>,
86+
) -> nostr::Result<EventId, Error> {
87+
self.send_direct_msg(receiver, msg, reply_to).await
88+
}
89+
90+
async fn subscribe(
91+
&self,
92+
filters: Vec<Filter>,
93+
opts: Option<SubscribeAutoCloseOptions>,
94+
) -> SubscriptionId {
95+
self.subscribe(filters, opts).await
96+
}
97+
98+
async fn get_events_of(
99+
&self,
100+
filters: Vec<Filter>,
101+
timeout: Option<Duration>,
102+
) -> Result<Vec<Event>, Error> {
103+
self.get_events_of(filters, timeout).await
104+
}
105+
106+
async fn set_signer(&self, signer: Option<NostrSigner>) {
107+
self.set_signer(signer).await
108+
}
109+
}

0 commit comments

Comments
 (0)