diff --git a/src/backend_task/platform_info.rs b/src/backend_task/platform_info.rs
index 38014eb87..6cbf246f0 100644
--- a/src/backend_task/platform_info.rs
+++ b/src/backend_task/platform_info.rs
@@ -367,7 +367,16 @@ impl AppContext {
PlatformInfoTaskRequestType::CurrentEpochInfo => {
match ExtendedEpochInfo::fetch_current(&sdk).await {
Ok(epoch_info) => {
- let formatted = format_extended_epoch_info(epoch_info, self.network, true);
+ // Cache the fee multiplier for UI fee estimation
+ let fee_multiplier = epoch_info.fee_multiplier_permille();
+ self.set_fee_multiplier_permille(fee_multiplier);
+
+ let mut formatted =
+ format_extended_epoch_info(epoch_info, self.network, true);
+ formatted.push_str(&format!(
+ "\n\n(Fee multiplier cache updated: {}x)",
+ fee_multiplier as f64 / 1000.0
+ ));
Ok(BackendTaskSuccessResult::PlatformInfo(
PlatformInfoTaskResult::TextResult(formatted),
))
diff --git a/src/context.rs b/src/context.rs
index b79984111..cb96b06d6 100644
--- a/src/context.rs
+++ b/src/context.rs
@@ -6,6 +6,7 @@ use crate::context_provider::Provider as RpcProvider;
use crate::context_provider_spv::SpvProvider;
use crate::database::Database;
use crate::model::contested_name::ContestedName;
+use crate::model::fee_estimation::PlatformFeeEstimator;
use crate::model::password_info::PasswordInfo;
use crate::model::qualified_contract::QualifiedContract;
use crate::model::qualified_identity::{DPNSNameInfo, QualifiedIdentity};
@@ -49,7 +50,7 @@ use dash_sdk::query_types::IndexMap;
use egui::Context;
use rusqlite::Result;
use std::collections::{BTreeMap, HashMap};
-use std::sync::atomic::{AtomicBool, AtomicU8, Ordering};
+use std::sync::atomic::{AtomicBool, AtomicU8, AtomicU64, Ordering};
use std::sync::{Arc, Mutex, RwLock, RwLockWriteGuard};
const ANIMATION_REFRESH_TIME: std::time::Duration = std::time::Duration::from_millis(100);
@@ -106,6 +107,9 @@ pub struct AppContext {
pub(crate) selected_wallet_hash: Mutex