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

Commit 7937be2

Browse files
committed
Persist payjoin sessions
1 parent d3e5281 commit 7937be2

6 files changed

Lines changed: 62 additions & 10 deletions

File tree

Cargo.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mutiny-core/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ cbc = { version = "0.1", features = ["alloc"] }
4141
aes = { version = "0.8" }
4242
jwt-compact = { version = "0.8.0-beta.1", features = ["es256k"] }
4343
argon2 = { version = "0.5.0", features = ["password-hash", "alloc"] }
44-
payjoin = { git = "https://github.com/DanGould/rust-payjoin.git", branch = "serverless-payjoin", features = ["v2", "send", "receive", "base64"] }
44+
#payjoin = { git = "https://github.com/DanGould/rust-payjoin.git", branch = "serverless-payjoin", features = ["v2", "send", "receive", "base64"] }
45+
payjoin = { path = "../../payjoin/payjoin", features = ["v2", "send", "receive", "base64"] }
4546
hashbrown = { version = "0.8" }
4647
base64 = "0.13.0"
4748
pbkdf2 = "0.11"

mutiny-core/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ mod node;
3232
pub mod nodemanager;
3333
pub mod nostr;
3434
mod onchain;
35+
mod payjoin;
3536
mod peermanager;
3637
pub mod redshift;
3738
pub mod scorer;
@@ -226,6 +227,7 @@ impl<S: MutinyStorage> MutinyWallet<S> {
226227
self.node_manager =
227228
Arc::new(NodeManager::new(self.config.clone(), self.storage.clone(), None).await?);
228229
NodeManager::start_sync(self.node_manager.clone());
230+
NodeManager::start_payjoins(self.node_manager.clone());
229231

230232
// Redshifts disabled in safe mode
231233
if !self.config.safe_mode {

mutiny-core/src/nodemanager.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::lnurlauth::AuthManager;
22
use crate::logging::LOGGING_KEY;
33
use crate::multiesplora::MultiEsploraClient;
4+
use crate::payjoin::PayjoinStorage;
45
use crate::redshift::{RedshiftManager, RedshiftStatus, RedshiftStorage};
56
use crate::storage::{MutinyStorage, DEVICE_ID_KEY, KEYCHAIN_STORE_KEY, NEED_FULL_SYNC_KEY};
67
use crate::utils::{sleep, spawn};
@@ -844,6 +845,14 @@ impl<S: MutinyStorage> NodeManager<S> {
844845
/// Starts a background tasks to poll payjoin directory to attempt receiving.
845846
pub(crate) fn start_payjoins(nm: Arc<NodeManager<S>>) {
846847
let all = nm.storage.get_payjoins().unwrap_or_default();
848+
for payjoin in all {
849+
let wallet = nm.wallet.clone();
850+
let stop = nm.stop.clone();
851+
utils::spawn(async move {
852+
let pj_txid = Self::receive_payjoin(wallet, stop, payjoin).await.unwrap();
853+
log::info!("Received payjoin txid: {}", pj_txid);
854+
});
855+
}
847856
}
848857

849858
/// Starts a background tasks to poll redshifts until they are ready and then start attempting payments.
@@ -1078,6 +1087,7 @@ impl<S: MutinyStorage> NodeManager<S> {
10781087
.process_res(ohttp_response.as_ref(), context)
10791088
.map_err(|e| anyhow!("parse error {}", e))
10801089
.unwrap();
1090+
self.storage.persist_payjoin(enrolled.clone()).unwrap();
10811091
let pj_uri = enrolled.fallback_target();
10821092
log_debug!(self.logger, "{pj_uri}");
10831093
// run await payjoin task in the background as it'll keep polling the relay

mutiny-core/src/onchain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ impl<S: MutinyStorage> OnChainWallet<S> {
359359

360360
fn try_contributing_inputs(
361361
&self,
362-
payjoin: &mut payjoin::receive::ProvisionalProposal,
362+
payjoin: &mut payjoin::receive::v2::ProvisionalProposal,
363363
) -> Result<(), MutinyError> {
364364
use payjoin::bitcoin::{Amount, OutPoint};
365365

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)