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

Commit fdd622c

Browse files
committed
Persist payjoin sessions
1 parent 6336409 commit fdd622c

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

mutiny-core/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ mod node;
2828
pub mod nodemanager;
2929
pub mod nostr;
3030
mod onchain;
31+
mod payjoin;
3132
mod peermanager;
3233
pub mod redshift;
3334
pub mod scorer;
@@ -253,6 +254,7 @@ impl<S: MutinyStorage> MutinyWallet<S> {
253254
.await?,
254255
);
255256
NodeManager::start_sync(self.node_manager.clone());
257+
NodeManager::resume_payjoins(self.node_manager.clone());
256258

257259
// Redshifts disabled in safe mode
258260
if !self.config.safe_mode {

mutiny-core/src/nodemanager.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::lnurlauth::AuthManager;
22
use crate::logging::LOGGING_KEY;
3+
use crate::payjoin::PayjoinStorage;
34
use crate::redshift::{RedshiftManager, RedshiftStatus, RedshiftStorage};
45
use crate::storage::{MutinyStorage, DEVICE_ID_KEY, KEYCHAIN_STORE_KEY, NEED_FULL_SYNC_KEY};
56
use crate::utils::{sleep, spawn};
@@ -802,6 +803,19 @@ impl<S: MutinyStorage> NodeManager<S> {
802803
Ok(())
803804
}
804805

806+
/// Starts a background task to poll payjoin sessions to attempt receiving.
807+
pub(crate) fn resume_payjoins(nm: Arc<NodeManager<S>>) {
808+
let all = nm.storage.get_payjoins().unwrap_or_default();
809+
for payjoin in all {
810+
let wallet = nm.wallet.clone();
811+
let stop = nm.stop.clone();
812+
utils::spawn(async move {
813+
let pj_txid = Self::receive_payjoin(wallet, stop, payjoin).await.unwrap();
814+
log::info!("Received payjoin txid: {}", pj_txid);
815+
});
816+
}
817+
}
818+
805819
/// Starts a background tasks to poll redshifts until they are ready and then start attempting payments.
806820
///
807821
/// This function will first find redshifts that are in the [RedshiftStatus::AttemptingPayments] state and start attempting payments
@@ -1043,6 +1057,7 @@ impl<S: MutinyStorage> NodeManager<S> {
10431057
.process_res(ohttp_response.as_ref(), context)
10441058
.map_err(|e| anyhow!("parse error {}", e))
10451059
.unwrap();
1060+
self.storage.persist_payjoin(enrolled.clone()).unwrap();
10461061
let pj_uri = enrolled.fallback_target();
10471062
log_debug!(self.logger, "{pj_uri}");
10481063
// run await payjoin task in the background as it'll keep polling the relay

mutiny-core/src/payjoin.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use crate::error::MutinyError;
2+
use crate::storage::MutinyStorage;
3+
use bitcoin::hashes::hex::ToHex;
4+
use payjoin::receive::v2::Enrolled;
5+
use std::collections::HashMap;
6+
7+
// #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8+
// pub struct Session {
9+
// pub id: [u8; 16],
10+
// pub enrolled: Enrolled,
11+
// }
12+
13+
pub trait PayjoinStorage {
14+
fn get_payjoin(&self, id: &[u8; 33]) -> Result<Option<Enrolled>, MutinyError>;
15+
fn get_payjoins(&self) -> Result<Vec<Enrolled>, MutinyError>;
16+
fn persist_payjoin(&self, session: Enrolled) -> Result<(), MutinyError>;
17+
}
18+
19+
const PAYJOIN_KEY_PREFIX: &str = "payjoin/";
20+
21+
fn get_payjoin_key(id: &[u8; 33]) -> String {
22+
format!("{PAYJOIN_KEY_PREFIX}{}", id.to_hex())
23+
}
24+
25+
impl<S: MutinyStorage> PayjoinStorage for S {
26+
fn get_payjoin(&self, id: &[u8; 33]) -> Result<Option<Enrolled>, MutinyError> {
27+
let sessions = self.get_data(get_payjoin_key(id))?;
28+
Ok(sessions)
29+
}
30+
31+
fn get_payjoins(&self) -> Result<Vec<Enrolled>, MutinyError> {
32+
let map: HashMap<String, Enrolled> = self.scan(PAYJOIN_KEY_PREFIX, None)?;
33+
Ok(map.values().map(|v| v.to_owned()).collect())
34+
}
35+
36+
fn persist_payjoin(&self, session: Enrolled) -> Result<(), MutinyError> {
37+
self.set_data(get_payjoin_key(&session.pubkey()), session, None)
38+
}
39+
}

0 commit comments

Comments
 (0)