From 3f89cbc663fc4d53abce9f64fbb60b8e8c1a8ba5 Mon Sep 17 00:00:00 2001 From: ardocrat Date: Tue, 23 Jun 2026 12:37:47 +0300 Subject: [PATCH] api: output slatepack file after tor finalization for invoice, update slate state after tor finalization on receive --- api/src/foreign.rs | 12 +++++++++++- api/src/owner.rs | 45 ++++++++++++++++++++++++++++++++++++------- impls/src/tor/arti.rs | 4 +--- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/api/src/foreign.rs b/api/src/foreign.rs index b518c59..df1305c 100644 --- a/api/src/foreign.rs +++ b/api/src/foreign.rs @@ -24,6 +24,7 @@ use crate::libwallet::{ use crate::try_slatepack_sync_workflow; use crate::util::secp::key::SecretKey; use crate::util::Mutex; +use libwallet::api_impl::types::update_tx_slate_state; use std::sync::Arc; /// ForeignAPI Middleware Check callback @@ -381,7 +382,16 @@ where } let res = try_slatepack_sync_workflow(&ret_slate, &a, tc.clone(), None, true); match res { - Ok(s) => Ok(s), + Ok(s) => { + let parent_key_id = w.parent_key_id(); + let _ = update_tx_slate_state( + w, + (&self.keychain_mask).as_ref(), + &parent_key_id, + &s, + ); + Ok(s) + } Err(e) => { error!("Error on sending over Tor: {}", e); Ok(ret_slate) diff --git a/api/src/owner.rs b/api/src/owner.rs index 3316cac..187fcd7 100644 --- a/api/src/owner.rs +++ b/api/src/owner.rs @@ -39,6 +39,8 @@ use crate::util::{from_hex, static_secp_instance, Mutex, ZeroingString}; use grin_wallet_util::OnionV3Address; use libwallet::api_impl::types::update_tx_slate_state; use std::convert::TryFrom; +use std::fs::File; +use std::io::Write; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::{channel, Sender}; use std::sync::Arc; @@ -687,13 +689,6 @@ where Ok(s) => { self.tx_lock_outputs(keychain_mask, &s)?; let ret_slate = self.finalize_tx(keychain_mask, &s)?; - // Update slate state to actual. - { - let mut w_lock = self.wallet_inst.lock(); - let w = w_lock.lc_provider()?.wallet_inst()?; - let parent_key_id = w.parent_key_id(); - let _ = update_tx_slate_state(w, keychain_mask, &parent_key_id, &s); - } if sa.post_tx { let result = self.post_tx(keychain_mask, &ret_slate, sa.fluff); match result { @@ -854,6 +849,7 @@ where Ok(s) => { let parent_key_id = w.parent_key_id(); let _ = update_tx_slate_state(w, keychain_mask, &parent_key_id, &s); + let _ = output_slatepack_file(&self, keychain_mask, &s, &sa.dest); Ok(s) } Err(e) => { @@ -2618,3 +2614,38 @@ macro_rules! doctest_helper_setup_doc_env { let mut $wallet = Arc::new(Mutex::new(wallet)); }; } + +/// Output slatepack message to file. +fn output_slatepack_file( + api: &Owner, + keychain_mask: Option<&SecretKey>, + slate: &Slate, + dest: &str, +) -> Result<(), Error> +where + L: WalletLCProvider<'static, C, K> + 'static, + C: NodeClient + 'static, + K: Keychain + 'static, +{ + let address = match SlatepackAddress::try_from(dest) { + Ok(a) => Some(a), + Err(_) => None, + }; + // encrypt for recipient by default + let recipients = match address.clone() { + Some(a) => vec![a], + None => vec![], + }; + let message = api.create_slatepack_message(keychain_mask, &slate, Some(0), recipients)?; + let tld = api.get_top_level_directory()?; + + // Create a directory to which files will be output. + let slate_dir = format!("{}/{}", tld, "slatepack"); + let _ = std::fs::create_dir_all(slate_dir.clone()); + let out_file_name = format!("{}/{}.{}.slatepack", slate_dir, slate.id, slate.state); + + let mut output = File::create(out_file_name.clone())?; + output.write_all(&message.as_bytes())?; + output.sync_all()?; + Ok(()) +} diff --git a/impls/src/tor/arti.rs b/impls/src/tor/arti.rs index 3b88b2e..e5af8d3 100644 --- a/impls/src/tor/arti.rs +++ b/impls/src/tor/arti.rs @@ -300,9 +300,7 @@ fn init_client( cached_client_config.replace((client.clone(), config.clone())); Ok((client, config)) } - Err(e) => { - Err(e) - }, + Err(e) => Err(e), }; }