Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 1 addition & 84 deletions src/backend_task/contested_names/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ impl AppContext {
sdk: &Sdk,
sender: mpsc::Sender<TaskResult>,
) -> Result<BackendTaskSuccessResult, String> {
let sdk = sdk.clone();
match &task {
ContestedResourceTask::QueryDPNSContestedResources => self
.query_dpns_contested_resources(sdk, sender)
Expand All @@ -39,89 +38,7 @@ impl AppContext {
ContestedResourceTask::VoteOnDPNSName(name, vote_choice, voters) => {
self.vote_on_dpns_name(name, *vote_choice, voters, sdk, sender)
.await
} // ContestedResourceTask::VoteOnContestedResource(vote_poll, vote_choice) => {
// let mut vote = Vote::default();
// let identity_private_keys_lock = self.known_identities_private_keys.lock().await;
// let loaded_identity_lock = match self.loaded_identity.lock().await.clone() {
// Some(identity) => identity,
// None => {
// return BackendEvent::TaskCompleted {
// task: Task::Document(task),
// execution_result: Err(
// "No loaded identity for signing vote transaction".to_string(),
// ),
// };
// }
// };
//
// let mut signer = SimpleSigner::default();
// let Identity::V0(identity_v0) = &loaded_identity_lock;
// for (key_id, public_key) in &identity_v0.public_keys {
// let identity_key_tuple = (identity_v0.id, *key_id);
// if let Some(private_key_bytes) =
// identity_private_keys_lock.get(&identity_key_tuple)
// {
// signer
// .private_keys
// .insert(public_key.clone(), private_key_bytes.clone());
// }
// }
//
// let voting_public_key = match loaded_identity_lock.get_first_public_key_matching(
// Purpose::VOTING,
// HashSet::from(SecurityLevel::full_range()),
// HashSet::from(KeyType::all_key_types()),
// false,
// ) {
// Some(voting_key) => voting_key,
// None => {
// return BackendEvent::TaskCompleted {
// task: Task::Document(task),
// execution_result: Err(
// "No voting key in the loaded identity. Are you sure it's a masternode identity?".to_string()
// ),
// };
// }
// };
//
// match vote {
// Vote::ResourceVote(ref mut resource_vote) => match resource_vote {
// ResourceVote::V0(ref mut resource_vote_v0) => {
// resource_vote_v0.vote_poll = vote_poll.clone();
// resource_vote_v0.resource_vote_choice = *vote_choice;
// let pro_tx_hash = self
// .loaded_identity_pro_tx_hash
// .lock()
// .await
// .expect("Expected a proTxHash in AppState");
// match vote
// .put_to_platform_and_wait_for_response(
// pro_tx_hash,
// voting_public_key,
// sdk,
// &signer,
// None,
// )
// .await
// {
// Ok(_) => {
// // TODO: Insert vote result into the database
// BackendEvent::TaskCompleted {
// task: Task::Document(task),
// execution_result: Ok(CompletedTaskPayload::String(
// "Vote cast successfully".to_string(),
// )),
// }
// }
// Err(e) => BackendEvent::TaskCompleted {
// task: Task::Document(task),
// execution_result: Err(e.to_string()),
// },
// }
// }
// },
// }
// }
}
}
}
}
38 changes: 25 additions & 13 deletions src/backend_task/contested_names/query_dpns_contested_resources.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::app::TaskResult;
use crate::backend_task::BackendTaskSuccessResult;
use crate::context::AppContext;
use crate::model::proof_log_item::{ProofLogItem, RequestType};
use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters;
Expand All @@ -9,21 +10,22 @@ use dash_sdk::platform::FetchMany;
use dash_sdk::query_types::ContestedResource;
use dash_sdk::Sdk;
use std::sync::Arc;
use std::time::Instant;
use tokio::sync::{mpsc, OwnedSemaphorePermit, Semaphore};

impl AppContext {
pub(super) async fn query_dpns_contested_resources(
self: &Arc<Self>,
sdk: Sdk,
sdk: &Sdk,
sender: mpsc::Sender<TaskResult>,
) -> Result<(), String> {
let data_contract = self.dpns_contract.as_ref();
let document_type = data_contract
.document_type_for_name("domain")
.expect("expected document type");
let Some(contested_index) = document_type.find_contested_index() else {
return Err("No contested index on dpns domains".to_string());
return Err(
"Contested resource query failed: No contested index on dpns domains.".to_string(),
);
};
const MAX_RETRIES: usize = 3;
let mut start_at_value = None;
Expand Down Expand Up @@ -76,7 +78,9 @@ impl AppContext {
format!("Error encoding path_query: {}", encode_err)
}) {
Ok(encoded_path_query) => encoded_path_query,
Err(e) => return Err(e),
Err(e) => {
return Err(format!("Contested resource query failed: {}", e))
}
};

if let Err(e) = self
Expand All @@ -92,7 +96,7 @@ impl AppContext {
})
.map_err(|e| e.to_string())
{
return Err(e);
return Err(format!("Contested resource query failed: {}", e));
}
}
if e.to_string().contains("try another server")
Expand All @@ -104,15 +108,15 @@ impl AppContext {
if retries > MAX_RETRIES {
tracing::error!("Max retries reached for query: {}", e);
return Err(format!(
"Error fetching contested resources after retries: {}",
"Contested resource query failed after retries: {}",
e
));
} else {
// Retry
continue;
}
} else {
return Err(format!("Error fetching contested resources: {}", e));
return Err(format!("Contested resource query failed: {}", e));
}
}
};
Expand All @@ -139,12 +143,14 @@ impl AppContext {
let names_to_be_updated = self
.db
.insert_name_contests_as_normalized_names(contested_resources_as_strings, &self)
.map_err(|e| e.to_string())?;
.map_err(|e| format!("Contested resource query failed. Failed to insert name contests into database: {}", e.to_string()))?;

sender
.send(TaskResult::Refresh)
.await
.map_err(|e| e.to_string())?;
sender.send(TaskResult::Refresh).await.map_err(|e| {
format!(
"Contested resource query failed. Sender failed to send TaskResult: {}",
e.to_string()
)
})?;

// Create a semaphore with 15 permits
let semaphore = Arc::new(Semaphore::new(24));
Expand Down Expand Up @@ -196,7 +202,7 @@ impl AppContext {

// Perform the query
match self_ref
.query_dpns_vote_contenders(&name, sdk, sender.clone())
.query_dpns_vote_contenders(&name, &sdk, sender.clone())
.await
{
Ok(_) => {
Expand Down Expand Up @@ -236,6 +242,12 @@ impl AppContext {
start_at_value = Some((Value::Text(last_found_name), false))
}

sender
.send(TaskResult::Success(BackendTaskSuccessResult::Message(
"Finished querying DPNS contested resources".to_string(),
)))
.await
.map_err(|e| format!("Finished querying DPNS contested resources but sender failed to send TaskResult: {}", e.to_string()))?;
Ok(())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ impl AppContext {
pub(super) async fn query_dpns_vote_contenders(
&self,
name: &String,
sdk: Sdk,
sdk: &Sdk,
_sender: mpsc::Sender<TaskResult>,
) -> Result<(), String> {
let data_contract = self.dpns_contract.as_ref();
Expand Down
2 changes: 1 addition & 1 deletion src/backend_task/contested_names/vote_on_dpns_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ impl AppContext {
name: &String,
vote_choice: ResourceVoteChoice,
voters: &Vec<QualifiedIdentity>,
sdk: Sdk,
sdk: &Sdk,
_sender: mpsc::Sender<TaskResult>,
) -> Result<BackendTaskSuccessResult, String> {
// Fetch DPNS contract and document type information
Expand Down
27 changes: 23 additions & 4 deletions src/ui/dpns_contested_names_screen.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::components::dpns_subscreen_chooser_panel::add_dpns_subscreen_chooser_panel;
use super::components::top_panel;
use super::{Screen, ScreenType};
use crate::app::{AppAction, DesiredAppAction};
use crate::backend_task::contested_names::ContestedResourceTask;
Expand Down Expand Up @@ -66,6 +67,7 @@ pub struct DPNSContestedNamesScreen {
sort_order: SortOrder,
show_vote_popup_info: Option<(String, ContestedResourceTask)>,
pub dpns_subscreen: DPNSSubscreen,
refreshing: bool,
}

impl DPNSContestedNamesScreen {
Expand Down Expand Up @@ -105,6 +107,7 @@ impl DPNSContestedNamesScreen {
sort_order: SortOrder::Ascending,
show_vote_popup_info: None,
dpns_subscreen,
refreshing: false,
}
}

Expand Down Expand Up @@ -794,28 +797,36 @@ impl ScreenLike for DPNSContestedNamesScreen {
}

fn display_message(&mut self, message: &str, message_type: MessageType) {
if message.contains("Finished querying DPNS contested resources")
|| message.contains("Contested resource query failed")
{
self.refreshing = false;
}
self.error_message = Some((message.to_string(), message_type, Utc::now()));
}

fn ui(&mut self, ctx: &Context) -> AppAction {
self.check_error_expiration();
let has_identity_that_can_register = !self.user_identities.is_empty();
let query = (
let mut top_panel_refresh_button = (
"Refresh",
DesiredAppAction::BackendTask(BackendTask::ContestedResourceTask(
ContestedResourceTask::QueryDPNSContestedResources,
)),
);
if self.refreshing {
top_panel_refresh_button = ("Refreshing...", DesiredAppAction::None)
}
let has_identity_that_can_register = !self.user_identities.is_empty();
let right_buttons = if has_identity_that_can_register {
vec![
(
"Register Name",
DesiredAppAction::AddScreenType(ScreenType::RegisterDpnsName),
),
query,
top_panel_refresh_button,
]
} else {
vec![query]
vec![top_panel_refresh_button]
};
let mut action = add_top_panel(
ctx,
Expand Down Expand Up @@ -918,6 +929,14 @@ impl ScreenLike for DPNSContestedNamesScreen {
}
});

if action
== AppAction::BackendTask(BackendTask::ContestedResourceTask(
ContestedResourceTask::QueryDPNSContestedResources,
))
{
self.refreshing = true;
}

action
}
}