From 23285f13de64510f27812a40a939e01e989bc074 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Fri, 9 May 2025 17:41:15 +0700 Subject: [PATCH 01/20] feat: add group info to token action screens --- src/backend_task/tokens/mod.rs | 8 +- .../tokens/update_token_config.rs | 52 ++-- src/ui/helpers.rs | 69 +++++- src/ui/mod.rs | 61 +++-- src/ui/tokens/burn_tokens_screen.rs | 230 +++++++++++++----- src/ui/tokens/destroy_frozen_funds_screen.rs | 168 +++++++++---- src/ui/tokens/freeze_tokens_screen.rs | 160 ++++++++---- src/ui/tokens/mint_tokens_screen.rs | 116 +++++---- src/ui/tokens/pause_tokens_screen.rs | 163 +++++++++---- src/ui/tokens/resume_tokens_screen.rs | 162 ++++++++---- src/ui/tokens/tokens_screen.rs | 161 +++++++----- src/ui/tokens/unfreeze_tokens_screen.rs | 166 +++++++++---- src/ui/tokens/update_token_config.rs | 206 +++++++++++----- 13 files changed, 1205 insertions(+), 517 deletions(-) diff --git a/src/backend_task/tokens/mod.rs b/src/backend_task/tokens/mod.rs index 9404778a7..0e90e653c 100644 --- a/src/backend_task/tokens/mod.rs +++ b/src/backend_task/tokens/mod.rs @@ -1,5 +1,5 @@ use super::BackendTaskSuccessResult; -use crate::ui::tokens::tokens_screen::{IdentityTokenBalance, IdentityTokenIdentifier, TokenInfo}; +use crate::ui::tokens::tokens_screen::{IdentityTokenIdentifier, IdentityTokenInfo, TokenInfo}; use crate::{app::TaskResult, context::AppContext, model::qualified_identity::QualifiedIdentity}; use dash_sdk::dpp::balances::credits::TokenAmount; use dash_sdk::dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; @@ -169,7 +169,7 @@ pub(crate) enum TokenTask { token_id: Identifier, }, UpdateTokenConfig { - identity_token_balance: IdentityTokenBalance, + identity_token_info: IdentityTokenInfo, change_item: TokenConfigurationChangeItem, signing_key: IdentityPublicKey, public_note: Option, @@ -496,13 +496,13 @@ impl AppContext { )) } TokenTask::UpdateTokenConfig { - identity_token_balance, + identity_token_info, change_item, signing_key, public_note, } => self .update_token_config( - identity_token_balance.clone(), + identity_token_info.clone(), change_item.clone(), signing_key, public_note.clone(), diff --git a/src/backend_task/tokens/update_token_config.rs b/src/backend_task/tokens/update_token_config.rs index 810ccc7e2..4199a1e2b 100644 --- a/src/backend_task/tokens/update_token_config.rs +++ b/src/backend_task/tokens/update_token_config.rs @@ -1,10 +1,10 @@ use super::BackendTaskSuccessResult; use crate::context::AppContext; use crate::model::proof_log_item::{ProofLogItem, RequestType}; -use crate::ui::tokens::tokens_screen::IdentityTokenBalance; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; +use crate::ui::tokens::tokens_screen::IdentityTokenInfo; +use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::{DataContract, Fetch, IdentityPublicKey}; use dash_sdk::{ @@ -16,7 +16,7 @@ use dash_sdk::{ impl AppContext { pub async fn update_token_config( &self, - identity_token_balance: IdentityTokenBalance, + identity_token_info: IdentityTokenInfo, change_item: TokenConfigurationChangeItem, signing_key: &IdentityPublicKey, public_note: Option, @@ -25,42 +25,44 @@ impl AppContext { // Get the existing contract and identity for building the state transition // First, fetch the contract from the local database let existing_data_contract = &self - .get_contract_by_id(&identity_token_balance.data_contract_id) + .get_contract_by_id(&identity_token_info.data_contract.contract.id()) .map_err(|e| { format!( "Error getting contract by ID {}: {}", - identity_token_balance.data_contract_id, e + identity_token_info.data_contract.contract.id(), + e ) })? .ok_or_else(|| { format!( "Contract with ID {} not found", - identity_token_balance.data_contract_id + identity_token_info.data_contract.contract.id() ) })? .contract; // Then, fetch the identity from the local database let identity = self - .get_identity_by_id(&identity_token_balance.identity_id) + .get_identity_by_id(&identity_token_info.identity.identity.id()) .map_err(|e| { format!( "Error getting identity by ID {}: {}", - identity_token_balance.identity_id, e + identity_token_info.identity.identity.id(), + e ) })? .ok_or_else(|| { format!( "Identity with ID {} not found", - identity_token_balance.identity_id + identity_token_info.identity.identity.id() ) })?; // Create the TokenConfigUpdateTransition let mut builder = TokenConfigUpdateTransitionBuilder::new( existing_data_contract, - identity_token_balance.token_position, - identity_token_balance.identity_id, + identity_token_info.token_position, + identity_token_info.identity.identity.id(), change_item.clone(), None, ); @@ -110,19 +112,23 @@ impl AppContext { // Now update the data contract in the local database // First, fetch the updated contract from the platform - let data_contract = DataContract::fetch(sdk, identity_token_balance.data_contract_id) - .await - .map_err(|e| format!("Error fetching contract from platform: {}", e.to_string()))? - .ok_or_else(|| { - format!( - "Contract with ID {} not found on platform", - identity_token_balance.data_contract_id - ) - })?; + let data_contract = + DataContract::fetch(sdk, identity_token_info.data_contract.contract.id()) + .await + .map_err(|e| format!("Error fetching contract from platform: {}", e.to_string()))? + .ok_or_else(|| { + format!( + "Contract with ID {} not found on platform", + identity_token_info.data_contract.contract.id() + ) + })?; // Then replace the contract in the local database - self.replace_contract(identity_token_balance.data_contract_id, &data_contract) - .map_err(|e| format!("Error replacing contract in local database: {}", e))?; + self.replace_contract( + identity_token_info.data_contract.contract.id(), + &data_contract, + ) + .map_err(|e| format!("Error replacing contract in local database: {}", e))?; // Return success Ok(BackendTaskSuccessResult::Message(format!( diff --git a/src/ui/helpers.rs b/src/ui/helpers.rs index 34bacd257..908854d26 100644 --- a/src/ui/helpers.rs +++ b/src/ui/helpers.rs @@ -9,6 +9,7 @@ use dash_sdk::{ data_contract::{ accessors::v0::DataContractV0Getters, document_type::{accessors::DocumentTypeV0Getters, DocumentType}, + group::{accessors::v0::GroupV0Getters, Group}, }, identity::{ accessors::IdentityGettersV0, @@ -18,7 +19,9 @@ use dash_sdk::{ }, platform::IdentityPublicKey, }; -use egui::{ComboBox, Ui}; +use egui::{Color32, ComboBox, Ui}; + +use super::tokens::tokens_screen::IdentityTokenInfo; /// Returns the newly selected identity (if changed), otherwise the existing one. pub fn render_identity_selector( @@ -254,3 +257,67 @@ pub fn add_contract_chooser_pre_filtered<'a, T>( ui.end_row(); }); } + +pub fn render_group_action_text( + ui: &mut Ui, + group: &Option<(u16, Group)>, + identity_token_info: &IdentityTokenInfo, + group_action_type_str: &str, +) -> String { + if let Some((_, group)) = group.as_ref() { + let your_power = group + .members() + .get(&identity_token_info.identity.identity.id()); + + ui.add_space(20.0); + ui.add(egui::Label::new( + egui::RichText::new("This is a group action.") + .heading() + .color(egui::Color32::DARK_RED), + )); + + if your_power.is_none() { + ui.add_space(10.0); + ui.colored_label( + Color32::DARK_RED, + format!( + "You are not a valid group member for {} on this token", + group_action_type_str + ), + ); + return format!("Test {} (Should fail)", group_action_type_str); + } + + ui.add_space(10.0); + if let Some(your_power) = your_power { + if *your_power >= group.required_power() { + ui.label(format!("You are a unilateral group member.\nYou do not need other group members to sign off on this action for it to process.")); + format!("{}", group_action_type_str) + } else { + ui.label(format!("You are not a unilateral group member.\nYou can initiate the {group_action_type_str} action but will need other group members to sign off on it for it to process.\nThis action requires a total power of {}.\nYour power is {your_power}.", group.required_power())); + + ui.add_space(10.0); + ui.label(format!( + "Other group members are : \n{}", + group + .members() + .iter() + .filter_map(|(member, power)| { + if member != &identity_token_info.identity.identity.id() { + Some(format!(" - {} with power {}", member, power)) + } else { + None + } + }) + .collect::>() + .join(", \n") + )); + format!("Initiate Group {}", group_action_type_str) + } + } else { + format!("Test {} (It should fail)", group_action_type_str) + } + } else { + format!("{}", group_action_type_str) + } +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index e9bad9170..e23624470 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -195,15 +195,15 @@ pub enum ScreenType { AddTokenById, TransferTokensScreen(IdentityTokenBalance), MintTokensScreen(IdentityTokenInfo), - BurnTokensScreen(IdentityTokenBalance), - DestroyFrozenFundsScreen(IdentityTokenBalance), - FreezeTokensScreen(IdentityTokenBalance), - UnfreezeTokensScreen(IdentityTokenBalance), - PauseTokensScreen(IdentityTokenBalance), - ResumeTokensScreen(IdentityTokenBalance), + BurnTokensScreen(IdentityTokenInfo), + DestroyFrozenFundsScreen(IdentityTokenInfo), + FreezeTokensScreen(IdentityTokenInfo), + UnfreezeTokensScreen(IdentityTokenInfo), + PauseTokensScreen(IdentityTokenInfo), + ResumeTokensScreen(IdentityTokenInfo), ClaimTokensScreen(IdentityTokenBalance), ViewTokenClaimsScreen(IdentityTokenBalance), - UpdateTokenConfigScreen(IdentityTokenBalance), + UpdateTokenConfigScreen(IdentityTokenInfo), } impl ScreenType { @@ -313,36 +313,33 @@ impl ScreenType { ScreenType::MintTokensScreen(identity_token_info) => Screen::MintTokensScreen( MintTokensScreen::new(identity_token_info.clone(), app_context), ), - ScreenType::BurnTokensScreen(identity_token_balance) => Screen::BurnTokensScreen( - BurnTokensScreen::new(identity_token_balance.clone(), app_context), + ScreenType::BurnTokensScreen(identity_token_info) => Screen::BurnTokensScreen( + BurnTokensScreen::new(identity_token_info.clone(), app_context), ), - ScreenType::DestroyFrozenFundsScreen(identity_token_balance) => { + ScreenType::DestroyFrozenFundsScreen(identity_token_info) => { Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_balance.clone(), + identity_token_info.clone(), app_context, )) } - ScreenType::FreezeTokensScreen(identity_token_balance) => { + ScreenType::FreezeTokensScreen(identity_token_info) => { Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_balance.clone(), + identity_token_info.clone(), app_context, )) } - ScreenType::UnfreezeTokensScreen(identity_token_balance) => { + ScreenType::UnfreezeTokensScreen(identity_token_info) => { Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_balance.clone(), + identity_token_info.clone(), app_context, )) } - ScreenType::PauseTokensScreen(identity_token_balance) => { - Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_balance.clone(), - app_context, - )) - } - ScreenType::ResumeTokensScreen(identity_token_balance) => { + ScreenType::PauseTokensScreen(identity_token_info) => Screen::DestroyFrozenFundsScreen( + DestroyFrozenFundsScreen::new(identity_token_info.clone(), app_context), + ), + ScreenType::ResumeTokensScreen(identity_token_info) => { Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_balance.clone(), + identity_token_info.clone(), app_context, )) } @@ -355,9 +352,9 @@ impl ScreenType { app_context, )) } - ScreenType::UpdateTokenConfigScreen(identity_token_balance) => { + ScreenType::UpdateTokenConfigScreen(identity_token_info) => { Screen::UpdateTokenConfigScreen(UpdateTokenConfigScreen::new( - identity_token_balance.clone(), + identity_token_info.clone(), app_context, )) } @@ -560,22 +557,22 @@ impl Screen { ScreenType::MintTokensScreen(screen.identity_token_info.clone()) } Screen::BurnTokensScreen(screen) => { - ScreenType::BurnTokensScreen(screen.identity_token_balance.clone()) + ScreenType::BurnTokensScreen(screen.identity_token_info.clone()) } Screen::DestroyFrozenFundsScreen(screen) => { - ScreenType::DestroyFrozenFundsScreen(screen.identity_token_balance.clone()) + ScreenType::DestroyFrozenFundsScreen(screen.identity_token_info.clone()) } Screen::FreezeTokensScreen(screen) => { - ScreenType::FreezeTokensScreen(screen.identity_token_balance.clone()) + ScreenType::FreezeTokensScreen(screen.identity_token_info.clone()) } Screen::UnfreezeTokensScreen(screen) => { - ScreenType::UnfreezeTokensScreen(screen.identity_token_balance.clone()) + ScreenType::UnfreezeTokensScreen(screen.identity_token_info.clone()) } Screen::PauseTokensScreen(screen) => { - ScreenType::PauseTokensScreen(screen.identity_token_balance.clone()) + ScreenType::PauseTokensScreen(screen.identity_token_info.clone()) } Screen::ResumeTokensScreen(screen) => { - ScreenType::ResumeTokensScreen(screen.identity_token_balance.clone()) + ScreenType::ResumeTokensScreen(screen.identity_token_info.clone()) } Screen::ClaimTokensScreen(screen) => { ScreenType::ClaimTokensScreen(screen.identity_token_balance.clone()) @@ -584,7 +581,7 @@ impl Screen { ScreenType::ViewTokenClaimsScreen(screen.identity_token_balance.clone()) } Screen::UpdateTokenConfigScreen(screen) => { - ScreenType::UpdateTokenConfigScreen(screen.identity_token_balance.clone()) + ScreenType::UpdateTokenConfigScreen(screen.identity_token_info.clone()) } Screen::AddTokenById(_) => ScreenType::AddTokenById, } diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index 6f5761a5c..816e9f60c 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -3,12 +3,18 @@ use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; +use crate::ui::helpers::render_group_action_text; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::{KeyType, Purpose, SecurityLevel}; @@ -18,7 +24,6 @@ use crate::app::{AppAction, BackendTasksExecutionMode}; use crate::backend_task::tokens::TokenTask; use crate::backend_task::BackendTask; use crate::context::AppContext; -use crate::model::qualified_identity::QualifiedIdentity; use crate::model::wallet::Wallet; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; @@ -27,7 +32,7 @@ use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use super::tokens_screen::IdentityTokenBalance; +use super::tokens_screen::IdentityTokenInfo; /// Internal states for the burn process. #[derive(PartialEq)] @@ -39,9 +44,9 @@ pub enum BurnTokensStatus { } pub struct BurnTokensScreen { - pub identity: QualifiedIdentity, - pub identity_token_balance: IdentityTokenBalance, // Info on which token/contract to burn from + pub identity_token_info: IdentityTokenInfo, selected_key: Option, + group: Option<(GroupContractPosition, Group)>, // The user chooses how many tokens to burn amount_to_burn: String, @@ -63,40 +68,101 @@ pub struct BurnTokensScreen { } impl BurnTokensScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - // Find the local qualified identity that corresponds to `identity_token_balance.identity_id` - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found matching this token's identity."); - - // Grab a default signing key if possible - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); - // Attempt to get an unlocked wallet reference let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_burning_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Burning is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to burn this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to burn this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity, - identity_token_balance, - selected_key: possible_key.cloned(), + identity_token_info, + selected_key: possible_key, + group, amount_to_burn: String::new(), public_note: None, status: BurnTokensStatus::NotStarted, @@ -121,7 +187,13 @@ impl BurnTokensScreen { .show_ui(ui, |ui| { if self.app_context.developer_mode { // Show all loaded public keys - for key in self.identity.identity.public_keys().values() { + for key in self + .identity_token_info + .identity + .identity + .public_keys() + .values() + { let is_valid = key.purpose() == Purpose::AUTHENTICATION && key.security_level() == SecurityLevel::CRITICAL; @@ -147,6 +219,7 @@ impl BurnTokensScreen { } else { // Show only "available" auth keys for key_wrapper in self + .identity_token_info .identity .available_authentication_keys_with_critical_security_level() { @@ -212,7 +285,9 @@ impl BurnTokensScreen { .get_contracts(None, None) .expect("Contracts not loaded") .iter() - .find(|c| c.contract.id() == self.identity_token_balance.data_contract_id) + .find(|c| { + c.contract.id() == self.identity_token_info.data_contract.contract.id() + }) .expect("Data contract not found") .contract .clone(); @@ -221,9 +296,9 @@ impl BurnTokensScreen { action = AppAction::BackendTasks( vec![ BackendTask::TokenTask(TokenTask::BurnTokens { - owner_identity: self.identity.clone(), + owner_identity: self.identity_token_info.identity.clone(), data_contract, - token_position: self.identity_token_balance.token_position, + token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("Expected a key"), public_note: self.public_note.clone(), amount: amount_ok.unwrap(), @@ -289,9 +364,9 @@ impl ScreenLike for BurnTokensScreen { if let Ok(all_identities) = self.app_context.load_local_qualified_identities() { if let Some(updated_identity) = all_identities .into_iter() - .find(|id| id.identity.id() == self.identity.identity.id()) + .find(|id| id.identity.id() == self.identity_token_info.identity.identity.id()) { - self.identity = updated_identity; + self.identity_token_info.identity = updated_identity; } } } @@ -302,10 +377,7 @@ impl ScreenLike for BurnTokensScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Burn", AppAction::None), ], vec![], @@ -333,9 +405,18 @@ impl ScreenLike for BurnTokensScreen { // Check if user has any auth keys let has_keys = if self.app_context.developer_mode { - !self.identity.identity.public_keys().is_empty() + !self + .identity_token_info + .identity + .identity + .public_keys() + .is_empty() } else { - !self.identity.available_authentication_keys().is_empty() + !self + .identity_token_info + .identity + .available_authentication_keys() + .is_empty() }; if !has_keys { @@ -343,27 +424,31 @@ impl ScreenLike for BurnTokensScreen { Color32::DARK_RED, format!( "No authentication keys found for this {} identity.", - self.identity.identity_type, + self.identity_token_info.identity.identity_type, ), ); ui.add_space(10.0); // Show "Add key" or "Check keys" option - let first_key = self.identity.identity.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + let first_key = self + .identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ); if let Some(key) = first_key { if ui.button("Check Keys").clicked() { action |= AppAction::AddScreen(Screen::KeyInfoScreen(KeyInfoScreen::new( - self.identity.clone(), + self.identity_token_info.identity.clone(), key.clone(), None, &self.app_context, @@ -374,7 +459,7 @@ impl ScreenLike for BurnTokensScreen { if ui.button("Add key").clicked() { action |= AppAction::AddScreen(Screen::AddKeyScreen(AddKeyScreen::new( - self.identity.clone(), + self.identity_token_info.identity.clone(), &self.app_context, ))); } @@ -395,9 +480,14 @@ impl ScreenLike for BurnTokensScreen { ui.horizontal(|ui| { self.render_key_selection(ui); ui.add_space(5.0); - let identity_id_string = - self.identity.identity.id().to_string(Encoding::Base58); + let identity_id_string = self + .identity_token_info + .identity + .identity + .id() + .to_string(Encoding::Base58); let identity_display = self + .identity_token_info .identity .alias .as_deref() @@ -435,15 +525,21 @@ impl ScreenLike for BurnTokensScreen { self.public_note = Some(txt); } }); - ui.add_space(10.0); + + let button_text = + render_group_action_text(ui, &self.group, &self.identity_token_info, "Burn"); // Burn button - let button = egui::Button::new(RichText::new("Burn").color(Color32::WHITE)) - .fill(Color32::from_rgb(255, 0, 0)) - .corner_radius(3.0); + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If user pressed "Burn," show a popup diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index 37153e356..e8fa63842 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -3,12 +3,18 @@ use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; +use crate::ui::helpers::render_group_action_text; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::{KeyType, Purpose, SecurityLevel}; @@ -27,7 +33,7 @@ use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use super::tokens_screen::IdentityTokenBalance; +use super::tokens_screen::IdentityTokenInfo; /// Represents possible states in the “destroy frozen funds” flow #[derive(PartialEq)] @@ -44,11 +50,13 @@ pub struct DestroyFrozenFundsScreen { pub identity: QualifiedIdentity, /// Info on which token contract we’re dealing with - pub identity_token_balance: IdentityTokenBalance, + pub identity_token_info: IdentityTokenInfo, /// The key used to sign the operation selected_key: Option, + group: Option<(GroupContractPosition, Group)>, + /// Optional public note pub public_note: Option, @@ -72,42 +80,104 @@ pub struct DestroyFrozenFundsScreen { } impl DestroyFrozenFundsScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - // Locate the local identity that owns the token contract - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found matching this token's identity."); - - // Grab a suitable key - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); - // Possibly get an unlocked wallet let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_burning_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Burning is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to burn this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to burn this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity, - identity_token_balance, - selected_key: possible_key.cloned(), - public_note: None, + identity: identity_token_info.identity.clone(), frozen_identity_id: String::new(), + identity_token_info, + selected_key: possible_key, + group, + public_note: None, status: DestroyFrozenFundsStatus::NotStarted, error_message: None, app_context: app_context.clone(), @@ -230,7 +300,9 @@ impl DestroyFrozenFundsScreen { .get_contracts(None, None) .expect("Contracts not loaded") .iter() - .find(|c| c.contract.id() == self.identity_token_balance.data_contract_id) + .find(|c| { + c.contract.id() == self.identity_token_info.data_contract.contract.id() + }) .expect("Data contract not found") .contract .clone(); @@ -241,7 +313,7 @@ impl DestroyFrozenFundsScreen { BackendTask::TokenTask(TokenTask::DestroyFrozenFunds { actor_identity: self.identity.clone(), data_contract, - token_position: self.identity_token_balance.token_position, + token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("Expected a key"), public_note: self.public_note.clone(), frozen_identity: frozen_id, @@ -323,10 +395,7 @@ impl ScreenLike for DestroyFrozenFundsScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Destroy", AppAction::None), ], vec![], @@ -455,13 +524,24 @@ impl ScreenLike for DestroyFrozenFundsScreen { }); ui.add_space(10.0); + let button_text = render_group_action_text( + ui, + &self.group, + &self.identity_token_info, + "Destroy Frozen Funds", + ); + // Destroy button - let button = egui::Button::new(RichText::new("Destroy").color(Color32::WHITE)) - .fill(Color32::DARK_RED) - .corner_radius(3.0); + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If user pressed "Destroy," show a popup diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index ba6f2e376..a4f3ff004 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -3,6 +3,11 @@ use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -22,12 +27,13 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; +use crate::ui::helpers::render_group_action_text; use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use super::tokens_screen::IdentityTokenBalance; +use super::tokens_screen::IdentityTokenInfo; /// Internal states for the freeze operation #[derive(PartialEq)] @@ -41,10 +47,12 @@ pub enum FreezeTokensStatus { /// A UI Screen that allows freezing an identity’s tokens for a particular contract pub struct FreezeTokensScreen { pub identity: QualifiedIdentity, - pub identity_token_balance: IdentityTokenBalance, + pub identity_token_info: IdentityTokenInfo, selected_key: Option, public_note: Option, + group: Option<(GroupContractPosition, Group)>, + /// The identity we want to freeze freeze_identity_id: String, @@ -64,37 +72,102 @@ pub struct FreezeTokensScreen { } impl FreezeTokensScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found for this token"); - - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_burning_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Burning is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to burn this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to burn this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity, - identity_token_balance, - selected_key: possible_key.cloned(), + identity: identity_token_info.identity.clone(), + identity_token_info, + selected_key: possible_key, + group, public_note: None, freeze_identity_id: String::new(), status: FreezeTokensStatus::NotStarted, @@ -216,7 +289,9 @@ impl FreezeTokensScreen { .get_contracts(None, None) .expect("Contracts not loaded") .iter() - .find(|c| c.contract.id() == self.identity_token_balance.data_contract_id) + .find(|c| { + c.contract.id() == self.identity_token_info.data_contract.contract.id() + }) .expect("Data contract not found") .contract .clone(); @@ -226,7 +301,7 @@ impl FreezeTokensScreen { AppAction::BackendTask(BackendTask::TokenTask(TokenTask::FreezeTokens { actor_identity: self.identity.clone(), data_contract, - token_position: self.identity_token_balance.token_position, + token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), freeze_identity: freeze_id, @@ -299,10 +374,7 @@ impl ScreenLike for FreezeTokensScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Freeze", AppAction::None), ], vec![], @@ -430,15 +502,21 @@ impl ScreenLike for FreezeTokensScreen { self.public_note = Some(txt); } }); - ui.add_space(10.0); + + let button_text = + render_group_action_text(ui, &self.group, &self.identity_token_info, "Freeze"); // Freeze button - let button = egui::Button::new(RichText::new("Freeze").color(Color32::WHITE)) - .fill(Color32::from_rgb(64, 64, 255)) - .corner_radius(3.0); + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If user pressed "Freeze," show popup diff --git a/src/ui/tokens/mint_tokens_screen.rs b/src/ui/tokens/mint_tokens_screen.rs index 05578b14c..9955a7077 100644 --- a/src/ui/tokens/mint_tokens_screen.rs +++ b/src/ui/tokens/mint_tokens_screen.rs @@ -7,7 +7,6 @@ use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; use dash_sdk::dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; -use dash_sdk::dpp::data_contract::group::accessors::v0::GroupV0Getters; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; use eframe::egui::{self, Color32, Context, Ui}; @@ -23,6 +22,7 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; +use crate::ui::helpers::render_group_action_text; use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; @@ -101,7 +101,7 @@ impl MintTokensScreen { != &identity_token_info.identity.identity.id() { error_message = Some( - "You are not allowed to mint on this token. Only the contract owner is." + "You are not allowed to mint this token. Only the contract owner is." .to_string(), ); } @@ -109,7 +109,7 @@ impl MintTokensScreen { } AuthorizedActionTakers::Identity(identifier) => { if identifier != &identity_token_info.identity.identity.id() { - error_message = Some("You are not allowed to mint on this token".to_string()); + error_message = Some("You are not allowed to mint this token".to_string()); } None } @@ -447,9 +447,18 @@ impl ScreenLike for MintTokensScreen { // Check if user has any auth keys let has_keys = if self.app_context.developer_mode { - !self.identity_token_info.identity.identity.public_keys().is_empty() + !self + .identity_token_info + .identity + .identity + .public_keys() + .is_empty() } else { - !self.identity_token_info.identity.available_authentication_keys().is_empty() + !self + .identity_token_info + .identity + .available_authentication_keys() + .is_empty() }; if !has_keys { @@ -463,16 +472,20 @@ impl ScreenLike for MintTokensScreen { ui.add_space(10.0); // Show "Add key" or "Check keys" option - let first_key = self.identity_token_info.identity.identity.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + let first_key = self + .identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ); if let Some(key) = first_key { if ui.button("Check Keys").clicked() { @@ -509,9 +522,15 @@ impl ScreenLike for MintTokensScreen { ui.horizontal(|ui| { self.render_key_selection(ui); ui.add_space(5.0); - let identity_id_string = - self.identity_token_info.identity.identity.id().to_string(Encoding::Base58); - let identity_display = self.identity_token_info.identity + let identity_id_string = self + .identity_token_info + .identity + .identity + .id() + .to_string(Encoding::Base58); + let identity_display = self + .identity_token_info + .identity .alias .as_deref() .unwrap_or_else(|| &identity_id_string); @@ -531,8 +550,20 @@ impl ScreenLike for MintTokensScreen { ui.separator(); ui.add_space(10.0); - if self.identity_token_info.token_config.distribution_rules().minting_allow_choosing_destination() || self.app_context.developer_mode { - if self.identity_token_info.token_config.distribution_rules().new_tokens_destination_identity().is_some() { + if self + .identity_token_info + .token_config + .distribution_rules() + .minting_allow_choosing_destination() + || self.app_context.developer_mode + { + if self + .identity_token_info + .token_config + .distribution_rules() + .new_tokens_destination_identity() + .is_some() + { ui.heading("3. Recipient identity (optional)"); } else { ui.heading("3. Recipient identity (required)"); @@ -562,44 +593,21 @@ impl ScreenLike for MintTokensScreen { self.public_note = Some(txt); } }); - ui.add_space(10.0); - let mint_text = if let Some((_, group)) = self.group.as_ref() { - let your_power = group.members().get(&self.identity_token_info.identity.identity.id()); - if your_power.is_none() { - self.error_message = Some("Only group members can mint on this token".to_string()); - } - ui.heading("This is a group action, it is not immediate."); - ui.label(format!("Members are : \n{}", group.members().iter().map(|(member, power)| { - if member == &self.identity_token_info.identity.identity.id() { - format!("{} (You) with power {}", member, power) - } else { - format!("{} with power {}", member, power) - } - }).collect::>().join(", \n"))); - ui.add_space(10.0); - if let Some(your_power) = your_power { - if *your_power >= group.required_power() { - ui.label(format!("Even though this is a group action, you are able to unilaterally approve it because your power ({}) in the group exceeds the required amount : {}", *your_power, group.required_power())); - "Mint" - } else { - ui.label(format!("You will need at least {} voting power for this action to go through. Contact other group members to let them know to authorize this action after you have initiated it.", group.required_power())); - "Initiate Group Mint" - } - } else { - "Test Mint (It should fail)" - } - } else { - "Mint" - }; + let button_text = + render_group_action_text(ui, &self.group, &self.identity_token_info, "Mint"); // Mint button - let button = egui::Button::new(RichText::new(mint_text).color(Color32::WHITE)) - .fill(Color32::from_rgb(0, 128, 255)) - .corner_radius(3.0); + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If the user pressed "Mint," show a popup diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index fb4cd08dd..470c44ae3 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -3,6 +3,11 @@ use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -21,12 +26,13 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; +use crate::ui::helpers::render_group_action_text; use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use super::tokens_screen::IdentityTokenBalance; +use super::tokens_screen::IdentityTokenInfo; /// Represents states for the pause flow #[derive(PartialEq)] @@ -40,8 +46,9 @@ pub enum PauseTokensStatus { /// A UI screen that allows pausing all token-related actions for a contract pub struct PauseTokensScreen { pub identity: QualifiedIdentity, - pub identity_token_balance: IdentityTokenBalance, + pub identity_token_info: IdentityTokenInfo, selected_key: Option, + group: Option<(GroupContractPosition, Group)>, pub public_note: Option, status: PauseTokensStatus, @@ -60,40 +67,102 @@ pub struct PauseTokensScreen { } impl PauseTokensScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - // Find the local identity that owns this token contract - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found for this token’s identity."); - - // Grab a suitable key - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); - // Possibly get an unlocked wallet let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_burning_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Burning is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to burn this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to burn this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity, - identity_token_balance, - selected_key: possible_key.cloned(), + identity: identity_token_info.identity.clone(), + identity_token_info, + selected_key: possible_key, + group, public_note: None, status: PauseTokensStatus::NotStarted, error_message: None, @@ -184,7 +253,9 @@ impl PauseTokensScreen { .get_contracts(None, None) .expect("Contracts not loaded") .iter() - .find(|c| c.contract.id() == self.identity_token_balance.data_contract_id) + .find(|c| { + c.contract.id() == self.identity_token_info.data_contract.contract.id() + }) .expect("Data contract not found") .contract .clone(); @@ -193,7 +264,7 @@ impl PauseTokensScreen { AppAction::BackendTask(BackendTask::TokenTask(TokenTask::PauseTokens { actor_identity: self.identity.clone(), data_contract, - token_position: self.identity_token_balance.token_position, + token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), })); @@ -263,10 +334,7 @@ impl ScreenLike for PauseTokensScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Pause", AppAction::None), ], vec![], @@ -383,14 +451,21 @@ impl ScreenLike for PauseTokensScreen { self.public_note = Some(txt); } }); - ui.add_space(10.0); - let button = egui::Button::new(RichText::new("Pause").color(Color32::WHITE)) - .fill(Color32::from_rgb(192, 0, 0)) - .corner_radius(3.0); + let button_text = + render_group_action_text(ui, &self.group, &self.identity_token_info, "Pause"); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + // Pause button + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); + + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If user pressed "Pause," show popup diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 0232ad877..98676b21d 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -3,6 +3,11 @@ use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -21,12 +26,13 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; +use crate::ui::helpers::render_group_action_text; use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use super::tokens_screen::IdentityTokenBalance; +use super::tokens_screen::IdentityTokenInfo; /// States for the resume flow #[derive(PartialEq)] @@ -39,9 +45,10 @@ pub enum ResumeTokensStatus { pub struct ResumeTokensScreen { pub identity: QualifiedIdentity, - pub identity_token_balance: IdentityTokenBalance, + pub identity_token_info: IdentityTokenInfo, selected_key: Option, - public_note: Option, + group: Option<(GroupContractPosition, Group)>, + pub public_note: Option, status: ResumeTokensStatus, error_message: Option, @@ -59,37 +66,102 @@ pub struct ResumeTokensScreen { } impl ResumeTokensScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found for this token’s identity."); - - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_burning_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Burning is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to burn this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to burn this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity, - identity_token_balance, - selected_key: possible_key.cloned(), + identity: identity_token_info.identity.clone(), + identity_token_info, + selected_key: possible_key, + group, public_note: None, status: ResumeTokensStatus::NotStarted, error_message: None, @@ -180,7 +252,9 @@ impl ResumeTokensScreen { .get_contracts(None, None) .expect("Contracts not loaded") .iter() - .find(|c| c.contract.id() == self.identity_token_balance.data_contract_id) + .find(|c| { + c.contract.id() == self.identity_token_info.data_contract.contract.id() + }) .expect("Data contract not found") .contract .clone(); @@ -189,7 +263,7 @@ impl ResumeTokensScreen { AppAction::BackendTask(BackendTask::TokenTask(TokenTask::ResumeTokens { actor_identity: self.identity.clone(), data_contract, - token_position: self.identity_token_balance.token_position, + token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), })); @@ -259,10 +333,7 @@ impl ScreenLike for ResumeTokensScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Resume", AppAction::None), ], vec![], @@ -379,14 +450,21 @@ impl ScreenLike for ResumeTokensScreen { self.public_note = Some(txt); } }); - ui.add_space(10.0); - let button = egui::Button::new(RichText::new("Resume").color(Color32::WHITE)) - .fill(Color32::from_rgb(0, 128, 0)) - .corner_radius(3.0); + let button_text = + render_group_action_text(ui, &self.group, &self.identity_token_info, "Resume"); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + // Resume button + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); + + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If user pressed "Resume," show popup diff --git a/src/ui/tokens/tokens_screen.rs b/src/ui/tokens/tokens_screen.rs index 84b321267..bb51df614 100644 --- a/src/ui/tokens/tokens_screen.rs +++ b/src/ui/tokens/tokens_screen.rs @@ -1954,69 +1954,111 @@ impl TokensScreen { ui.close_menu(); } if ui.button("Burn").clicked() { - action = AppAction::AddScreen( - Screen::BurnTokensScreen( - BurnTokensScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::BurnTokensScreen( + BurnTokensScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } if ui.button("Freeze").clicked() { - action = AppAction::AddScreen( - Screen::FreezeTokensScreen( - FreezeTokensScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::FreezeTokensScreen( + FreezeTokensScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } if ui.button("Destroy").clicked() { - action = AppAction::AddScreen( - Screen::DestroyFrozenFundsScreen( - DestroyFrozenFundsScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::DestroyFrozenFundsScreen( + DestroyFrozenFundsScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } if ui.button("Unfreeze").clicked() { - action = AppAction::AddScreen( - Screen::UnfreezeTokensScreen( - UnfreezeTokensScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::UnfreezeTokensScreen( + UnfreezeTokensScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } if ui.button("Pause").clicked() { - action = AppAction::AddScreen( - Screen::PauseTokensScreen( - PauseTokensScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::PauseTokensScreen( + PauseTokensScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } if ui.button("Resume").clicked() { - action = AppAction::AddScreen( - Screen::ResumeTokensScreen( - ResumeTokensScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::ResumeTokensScreen( + ResumeTokensScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } if ui.button("View Claims").clicked() { @@ -2031,14 +2073,21 @@ impl TokensScreen { ui.close_menu(); } if ui.button("Update Config").clicked() { - action = AppAction::AddScreen( - Screen::UpdateTokenConfigScreen( - UpdateTokenConfigScreen::new( - itb.clone(), - &self.app_context, - ), - ), - ); + match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(itb, &self.app_context) { + Ok(info) => { + action = AppAction::AddScreen( + Screen::UpdateTokenConfigScreen( + UpdateTokenConfigScreen::new( + info, + &self.app_context, + ), + ), + ); + } + Err(e) => { + self.set_error_message(Some(e)); + } + }; ui.close_menu(); } }); diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index fb1b63b5e..16c72f964 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -3,6 +3,11 @@ use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -22,12 +27,13 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; +use crate::ui::helpers::render_group_action_text; use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use super::tokens_screen::IdentityTokenBalance; +use super::tokens_screen::IdentityTokenInfo; /// The states for the unfreeze flow #[derive(PartialEq)] @@ -41,11 +47,13 @@ pub enum UnfreezeTokensStatus { /// A screen that allows unfreezing a previously frozen identity’s tokens for a specific contract pub struct UnfreezeTokensScreen { pub identity: QualifiedIdentity, - pub identity_token_balance: IdentityTokenBalance, + pub identity_token_info: IdentityTokenInfo, selected_key: Option, public_note: Option, - /// Identity that’s currently frozen and we want to unfreeze + group: Option<(GroupContractPosition, Group)>, + + /// The identity we want to freeze unfreeze_identity_id: String, status: UnfreezeTokensStatus, @@ -64,37 +72,102 @@ pub struct UnfreezeTokensScreen { } impl UnfreezeTokensScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found for this token’s identity"); - - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_burning_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Burning is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to burn this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to burn this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity, - identity_token_balance, - selected_key: possible_key.cloned(), + identity: identity_token_info.identity.clone(), + identity_token_info, + selected_key: possible_key, + group, public_note: None, unfreeze_identity_id: String::new(), status: UnfreezeTokensStatus::NotStarted, @@ -213,7 +286,9 @@ impl UnfreezeTokensScreen { .get_contracts(None, None) .expect("Contracts not loaded") .iter() - .find(|c| c.contract.id() == self.identity_token_balance.data_contract_id) + .find(|c| { + c.contract.id() == self.identity_token_info.data_contract.contract.id() + }) .expect("Data contract not found") .contract .clone(); @@ -223,7 +298,7 @@ impl UnfreezeTokensScreen { AppAction::BackendTask(BackendTask::TokenTask(TokenTask::UnfreezeTokens { actor_identity: self.identity.clone(), data_contract, - token_position: self.identity_token_balance.token_position, + token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), unfreeze_identity: unfreeze_id, @@ -295,10 +370,7 @@ impl ScreenLike for UnfreezeTokensScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Unfreeze", AppAction::None), ], vec![], @@ -426,15 +498,25 @@ impl ScreenLike for UnfreezeTokensScreen { self.public_note = Some(txt); } }); - ui.add_space(10.0); + + let button_text = render_group_action_text( + ui, + &self.group, + &self.identity_token_info, + "Unfreeze", + ); // Unfreeze button - let button = egui::Button::new(RichText::new("Unfreeze").color(Color32::WHITE)) - .fill(Color32::from_rgb(0, 128, 128)) - .corner_radius(3.0); + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(10.0); + let button = + egui::Button::new(RichText::new(button_text).color(Color32::WHITE)) + .fill(Color32::from_rgb(0, 128, 255)) + .corner_radius(3.0); - if ui.add(button).clicked() { - self.show_confirmation_popup = true; + if ui.add(button).clicked() { + self.show_confirmation_popup = true; + } } // If user pressed "Unfreeze," show popup diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index aa8ca1212..7da12b008 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -1,3 +1,26 @@ +use std::collections::{BTreeMap, HashSet}; +use std::sync::{Arc, RwLock}; + +use chrono::{DateTime, Utc}; +use dash_sdk::dpp::balances::credits::TokenAmount; +use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dash_sdk::dpp::data_contract::associated_token::token_configuration_convention::v0::TokenConfigurationConventionV0; +use dash_sdk::dpp::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use dash_sdk::dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::distribution_function::DistributionFunction; +use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; +use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; +use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; +use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; +use eframe::egui::{self, Color32, Context, Ui}; +use egui::RichText; + +use super::tokens_screen::IdentityTokenInfo; use crate::app::AppAction; use crate::backend_task::tokens::TokenTask; use crate::backend_task::BackendTask; @@ -8,33 +31,16 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::tokens_subscreen_chooser_panel::add_tokens_subscreen_chooser_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::components::wallet_unlock::ScreenWithWalletUnlock; +use crate::ui::helpers::render_group_action_text; use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use chrono::{DateTime, Utc}; -use dash_sdk::dpp::balances::credits::TokenAmount; -use dash_sdk::dpp::data_contract::associated_token::token_configuration_convention::v0::TokenConfigurationConventionV0; -use dash_sdk::dpp::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; -use dash_sdk::dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; -use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::distribution_function::DistributionFunction; -use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; -use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; -use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; -use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; -use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::{KeyType, Purpose, SecurityLevel}; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use dash_sdk::platform::{Identifier, IdentityPublicKey}; -use egui::{Color32, Ui}; -use egui::{Context, RichText}; -use std::sync::RwLock; -use std::collections::{BTreeMap, HashSet}; -use std::sync::Arc; - -use super::tokens_screen::IdentityTokenBalance; #[derive(Debug, Clone, PartialEq)] pub enum UpdateTokenConfigStatus { @@ -43,7 +49,7 @@ pub enum UpdateTokenConfigStatus { } pub struct UpdateTokenConfigScreen { - pub identity_token_balance: IdentityTokenBalance, + pub identity_token_info: IdentityTokenInfo, backend_message: Option<(String, MessageType, DateTime)>, update_status: UpdateTokenConfigStatus, pub app_context: Arc, @@ -51,6 +57,7 @@ pub struct UpdateTokenConfigScreen { signing_key: Option, identity: QualifiedIdentity, public_note: Option, + group: Option<(GroupContractPosition, Group)>, selected_wallet: Option>>, wallet_password: String, @@ -59,49 +66,111 @@ pub struct UpdateTokenConfigScreen { } impl UpdateTokenConfigScreen { - pub fn new( - identity_token_balance: IdentityTokenBalance, - app_context: &Arc, - ) -> Self { - // Find the local qualified identity that corresponds to `identity_token_balance.identity_id` - let identity = app_context - .load_local_qualified_identities() - .unwrap_or_default() - .into_iter() - .find(|id| id.identity.id() == identity_token_balance.identity_id) - .expect("No local qualified identity found matching the token's identity"); - - // Grab a default key if possible - let identity_clone = identity.identity.clone(); - let possible_key = identity_clone.get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), - KeyType::all_key_types().into(), - false, - ); + pub fn new(identity_token_info: IdentityTokenInfo, app_context: &Arc) -> Self { + let possible_key = identity_token_info + .identity + .identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::MEDIUM, + SecurityLevel::CRITICAL, + ]), + KeyType::all_key_types().into(), + false, + ) + .cloned(); let mut error_message = None; - let selected_wallet = - get_selected_wallet(&identity, None, possible_key.clone(), &mut error_message); + + let group = match identity_token_info + .token_config + .manual_minting_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Minting is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to mint this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to mint this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + + // Attempt to get an unlocked wallet reference + let selected_wallet = get_selected_wallet( + &identity_token_info.identity, + None, + possible_key.as_ref(), + &mut error_message, + ); Self { - identity_token_balance: identity_token_balance.clone(), - backend_message: None, + identity_token_info: identity_token_info.clone(), + public_note: None, + group, + change_item: TokenConfigurationChangeItem::TokenConfigurationNoChange, update_status: UpdateTokenConfigStatus::NotUpdating, + error_message: None, app_context: app_context.clone(), - change_item: TokenConfigurationChangeItem::TokenConfigurationNoChange, - signing_key: possible_key.cloned(), - identity, - public_note: None, - selected_wallet, wallet_password: String::new(), show_password: false, - error_message, + backend_message: None, + signing_key: possible_key, + identity: identity_token_info.identity, } } @@ -502,20 +571,26 @@ impl UpdateTokenConfigScreen { } }); - ui.add_space(20.0); + let button_text = + render_group_action_text(ui, &self.group, &self.identity_token_info, "Update Config"); - let button = egui::Button::new(RichText::new("Broadcast Update").color(Color32::WHITE)) + let button = egui::Button::new(RichText::new(&button_text).color(Color32::WHITE)) .fill(Color32::from_rgb(0, 128, 255)) .frame(true) .corner_radius(3.0); - if ui.add(button).clicked() { - self.update_status = UpdateTokenConfigStatus::Updating(Utc::now()); - action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::UpdateTokenConfig { - identity_token_balance: self.identity_token_balance.clone(), - change_item: self.change_item.clone(), - signing_key: self.signing_key.clone().expect("Signing key must be set"), - public_note: self.public_note.clone(), - })); + + if self.app_context.developer_mode || !button_text.contains("Test") { + ui.add_space(20.0); + if ui.add(button).clicked() { + self.update_status = UpdateTokenConfigStatus::Updating(Utc::now()); + action = + AppAction::BackendTask(BackendTask::TokenTask(TokenTask::UpdateTokenConfig { + identity_token_info: self.identity_token_info.clone(), + change_item: self.change_item.clone(), + signing_key: self.signing_key.clone().expect("Signing key must be set"), + public_note: self.public_note.clone(), + })); + } } action @@ -668,10 +743,7 @@ impl ScreenLike for UpdateTokenConfigScreen { &self.app_context, vec![ ("Tokens", AppAction::GoToMainScreen), - ( - &self.identity_token_balance.token_alias, - AppAction::PopScreen, - ), + (&self.identity_token_info.token_alias, AppAction::PopScreen), ("Update Config", AppAction::None), ], vec![], From e4bfebf6ce8cf35f79df921a9afad03a4e7827d8 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Fri, 9 May 2025 17:54:45 +0700 Subject: [PATCH 02/20] fix: group for token config update --- src/ui/tokens/destroy_frozen_funds_screen.rs | 2 +- src/ui/tokens/freeze_tokens_screen.rs | 2 +- src/ui/tokens/pause_tokens_screen.rs | 2 +- src/ui/tokens/resume_tokens_screen.rs | 2 +- src/ui/tokens/unfreeze_tokens_screen.rs | 2 +- src/ui/tokens/update_token_config.rs | 138 +++++++++---------- 6 files changed, 73 insertions(+), 75 deletions(-) diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index e8fa63842..a1d42c465 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -100,7 +100,7 @@ impl DestroyFrozenFundsScreen { let group = match identity_token_info .token_config - .manual_burning_rules() + .destroy_frozen_funds_rules() .authorized_to_make_change_action_takers() { AuthorizedActionTakers::NoOne => { diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index a4f3ff004..4c0d9d26f 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -92,7 +92,7 @@ impl FreezeTokensScreen { let group = match identity_token_info .token_config - .manual_burning_rules() + .freeze_rules() .authorized_to_make_change_action_takers() { AuthorizedActionTakers::NoOne => { diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 470c44ae3..e658db5c5 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -87,7 +87,7 @@ impl PauseTokensScreen { let group = match identity_token_info .token_config - .manual_burning_rules() + .emergency_action_rules() .authorized_to_make_change_action_takers() { AuthorizedActionTakers::NoOne => { diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 98676b21d..f2ce116f6 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -86,7 +86,7 @@ impl ResumeTokensScreen { let group = match identity_token_info .token_config - .manual_burning_rules() + .emergency_action_rules() .authorized_to_make_change_action_takers() { AuthorizedActionTakers::NoOne => { diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index 16c72f964..6254081f3 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -92,7 +92,7 @@ impl UnfreezeTokensScreen { let group = match identity_token_info .token_config - .manual_burning_rules() + .unfreeze_rules() .authorized_to_make_change_action_takers() { AuthorizedActionTakers::NoOne => { diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index 7da12b008..8ef143955 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -15,8 +15,6 @@ use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; -use dash_sdk::dpp::data_contract::group::Group; -use dash_sdk::dpp::data_contract::GroupContractPosition; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -57,7 +55,6 @@ pub struct UpdateTokenConfigScreen { signing_key: Option, identity: QualifiedIdentity, public_note: Option, - group: Option<(GroupContractPosition, Group)>, selected_wallet: Option>>, wallet_password: String, @@ -84,71 +81,6 @@ impl UpdateTokenConfigScreen { let mut error_message = None; - let group = match identity_token_info - .token_config - .manual_minting_rules() - .authorized_to_make_change_action_takers() - { - AuthorizedActionTakers::NoOne => { - error_message = Some("Minting is not allowed on this token".to_string()); - None - } - AuthorizedActionTakers::ContractOwner => { - if identity_token_info.data_contract.contract.owner_id() - != &identity_token_info.identity.identity.id() - { - error_message = Some( - "You are not allowed to mint this token. Only the contract owner is." - .to_string(), - ); - } - None - } - AuthorizedActionTakers::Identity(identifier) => { - if identifier != &identity_token_info.identity.identity.id() { - error_message = Some("You are not allowed to mint this token".to_string()); - } - None - } - AuthorizedActionTakers::MainGroup => { - match identity_token_info.token_config.main_control_group() { - None => { - error_message = Some( - "Invalid contract: No main control group, though one should exist" - .to_string(), - ); - None - } - Some(group_pos) => { - match identity_token_info - .data_contract - .contract - .expected_group(group_pos) - { - Ok(group) => Some((group_pos, group.clone())), - Err(e) => { - error_message = Some(format!("Invalid contract: {}", e)); - None - } - } - } - } - } - AuthorizedActionTakers::Group(group_pos) => { - match identity_token_info - .data_contract - .contract - .expected_group(*group_pos) - { - Ok(group) => Some((*group_pos, group.clone())), - Err(e) => { - error_message = Some(format!("Invalid contract: {}", e)); - None - } - } - } - }; - // Attempt to get an unlocked wallet reference let selected_wallet = get_selected_wallet( &identity_token_info.identity, @@ -160,7 +92,6 @@ impl UpdateTokenConfigScreen { Self { identity_token_info: identity_token_info.clone(), public_note: None, - group, change_item: TokenConfigurationChangeItem::TokenConfigurationNoChange, update_status: UpdateTokenConfigStatus::NotUpdating, error_message: None, @@ -571,8 +502,75 @@ impl UpdateTokenConfigScreen { } }); + let group = match self + .identity_token_info + .token_config + .authorized_action_takers_for_configuration_item(&self.change_item) + { + AuthorizedActionTakers::NoOne => { + self.error_message = Some("Minting is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if self.identity_token_info.data_contract.contract.owner_id() + != &self.identity_token_info.identity.identity.id() + { + self.error_message = Some( + "You are not allowed to mint this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &self.identity_token_info.identity.identity.id() { + self.error_message = Some("You are not allowed to mint this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match self.identity_token_info.token_config.main_control_group() { + None => { + self.error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match self + .identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + self.error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match self + .identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + self.error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Update Config"); + render_group_action_text(ui, &group, &self.identity_token_info, "Update Config"); let button = egui::Button::new(RichText::new(&button_text).color(Color32::WHITE)) .fill(Color32::from_rgb(0, 128, 255)) From 577713c82de870ce5089d46de49903dbc6c6436d Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 12 May 2025 15:00:38 +0700 Subject: [PATCH 03/20] backend --- src/backend_task/tokens/burn_tokens.rs | 8 +++++-- .../tokens/destroy_frozen_funds.rs | 8 +++++-- src/backend_task/tokens/freeze_tokens.rs | 8 +++++-- src/backend_task/tokens/mint_tokens.rs | 2 -- src/backend_task/tokens/mod.rs | 21 +++++++++++++++++++ src/backend_task/tokens/pause_tokens.rs | 8 +++++-- src/backend_task/tokens/resume_tokens.rs | 8 +++++-- src/backend_task/tokens/transfer_tokens.rs | 2 -- src/backend_task/tokens/unfreeze_tokens.rs | 8 +++++-- .../tokens/update_token_config.rs | 4 +++- src/ui/tokens/burn_tokens_screen.rs | 6 ++++++ src/ui/tokens/destroy_frozen_funds_screen.rs | 6 ++++++ src/ui/tokens/freeze_tokens_screen.rs | 6 ++++++ src/ui/tokens/pause_tokens_screen.rs | 6 ++++++ src/ui/tokens/resume_tokens_screen.rs | 6 ++++++ src/ui/tokens/unfreeze_tokens_screen.rs | 6 ++++++ src/ui/tokens/update_token_config.rs | 6 ++++++ 17 files changed, 102 insertions(+), 17 deletions(-) diff --git a/src/backend_task/tokens/burn_tokens.rs b/src/backend_task/tokens/burn_tokens.rs index 794b28071..f3fbc34b1 100644 --- a/src/backend_task/tokens/burn_tokens.rs +++ b/src/backend_task/tokens/burn_tokens.rs @@ -4,10 +4,9 @@ use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::burn::TokenBurnTransitionBuilder; use dash_sdk::platform::{DataContract, IdentityPublicKey}; @@ -23,6 +22,7 @@ impl AppContext { signing_key: IdentityPublicKey, public_note: Option, amount: u64, + group_info: Option, sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { @@ -37,6 +37,10 @@ impl AppContext { builder = builder.with_public_note(note); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); let state_transition = builder diff --git a/src/backend_task/tokens/destroy_frozen_funds.rs b/src/backend_task/tokens/destroy_frozen_funds.rs index 436239153..67f0cc3ba 100644 --- a/src/backend_task/tokens/destroy_frozen_funds.rs +++ b/src/backend_task/tokens/destroy_frozen_funds.rs @@ -4,10 +4,9 @@ use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::destroy::TokenDestroyFrozenFundsTransitionBuilder; use dash_sdk::platform::{DataContract, Identifier, IdentityPublicKey}; @@ -23,6 +22,7 @@ impl AppContext { signing_key: IdentityPublicKey, public_note: Option, frozen_identity: Identifier, + group_info: Option, sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { @@ -37,6 +37,10 @@ impl AppContext { builder = builder.with_public_note(note); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); let state_transition = builder diff --git a/src/backend_task/tokens/freeze_tokens.rs b/src/backend_task/tokens/freeze_tokens.rs index 1898097b9..3d187a5d0 100644 --- a/src/backend_task/tokens/freeze_tokens.rs +++ b/src/backend_task/tokens/freeze_tokens.rs @@ -4,10 +4,9 @@ use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::freeze::TokenFreezeTransitionBuilder; use dash_sdk::platform::{DataContract, Identifier, IdentityPublicKey}; @@ -23,6 +22,7 @@ impl AppContext { signing_key: IdentityPublicKey, public_note: Option, freeze_identity: Identifier, + group_info: Option, sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { @@ -37,6 +37,10 @@ impl AppContext { builder = builder.with_public_note(note); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); let state_transition = builder diff --git a/src/backend_task/tokens/mint_tokens.rs b/src/backend_task/tokens/mint_tokens.rs index 214ea99fc..8355a2d91 100644 --- a/src/backend_task/tokens/mint_tokens.rs +++ b/src/backend_task/tokens/mint_tokens.rs @@ -5,9 +5,7 @@ use crate::model::qualified_identity::QualifiedIdentity; use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::mint::TokenMintTransitionBuilder; use dash_sdk::platform::{DataContract, Identifier, IdentityPublicKey}; diff --git a/src/backend_task/tokens/mod.rs b/src/backend_task/tokens/mod.rs index 0e90e653c..d11e6243e 100644 --- a/src/backend_task/tokens/mod.rs +++ b/src/backend_task/tokens/mod.rs @@ -117,6 +117,7 @@ pub(crate) enum TokenTask { signing_key: IdentityPublicKey, public_note: Option, amount: TokenAmount, + group_info: Option, }, DestroyFrozenFunds { actor_identity: QualifiedIdentity, @@ -125,6 +126,7 @@ pub(crate) enum TokenTask { signing_key: IdentityPublicKey, public_note: Option, frozen_identity: Identifier, + group_info: Option, }, FreezeTokens { actor_identity: QualifiedIdentity, @@ -133,6 +135,7 @@ pub(crate) enum TokenTask { signing_key: IdentityPublicKey, public_note: Option, freeze_identity: Identifier, + group_info: Option, }, UnfreezeTokens { actor_identity: QualifiedIdentity, @@ -141,6 +144,7 @@ pub(crate) enum TokenTask { signing_key: IdentityPublicKey, public_note: Option, unfreeze_identity: Identifier, + group_info: Option, }, PauseTokens { actor_identity: QualifiedIdentity, @@ -148,6 +152,7 @@ pub(crate) enum TokenTask { token_position: TokenContractPosition, signing_key: IdentityPublicKey, public_note: Option, + group_info: Option, }, ResumeTokens { actor_identity: QualifiedIdentity, @@ -155,6 +160,7 @@ pub(crate) enum TokenTask { token_position: TokenContractPosition, signing_key: IdentityPublicKey, public_note: Option, + group_info: Option, }, ClaimTokens { data_contract: DataContract, @@ -173,6 +179,7 @@ pub(crate) enum TokenTask { change_item: TokenConfigurationChangeItem, signing_key: IdentityPublicKey, public_note: Option, + group_info: Option, }, } @@ -314,6 +321,7 @@ impl AppContext { signing_key, public_note, amount, + group_info, } => self .burn_tokens( owner_identity, @@ -322,6 +330,7 @@ impl AppContext { signing_key.clone(), public_note.clone(), *amount, + group_info.clone(), sdk, sender, ) @@ -334,6 +343,7 @@ impl AppContext { signing_key, public_note, frozen_identity, + group_info, } => self .destroy_frozen_funds( actor_identity, @@ -342,6 +352,7 @@ impl AppContext { signing_key.clone(), public_note.clone(), frozen_identity.clone(), + group_info.clone(), sdk, sender, ) @@ -354,6 +365,7 @@ impl AppContext { signing_key, public_note, freeze_identity, + group_info, } => self .freeze_tokens( actor_identity, @@ -362,6 +374,7 @@ impl AppContext { signing_key.clone(), public_note.clone(), freeze_identity.clone(), + group_info.clone(), sdk, sender, ) @@ -374,6 +387,7 @@ impl AppContext { signing_key, public_note, unfreeze_identity, + group_info, } => self .unfreeze_tokens( actor_identity, @@ -382,6 +396,7 @@ impl AppContext { signing_key.clone(), public_note.clone(), unfreeze_identity.clone(), + group_info.clone(), sdk, sender, ) @@ -393,6 +408,7 @@ impl AppContext { token_position, signing_key, public_note, + group_info, } => self .pause_tokens( actor_identity, @@ -400,6 +416,7 @@ impl AppContext { *token_position, signing_key.clone(), public_note.clone(), + group_info.clone(), sdk, sender, ) @@ -411,6 +428,7 @@ impl AppContext { token_position, signing_key, public_note, + group_info, } => self .resume_tokens( actor_identity, @@ -418,6 +436,7 @@ impl AppContext { *token_position, signing_key.clone(), public_note.clone(), + group_info.clone(), sdk, sender, ) @@ -500,12 +519,14 @@ impl AppContext { change_item, signing_key, public_note, + group_info, } => self .update_token_config( identity_token_info.clone(), change_item.clone(), signing_key, public_note.clone(), + group_info.clone(), sdk, ) .await diff --git a/src/backend_task/tokens/pause_tokens.rs b/src/backend_task/tokens/pause_tokens.rs index 756f4d566..1210e508b 100644 --- a/src/backend_task/tokens/pause_tokens.rs +++ b/src/backend_task/tokens/pause_tokens.rs @@ -4,10 +4,9 @@ use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::emergency_action::TokenEmergencyActionTransitionBuilder; use dash_sdk::platform::{DataContract, IdentityPublicKey}; @@ -22,6 +21,7 @@ impl AppContext { token_position: u16, signing_key: IdentityPublicKey, public_note: Option, + group_info: Option, sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { @@ -36,6 +36,10 @@ impl AppContext { builder = builder.with_public_note(note); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); let state_transition = builder diff --git a/src/backend_task/tokens/resume_tokens.rs b/src/backend_task/tokens/resume_tokens.rs index 2cda2fc3e..a05465b10 100644 --- a/src/backend_task/tokens/resume_tokens.rs +++ b/src/backend_task/tokens/resume_tokens.rs @@ -4,10 +4,9 @@ use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::emergency_action::TokenEmergencyActionTransitionBuilder; use dash_sdk::platform::{DataContract, IdentityPublicKey}; @@ -22,6 +21,7 @@ impl AppContext { token_position: u16, signing_key: IdentityPublicKey, public_note: Option, + group_info: Option, sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { @@ -36,6 +36,10 @@ impl AppContext { builder = builder.with_public_note(note); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); let state_transition = builder diff --git a/src/backend_task/tokens/transfer_tokens.rs b/src/backend_task/tokens/transfer_tokens.rs index 5c518c060..1577f19a1 100644 --- a/src/backend_task/tokens/transfer_tokens.rs +++ b/src/backend_task/tokens/transfer_tokens.rs @@ -4,9 +4,7 @@ use crate::backend_task::BackendTaskSuccessResult; use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::transfer::TokenTransferTransitionBuilder; use dash_sdk::platform::{DataContract, Identifier, IdentityPublicKey}; diff --git a/src/backend_task/tokens/unfreeze_tokens.rs b/src/backend_task/tokens/unfreeze_tokens.rs index 5bf6cc4fc..ac9d02f1d 100644 --- a/src/backend_task/tokens/unfreeze_tokens.rs +++ b/src/backend_task/tokens/unfreeze_tokens.rs @@ -4,10 +4,9 @@ use crate::context::AppContext; use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::unfreeze::TokenUnfreezeTransitionBuilder; use dash_sdk::platform::{DataContract, Identifier, IdentityPublicKey}; @@ -23,6 +22,7 @@ impl AppContext { signing_key: IdentityPublicKey, public_note: Option, unfreeze_identity: Identifier, + group_info: Option, sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { @@ -37,6 +37,10 @@ impl AppContext { builder = builder.with_public_note(note); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); let state_transition = builder diff --git a/src/backend_task/tokens/update_token_config.rs b/src/backend_task/tokens/update_token_config.rs index 4199a1e2b..c1ff147e8 100644 --- a/src/backend_task/tokens/update_token_config.rs +++ b/src/backend_task/tokens/update_token_config.rs @@ -3,6 +3,7 @@ use crate::context::AppContext; use crate::model::proof_log_item::{ProofLogItem, RequestType}; use crate::ui::tokens::tokens_screen::IdentityTokenInfo; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; @@ -20,6 +21,7 @@ impl AppContext { change_item: TokenConfigurationChangeItem, signing_key: &IdentityPublicKey, public_note: Option, + group_info: Option, sdk: &Sdk, ) -> Result { // Get the existing contract and identity for building the state transition @@ -64,7 +66,7 @@ impl AppContext { identity_token_info.token_position, identity_token_info.identity.identity.id(), change_item.clone(), - None, + group_info, ); // Add the optional public note diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index 816e9f60c..215504186 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -8,6 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -292,6 +293,10 @@ impl BurnTokensScreen { .contract .clone(); + let group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + // Dispatch the actual backend burn action action = AppAction::BackendTasks( vec![ @@ -302,6 +307,7 @@ impl BurnTokensScreen { signing_key: self.selected_key.clone().expect("Expected a key"), public_note: self.public_note.clone(), amount: amount_ok.unwrap(), + group_info, }), BackendTask::TokenTask(TokenTask::QueryMyTokenBalances), ], diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index a1d42c465..342794059 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -8,6 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -307,6 +308,10 @@ impl DestroyFrozenFundsScreen { .contract .clone(); + let group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + // Dispatch the actual backend destroy action action = AppAction::BackendTasks( vec![ @@ -317,6 +322,7 @@ impl DestroyFrozenFundsScreen { signing_key: self.selected_key.clone().expect("Expected a key"), public_note: self.public_note.clone(), frozen_identity: frozen_id, + group_info, }), BackendTask::TokenTask(TokenTask::QueryMyTokenBalances), ], diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index 4c0d9d26f..6406130e3 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -8,6 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -296,6 +297,10 @@ impl FreezeTokensScreen { .contract .clone(); + let group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + // Dispatch to backend action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::FreezeTokens { @@ -305,6 +310,7 @@ impl FreezeTokensScreen { signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), freeze_identity: freeze_id, + group_info, })); } diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index e658db5c5..10cad69db 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -8,6 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -260,6 +261,10 @@ impl PauseTokensScreen { .contract .clone(); + let group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::PauseTokens { actor_identity: self.identity.clone(), @@ -267,6 +272,7 @@ impl PauseTokensScreen { token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), + group_info, })); } diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index f2ce116f6..1126d61a8 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -8,6 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -259,6 +260,10 @@ impl ResumeTokensScreen { .contract .clone(); + let group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::ResumeTokens { actor_identity: self.identity.clone(), @@ -266,6 +271,7 @@ impl ResumeTokensScreen { token_position: self.identity_token_info.token_position, signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), + group_info, })); } diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index 6254081f3..d0fbfe11b 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -8,6 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -293,6 +294,10 @@ impl UnfreezeTokensScreen { .contract .clone(); + let group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + // Dispatch to backend action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::UnfreezeTokens { @@ -302,6 +307,7 @@ impl UnfreezeTokensScreen { signing_key: self.selected_key.clone().expect("No key selected"), public_note: self.public_note.clone(), unfreeze_identity: unfreeze_id, + group_info, })); } diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index 8ef143955..b512a0c81 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -15,6 +15,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -577,6 +578,10 @@ impl UpdateTokenConfigScreen { .frame(true) .corner_radius(3.0); + let group_info = group + .as_ref() + .map(|(pos, _)| GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos)); + if self.app_context.developer_mode || !button_text.contains("Test") { ui.add_space(20.0); if ui.add(button).clicked() { @@ -587,6 +592,7 @@ impl UpdateTokenConfigScreen { change_item: self.change_item.clone(), signing_key: self.signing_key.clone().expect("Signing key must be set"), public_note: self.public_note.clone(), + group_info, })); } } From 54b74d1e600e9d03269e40c3d9ecf92001cb44ac Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 11:24:21 +0700 Subject: [PATCH 04/20] action buttons in group action screen --- Cargo.lock | 98 ++++---- Cargo.toml | 2 +- src/database/tokens.rs | 4 +- .../group_actions_screen.rs | 170 +++++++++++++- src/ui/tokens/burn_tokens_screen.rs | 84 +++++-- src/ui/tokens/destroy_frozen_funds_screen.rs | 82 +++++-- src/ui/tokens/freeze_tokens_screen.rs | 82 +++++-- src/ui/tokens/mint_tokens_screen.rs | 91 ++++++-- src/ui/tokens/pause_tokens_screen.rs | 68 ++++-- src/ui/tokens/resume_tokens_screen.rs | 68 ++++-- src/ui/tokens/transfer_tokens_screen.rs | 4 +- src/ui/tokens/unfreeze_tokens_screen.rs | 81 +++++-- src/ui/tokens/update_token_config.rs | 213 +++++++++++------- 13 files changed, 784 insertions(+), 263 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7b6e18bb8..0e7719be3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1429,8 +1429,8 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1447,8 +1447,8 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "heck", "quote", @@ -1543,8 +1543,8 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "arc-swap", "async-trait", @@ -1655,8 +1655,8 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -1666,8 +1666,8 @@ dependencies = [ [[package]] name = "data-contracts" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1917,8 +1917,8 @@ checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "dpns-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -1928,8 +1928,8 @@ dependencies = [ [[package]] name = "dpp" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "anyhow", "async-trait", @@ -1970,8 +1970,8 @@ dependencies = [ [[package]] name = "drive" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "bincode", "byteorder", @@ -1995,8 +1995,8 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "bincode", "dapi-grpc", @@ -2504,8 +2504,8 @@ dependencies = [ [[package]] name = "feature-flags-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -2966,7 +2966,7 @@ dependencies = [ [[package]] name = "grovedb" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "bincode", "bincode_derive", @@ -2987,7 +2987,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "integer-encoding", "intmap", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "grovedb-epoch-based-storage-flags" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "grovedb-costs", "hex", @@ -3009,7 +3009,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "bincode", "bincode_derive", @@ -3029,7 +3029,7 @@ dependencies = [ [[package]] name = "grovedb-path" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "hex", ] @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "grovedb-version" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "thiserror 2.0.12", "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "3.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=6d8ce92abe0c888f0a0115a6c88effa04ea87ed3#6d8ce92abe0c888f0a0115a6c88effa04ea87ed3" +source = "git+https://github.com/dashpay/grovedb?rev=221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8#221ca6ec6b8d2b192d334192bd5a7b2cab5b0aa8" dependencies = [ "hex", "itertools 0.14.0", @@ -3758,8 +3758,8 @@ dependencies = [ [[package]] name = "keyword-search-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -3893,8 +3893,8 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -4907,8 +4907,8 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "platform-serialization" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "bincode", "platform-version", @@ -4916,8 +4916,8 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "proc-macro2", "quote", @@ -4927,8 +4927,8 @@ dependencies = [ [[package]] name = "platform-value" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "base64 0.22.1", "bincode", @@ -4947,8 +4947,8 @@ dependencies = [ [[package]] name = "platform-version" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "bincode", "grovedb-version", @@ -4959,8 +4959,8 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "proc-macro2", "quote", @@ -5484,8 +5484,8 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "backon", "chrono", @@ -6496,8 +6496,8 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token-history-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -7069,8 +7069,8 @@ dependencies = [ [[package]] name = "wallet-utils-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "platform-value", "platform-version", @@ -8005,8 +8005,8 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "2.0.0-rc.7" -source = "git+https://github.com/dashpay/platform.git?rev=b548f74e3389b96452123443ba62af02bdbf5ade#b548f74e3389b96452123443ba62af02bdbf5ade" +version = "2.0.0-rc.9" +source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/Cargo.toml b/Cargo.toml index dabea0216..44031bf1d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ rfd = "0.15.1" qrcode = "0.14.1" eframe = { version = "0.31.1", features = ["persistence"] } base64 = "0.22.1" -dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "b548f74e3389b96452123443ba62af02bdbf5ade" } +dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "8165601fbd28ac44675cb49d45872047eec521b3" } thiserror = "2" serde = "1.0.219" serde_json = "1.0.140" diff --git a/src/database/tokens.rs b/src/database/tokens.rs index c742c90be..fa1c92486 100644 --- a/src/database/tokens.rs +++ b/src/database/tokens.rs @@ -125,9 +125,8 @@ impl Database { Ok(()) } - /// Creates the identity_token_balances table if it doesn't already exist + /// Drops the identity_token_balances table (if necessary to enforce schema update) pub fn drop_identity_token_balances_table(&self) -> rusqlite::Result<()> { - // Drop existing token table (if necessary to enforce schema update) self.execute("DROP TABLE IF EXISTS identity_token_balances", [])?; Ok(()) @@ -172,6 +171,7 @@ impl Database { Ok(()) } + /// Retrieves all known tokens as a map from token ID to `TokenInfo`. /// /// Now also fetches and decodes the **`token_config`** blob. diff --git a/src/ui/contracts_documents/group_actions_screen.rs b/src/ui/contracts_documents/group_actions_screen.rs index 0b410bae0..667c02d0b 100644 --- a/src/ui/contracts_documents/group_actions_screen.rs +++ b/src/ui/contracts_documents/group_actions_screen.rs @@ -18,7 +18,18 @@ use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::top_panel::add_top_panel; use crate::ui::helpers::add_contract_chooser_pre_filtered; use crate::ui::helpers::render_identity_selector; -use crate::ui::{MessageType, RootScreenType, ScreenLike}; +use crate::ui::tokens::burn_tokens_screen::BurnTokensScreen; +use crate::ui::tokens::destroy_frozen_funds_screen::DestroyFrozenFundsScreen; +use crate::ui::tokens::freeze_tokens_screen::FreezeTokensScreen; +use crate::ui::tokens::mint_tokens_screen::MintTokensScreen; +use crate::ui::tokens::pause_tokens_screen::PauseTokensScreen; +use crate::ui::tokens::resume_tokens_screen::ResumeTokensScreen; +use crate::ui::tokens::tokens_screen::{ + IdentityTokenBalance, IdentityTokenIdentifier, IdentityTokenInfo, +}; +use crate::ui::tokens::unfreeze_tokens_screen::UnfreezeTokensScreen; +use crate::ui::tokens::update_token_config::UpdateTokenConfigScreen; +use crate::ui::{MessageType, RootScreenType, Screen, ScreenLike}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; use dash_sdk::dpp::data_contract::accessors::v1::DataContractV1Getters; use dash_sdk::dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; @@ -26,7 +37,8 @@ use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers use dash_sdk::dpp::data_contract::change_control_rules::ChangeControlRules; use dash_sdk::dpp::data_contract::TokenContractPosition; use dash_sdk::dpp::group::action_event::GroupActionEvent; -use dash_sdk::dpp::group::group_action::GroupAction; +use dash_sdk::dpp::group::group_action::{GroupAction, GroupActionAccessors}; +use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use dash_sdk::dpp::prelude::TimestampMillis; use dash_sdk::dpp::tokens::token_event::TokenEvent; @@ -60,6 +72,7 @@ pub struct GroupActionsScreen { >, contract_search: String, qualified_identities: Vec, + identity_token_balances: IndexMap, selected_identity: Option, // Backend task status @@ -106,12 +119,17 @@ impl GroupActionsScreen { } }).collect(); + let identity_token_balances = app_context + .identity_token_balances() + .expect("Failed to load identity token balances"); + Self { // Contract and identity selectors selected_contract: None, contracts_with_group_actions, contract_search: String::new(), qualified_identities, + identity_token_balances, selected_identity: None, // Backend task status @@ -127,12 +145,14 @@ impl GroupActionsScreen { ui: &mut egui::Ui, group_actions: &IndexMap, ) -> AppAction { + let mut action = AppAction::None; + ui.heading("Active Group Actions:"); ui.add_space(10.0); if group_actions.is_empty() { ui.label("No active group actions found."); - return AppAction::None; + return action; } let text_style = TextStyle::Body; @@ -264,8 +284,9 @@ impl GroupActionsScreen { }); }); row.col(|ui| { + let info_clone = info.clone(); ui.horizontal(|ui| { - ui.label(info); + ui.label(info_clone); ui.add_space(30.0); }); }); @@ -286,7 +307,140 @@ impl GroupActionsScreen { ) .clicked() { - // return AppAction::GoToGroupActionScreen(id.clone()); + let token_contract_position = match group_action { + GroupAction::V0(action_v0) => action_v0 + .token_contract_position() + .clone(), + }; + let token_id = self.selected_contract.clone().expect("No contract selected").contract.token_id(token_contract_position).expect("No token ID found"); + let identity_token_balance = self + .identity_token_balances + .get(&IdentityTokenIdentifier { + token_id, + identity_id: self.selected_identity + .as_ref() + .unwrap() + .identity + .id() + }) + .cloned() + .expect("Failed to get identity token balance"); + let identity_token_info = IdentityTokenInfo::try_from_identity_token_balance_with_lookup(&identity_token_balance, &self.app_context).expect("Failed to convert identity token balance"); + match typ { + "Mint" => { + let mut mint_screen = + MintTokensScreen::new(identity_token_info, &self.app_context); + mint_screen.group_action_id = Some(*id); + mint_screen.amount_to_mint = info + .split_whitespace() + .next() + .unwrap_or("0") + .to_string(); + mint_screen.recipient_identity_id = info + .split_whitespace() + .nth(2) + .unwrap_or("") + .to_string(); + + action |= AppAction::AddScreen( + Screen::MintTokensScreen(mint_screen), + ); + } + "Burn" => { + let mut burn_screen = + BurnTokensScreen::new(identity_token_info, &self.app_context); + burn_screen.group_action_id = Some(*id); + burn_screen.amount_to_burn = info + .split_whitespace() + .next() + .unwrap_or("0") + .to_string(); + action |= AppAction::AddScreen( + Screen::BurnTokensScreen(burn_screen), + ); + } + "Freeze" => { + let mut freeze_screen = FreezeTokensScreen::new( + identity_token_info, &self.app_context, + ); + freeze_screen.group_action_id = Some(*id); + freeze_screen.freeze_identity_id = info + .split_whitespace() + .next() + .unwrap_or("") + .to_string(); + action |= AppAction::AddScreen( + Screen::FreezeTokensScreen(freeze_screen), + ); + } + "Unfreeze" => { + let mut unfreeze_screen = UnfreezeTokensScreen::new( + identity_token_info, &self.app_context, + ); + unfreeze_screen.group_action_id = Some(*id); + unfreeze_screen.unfreeze_identity_id = info + .split_whitespace() + .next() + .unwrap_or("") + .to_string(); + action |= AppAction::AddScreen( + Screen::UnfreezeTokensScreen(unfreeze_screen), + ); + } + "DestroyFrozenFunds" => { + let mut destroy_screen = + DestroyFrozenFundsScreen::new( + identity_token_info, &self.app_context, + ); + destroy_screen.group_action_id = Some(*id); + destroy_screen.frozen_identity_id = info + .split_whitespace() + .nth(2) + .unwrap_or("") + .to_string(); + action |= AppAction::AddScreen( + Screen::DestroyFrozenFundsScreen( + destroy_screen, + ), + ); + } + "Emergency" => match info.split_whitespace().nth(1) { + Some("Pause") => { + let mut pause_screen = PauseTokensScreen::new( + identity_token_info, &self.app_context, + ); + pause_screen.group_action_id = Some(*id); + action |= AppAction::AddScreen( + Screen::PauseTokensScreen(pause_screen), + ); + } + Some("Resume") => { + let mut resume_screen = ResumeTokensScreen::new( + identity_token_info, &self.app_context, + ); + resume_screen.group_action_id = Some(*id); + action |= AppAction::AddScreen( + Screen::ResumeTokensScreen(resume_screen), + ); + } + _ => {} + }, + "ConfigUpdate" => { + let mut update_screen = + UpdateTokenConfigScreen::new( + identity_token_info, &self.app_context, + ); + update_screen.group_action_id = Some(*id); + action |= AppAction::AddScreen( + Screen::UpdateTokenConfigScreen(update_screen), + ); + } + + // To do: Change price and direct purchase + _ => { + action |= AppAction::None; + } + } } }); }); @@ -294,11 +448,15 @@ impl GroupActionsScreen { }); }); - AppAction::None + action } } impl ScreenLike for GroupActionsScreen { + fn refresh(&mut self) { + self.fetch_group_actions_status = FetchGroupActionsStatus::NotStarted; + } + fn display_message(&mut self, message: &str, message_type: MessageType) { match message_type { MessageType::Success => { diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index 215504186..0ff5c1e37 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -8,7 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -19,7 +19,7 @@ use crate::ui::helpers::render_group_action_text; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::{KeyType, Purpose, SecurityLevel}; -use dash_sdk::platform::IdentityPublicKey; +use dash_sdk::platform::{Identifier, IdentityPublicKey}; use crate::app::{AppAction, BackendTasksExecutionMode}; use crate::backend_task::tokens::TokenTask; @@ -48,9 +48,10 @@ pub struct BurnTokensScreen { pub identity_token_info: IdentityTokenInfo, selected_key: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, // The user chooses how many tokens to burn - amount_to_burn: String, + pub amount_to_burn: String, public_note: Option, status: BurnTokensStatus, @@ -164,6 +165,7 @@ impl BurnTokensScreen { identity_token_info, selected_key: possible_key, group, + group_action_id: None, amount_to_burn: String::new(), public_note: None, status: BurnTokensStatus::NotStarted, @@ -293,9 +295,22 @@ impl BurnTokensScreen { .contract .clone(); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } // Dispatch the actual backend burn action action = AppAction::BackendTasks( @@ -338,7 +353,13 @@ impl BurnTokensScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { // Pop this screen and refresh action = AppAction::PopScreenAndRefresh; } @@ -378,16 +399,32 @@ impl ScreenLike for BurnTokensScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Burn", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Burn", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Burn", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( @@ -508,7 +545,18 @@ impl ScreenLike for BurnTokensScreen { // 2) Amount to burn ui.heading("2. Amount to burn"); ui.add_space(5.0); - self.render_amount_input(ui); + if self.group_action_id.is_some() { + ui.label( + "You are signing an existing group Burn so you are not allowed to choose the amount.", + ); + ui.add_space(5.0); + ui.label(format!( + "Amount: {}", + self.amount_to_burn + )); + } else { + self.render_amount_input(ui); + } ui.add_space(10.0); ui.separator(); diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index 342794059..ae76f4740 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -8,7 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -57,13 +57,14 @@ pub struct DestroyFrozenFundsScreen { selected_key: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, /// Optional public note pub public_note: Option, /// The user must specify the identity ID whose frozen funds are to be destroyed /// Typically some Identity that has been frozen by the system or a group - frozen_identity_id: String, + pub frozen_identity_id: String, status: DestroyFrozenFundsStatus, error_message: Option, @@ -178,6 +179,7 @@ impl DestroyFrozenFundsScreen { identity_token_info, selected_key: possible_key, group, + group_action_id: None, public_note: None, status: DestroyFrozenFundsStatus::NotStarted, error_message: None, @@ -308,9 +310,22 @@ impl DestroyFrozenFundsScreen { .contract .clone(); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } // Dispatch the actual backend destroy action action = AppAction::BackendTasks( @@ -353,7 +368,13 @@ impl DestroyFrozenFundsScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { action = AppAction::PopScreenAndRefresh; } }); @@ -396,16 +417,32 @@ impl ScreenLike for DestroyFrozenFundsScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Destroy", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Destroy Frozen Funds", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Destroy Frozen Funds", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( @@ -505,7 +542,18 @@ impl ScreenLike for DestroyFrozenFundsScreen { // Frozen identity ui.heading("2. Frozen identity to destroy funds from"); ui.add_space(5.0); - self.render_frozen_identity_input(ui); + if self.group_action_id.is_some() { + ui.label( + "You are signing an existing group Destroy so you are not allowed to choose the identity.", + ); + ui.add_space(5.0); + ui.label(format!( + "Identity: {}", + self.frozen_identity_id + )); + } else { + self.render_frozen_identity_input(ui); + } ui.add_space(10.0); ui.separator(); diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index 6406130e3..e6b7bd9ac 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -8,7 +8,7 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -53,9 +53,10 @@ pub struct FreezeTokensScreen { public_note: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, /// The identity we want to freeze - freeze_identity_id: String, + pub freeze_identity_id: String, status: FreezeTokensStatus, error_message: Option, @@ -169,6 +170,7 @@ impl FreezeTokensScreen { identity_token_info, selected_key: possible_key, group, + group_action_id: None, public_note: None, freeze_identity_id: String::new(), status: FreezeTokensStatus::NotStarted, @@ -297,9 +299,22 @@ impl FreezeTokensScreen { .contract .clone(); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } // Dispatch to backend action = @@ -337,7 +352,13 @@ impl FreezeTokensScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { action = AppAction::PopScreenAndRefresh; } }); @@ -375,16 +396,32 @@ impl ScreenLike for FreezeTokensScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Freeze", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Freeze", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Freeze", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( @@ -485,7 +522,18 @@ impl ScreenLike for FreezeTokensScreen { // 2) Identity to freeze ui.heading("2. Enter the identity ID to freeze"); ui.add_space(5.0); - self.render_freeze_identity_input(ui); + if self.group_action_id.is_some() { + ui.label( + "You are signing an existing group Freeze so you are not allowed to choose the identity.", + ); + ui.add_space(5.0); + ui.label(format!( + "Identity: {}", + self.freeze_identity_id + )); + } else { + self.render_freeze_identity_input(ui); + } ui.add_space(10.0); ui.separator(); diff --git a/src/ui/tokens/mint_tokens_screen.rs b/src/ui/tokens/mint_tokens_screen.rs index 9955a7077..749fd75c2 100644 --- a/src/ui/tokens/mint_tokens_screen.rs +++ b/src/ui/tokens/mint_tokens_screen.rs @@ -27,7 +27,7 @@ use crate::ui::identities::get_selected_wallet; use crate::ui::identities::keys::add_key_screen::AddKeyScreen; use crate::ui::identities::keys::key_info_screen::KeyInfoScreen; use crate::ui::{MessageType, Screen, ScreenLike}; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::{KeyType, Purpose, SecurityLevel}; @@ -49,10 +49,11 @@ pub struct MintTokensScreen { selected_key: Option, public_note: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, - recipient_identity_id: String, + pub recipient_identity_id: String, - amount_to_mint: String, + pub amount_to_mint: String, status: MintTokensStatus, error_message: Option, @@ -165,6 +166,7 @@ impl MintTokensScreen { selected_key: possible_key, public_note: None, group, + group_action_id: None, recipient_identity_id: "".to_string(), amount_to_mint: "".to_string(), status: MintTokensStatus::NotStarted, @@ -323,9 +325,22 @@ impl MintTokensScreen { .as_secs(); self.status = MintTokensStatus::WaitingForResult(now); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } // Dispatch the actual backend mint action action = AppAction::BackendTasks( @@ -373,7 +388,13 @@ impl MintTokensScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { // Pop this screen and refresh action = AppAction::PopScreenAndRefresh; } @@ -413,17 +434,32 @@ impl ScreenLike for MintTokensScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { + let mut action; + // Build a top panel - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Mint", AppAction::None), - ], - vec![], - ); + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Mint", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Mint", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( @@ -544,7 +580,18 @@ impl ScreenLike for MintTokensScreen { // 2) Amount to mint ui.heading("2. Amount to mint"); ui.add_space(5.0); - self.render_amount_input(ui); + if self.group_action_id.is_some() { + ui.label( + "You are signing an existing group Mint so you are not allowed to choose the amount.", + ); + ui.add_space(5.0); + ui.label(format!( + "Amount: {}", + self.amount_to_mint + )); + } else { + self.render_amount_input(ui); + } ui.add_space(10.0); ui.separator(); @@ -569,7 +616,13 @@ impl ScreenLike for MintTokensScreen { ui.heading("3. Recipient identity (required)"); } ui.add_space(5.0); - self.render_recipient_input(ui); + if self.group_action_id.is_some() { + ui.label( + "You are signing a group mint so you are not allowed to choose the recipient.", + ); + } else { + self.render_recipient_input(ui); + } } ui.add_space(10.0); diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 10cad69db..63d3d1779 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -8,8 +8,9 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use dash_sdk::dpp::platform_value::string_encoding::Encoding; +use dash_sdk::platform::Identifier; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -50,6 +51,7 @@ pub struct PauseTokensScreen { pub identity_token_info: IdentityTokenInfo, selected_key: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, pub public_note: Option, status: PauseTokensStatus, @@ -164,6 +166,7 @@ impl PauseTokensScreen { identity_token_info, selected_key: possible_key, group, + group_action_id: None, public_note: None, status: PauseTokensStatus::NotStarted, error_message: None, @@ -261,9 +264,22 @@ impl PauseTokensScreen { .contract .clone(); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::PauseTokens { @@ -297,7 +313,13 @@ impl PauseTokensScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { action = AppAction::PopScreenAndRefresh; } }); @@ -335,16 +357,32 @@ impl ScreenLike for PauseTokensScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Pause", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Pause", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Pause", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 1126d61a8..202fb04e1 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -8,8 +8,9 @@ use dash_sdk::dpp::data_contract::associated_token::token_configuration::accesso use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; use dash_sdk::dpp::data_contract::group::Group; use dash_sdk::dpp::data_contract::GroupContractPosition; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use dash_sdk::dpp::platform_value::string_encoding::Encoding; +use dash_sdk::platform::Identifier; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -49,6 +50,7 @@ pub struct ResumeTokensScreen { pub identity_token_info: IdentityTokenInfo, selected_key: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, pub public_note: Option, status: ResumeTokensStatus, @@ -163,6 +165,7 @@ impl ResumeTokensScreen { identity_token_info, selected_key: possible_key, group, + group_action_id: None, public_note: None, status: ResumeTokensStatus::NotStarted, error_message: None, @@ -260,9 +263,22 @@ impl ResumeTokensScreen { .contract .clone(); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::ResumeTokens { @@ -296,7 +312,13 @@ impl ResumeTokensScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { action = AppAction::PopScreenAndRefresh; } }); @@ -334,16 +356,32 @@ impl ScreenLike for ResumeTokensScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Resume", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Resume", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Resume", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( diff --git a/src/ui/tokens/transfer_tokens_screen.rs b/src/ui/tokens/transfer_tokens_screen.rs index aa422e2ef..7bc516f9b 100644 --- a/src/ui/tokens/transfer_tokens_screen.rs +++ b/src/ui/tokens/transfer_tokens_screen.rs @@ -44,8 +44,8 @@ pub struct TransferTokensScreen { selected_friend_index: Option, selected_key: Option, pub public_note: Option, - receiver_identity_id: String, - amount: String, + pub receiver_identity_id: String, + pub amount: String, transfer_tokens_status: TransferTokensStatus, max_amount: u64, pub app_context: Arc, diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index d0fbfe11b..421dffae1 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -13,6 +13,7 @@ use dash_sdk::dpp::platform_value::string_encoding::Encoding; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; +use dash_sdk::dpp::group::GroupStateTransitionInfo; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::{KeyType, Purpose, SecurityLevel}; @@ -53,9 +54,10 @@ pub struct UnfreezeTokensScreen { public_note: Option, group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, /// The identity we want to freeze - unfreeze_identity_id: String, + pub unfreeze_identity_id: String, status: UnfreezeTokensStatus, error_message: Option, @@ -169,6 +171,7 @@ impl UnfreezeTokensScreen { identity_token_info, selected_key: possible_key, group, + group_action_id: None, public_note: None, unfreeze_identity_id: String::new(), status: UnfreezeTokensStatus::NotStarted, @@ -294,9 +297,22 @@ impl UnfreezeTokensScreen { .contract .clone(); - let group_info = self.group.as_ref().map(|(pos, _)| { - GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) - }); + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } // Dispatch to backend action = @@ -333,7 +349,13 @@ impl UnfreezeTokensScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { action = AppAction::PopScreenAndRefresh; } }); @@ -371,16 +393,32 @@ impl ScreenLike for UnfreezeTokensScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Unfreeze", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Unfreeze", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Unfreeze", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( @@ -481,7 +519,18 @@ impl ScreenLike for UnfreezeTokensScreen { // 2) Identity to unfreeze ui.heading("2. Enter the identity ID to unfreeze"); ui.add_space(5.0); - self.render_unfreeze_identity_input(ui); + if self.group_action_id.is_some() { + ui.label( + "You are signing an existing group Unfreeze so you are not allowed to choose the identity.", + ); + ui.add_space(5.0); + ui.label(format!( + "Identity: {}", + self.unfreeze_identity_id + )); + } else { + self.render_unfreeze_identity_input(ui); + } ui.add_space(10.0); ui.separator(); diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index b512a0c81..7eb5e0f2d 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -15,7 +15,9 @@ use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; use dash_sdk::dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; use dash_sdk::dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; -use dash_sdk::dpp::group::GroupStateTransitionInfoStatus; +use dash_sdk::dpp::data_contract::group::Group; +use dash_sdk::dpp::data_contract::GroupContractPosition; +use dash_sdk::dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; use eframe::egui::{self, Color32, Context, Ui}; use egui::RichText; @@ -52,10 +54,12 @@ pub struct UpdateTokenConfigScreen { backend_message: Option<(String, MessageType, DateTime)>, update_status: UpdateTokenConfigStatus, pub app_context: Arc, - change_item: TokenConfigurationChangeItem, + pub change_item: TokenConfigurationChangeItem, signing_key: Option, identity: QualifiedIdentity, public_note: Option, + group: Option<(GroupContractPosition, Group)>, + pub group_action_id: Option, selected_wallet: Option>>, wallet_password: String, @@ -82,6 +86,71 @@ impl UpdateTokenConfigScreen { let mut error_message = None; + let group = match identity_token_info + .token_config + .manual_minting_rules() + .authorized_to_make_change_action_takers() + { + AuthorizedActionTakers::NoOne => { + error_message = Some("Minting is not allowed on this token".to_string()); + None + } + AuthorizedActionTakers::ContractOwner => { + if identity_token_info.data_contract.contract.owner_id() + != &identity_token_info.identity.identity.id() + { + error_message = Some( + "You are not allowed to mint this token. Only the contract owner is." + .to_string(), + ); + } + None + } + AuthorizedActionTakers::Identity(identifier) => { + if identifier != &identity_token_info.identity.identity.id() { + error_message = Some("You are not allowed to mint this token".to_string()); + } + None + } + AuthorizedActionTakers::MainGroup => { + match identity_token_info.token_config.main_control_group() { + None => { + error_message = Some( + "Invalid contract: No main control group, though one should exist" + .to_string(), + ); + None + } + Some(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(group_pos) + { + Ok(group) => Some((group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + } + } + AuthorizedActionTakers::Group(group_pos) => { + match identity_token_info + .data_contract + .contract + .expected_group(*group_pos) + { + Ok(group) => Some((*group_pos, group.clone())), + Err(e) => { + error_message = Some(format!("Invalid contract: {}", e)); + None + } + } + } + }; + // Attempt to get an unlocked wallet reference let selected_wallet = get_selected_wallet( &identity_token_info.identity, @@ -103,6 +172,8 @@ impl UpdateTokenConfigScreen { backend_message: None, signing_key: possible_key, identity: identity_token_info.identity, + group, + group_action_id: None, } } @@ -111,6 +182,9 @@ impl UpdateTokenConfigScreen { ui.heading("2. Select the item to update"); ui.add_space(10.0); + if self.group_action_id.is_some() { + ui.label("You are signing an existing group action. Make sure you construct the exact same item as the one in the group action, details of which can be found on the previous screen."); + } let item = &mut self.change_item; @@ -503,88 +577,34 @@ impl UpdateTokenConfigScreen { } }); - let group = match self - .identity_token_info - .token_config - .authorized_action_takers_for_configuration_item(&self.change_item) - { - AuthorizedActionTakers::NoOne => { - self.error_message = Some("Minting is not allowed on this token".to_string()); - None - } - AuthorizedActionTakers::ContractOwner => { - if self.identity_token_info.data_contract.contract.owner_id() - != &self.identity_token_info.identity.identity.id() - { - self.error_message = Some( - "You are not allowed to mint this token. Only the contract owner is." - .to_string(), - ); - } - None - } - AuthorizedActionTakers::Identity(identifier) => { - if identifier != &self.identity_token_info.identity.identity.id() { - self.error_message = Some("You are not allowed to mint this token".to_string()); - } - None - } - AuthorizedActionTakers::MainGroup => { - match self.identity_token_info.token_config.main_control_group() { - None => { - self.error_message = Some( - "Invalid contract: No main control group, though one should exist" - .to_string(), - ); - None - } - Some(group_pos) => { - match self - .identity_token_info - .data_contract - .contract - .expected_group(group_pos) - { - Ok(group) => Some((group_pos, group.clone())), - Err(e) => { - self.error_message = Some(format!("Invalid contract: {}", e)); - None - } - } - } - } - } - AuthorizedActionTakers::Group(group_pos) => { - match self - .identity_token_info - .data_contract - .contract - .expected_group(group_pos) - { - Ok(group) => Some((group_pos, group.clone())), - Err(e) => { - self.error_message = Some(format!("Invalid contract: {}", e)); - None - } - } - } - }; - let button_text = - render_group_action_text(ui, &group, &self.identity_token_info, "Update Config"); + render_group_action_text(ui, &self.group, &self.identity_token_info, "Update Config"); let button = egui::Button::new(RichText::new(&button_text).color(Color32::WHITE)) .fill(Color32::from_rgb(0, 128, 255)) .frame(true) .corner_radius(3.0); - let group_info = group - .as_ref() - .map(|(pos, _)| GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos)); - if self.app_context.developer_mode || !button_text.contains("Test") { ui.add_space(20.0); if ui.add(button).clicked() { + let group_info; + if self.group_action_id.is_some() { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: *pos, + action_id: self.group_action_id.unwrap(), + action_is_proposer: false, + }, + ) + }); + } else { + group_info = self.group.as_ref().map(|(pos, _)| { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(*pos) + }); + } + self.update_status = UpdateTokenConfigStatus::Updating(Utc::now()); action = AppAction::BackendTask(BackendTask::TokenTask(TokenTask::UpdateTokenConfig { @@ -654,7 +674,13 @@ impl UpdateTokenConfigScreen { ui.add_space(20.0); - if ui.button("Back to Tokens").clicked() { + let button_text; + if self.group_action_id.is_some() { + button_text = "Back to Group Actions"; + } else { + button_text = "Back to Tokens"; + } + if ui.button(button_text).clicked() { action = AppAction::PopScreenAndRefresh; } }); @@ -741,17 +767,32 @@ impl ScreenLike for UpdateTokenConfigScreen { } fn ui(&mut self, ctx: &Context) -> AppAction { - // Top panel - let mut action = add_top_panel( - ctx, - &self.app_context, - vec![ - ("Tokens", AppAction::GoToMainScreen), - (&self.identity_token_info.token_alias, AppAction::PopScreen), - ("Update Config", AppAction::None), - ], - vec![], - ); + let mut action; + + // Build a top panel + if self.group_action_id.is_some() { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("Group Actions", AppAction::PopScreen), + ("Update Token Config", AppAction::None), + ], + vec![], + ); + } else { + action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Tokens", AppAction::GoToMainScreen), + (&self.identity_token_info.token_alias, AppAction::PopScreen), + ("Update Token Config", AppAction::None), + ], + vec![], + ); + } // Left panel action |= add_left_panel( From 08f53600a5661ae28bc52db8056be34326ae7cb9 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 19:10:14 +0700 Subject: [PATCH 05/20] fix: dont set recipient --- src/ui/contracts_documents/group_actions_screen.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/ui/contracts_documents/group_actions_screen.rs b/src/ui/contracts_documents/group_actions_screen.rs index 667c02d0b..8ce04ff80 100644 --- a/src/ui/contracts_documents/group_actions_screen.rs +++ b/src/ui/contracts_documents/group_actions_screen.rs @@ -330,17 +330,13 @@ impl GroupActionsScreen { "Mint" => { let mut mint_screen = MintTokensScreen::new(identity_token_info, &self.app_context); + mint_screen.group_action_id = Some(*id); mint_screen.amount_to_mint = info .split_whitespace() .next() .unwrap_or("0") .to_string(); - mint_screen.recipient_identity_id = info - .split_whitespace() - .nth(2) - .unwrap_or("") - .to_string(); action |= AppAction::AddScreen( Screen::MintTokensScreen(mint_screen), @@ -349,12 +345,14 @@ impl GroupActionsScreen { "Burn" => { let mut burn_screen = BurnTokensScreen::new(identity_token_info, &self.app_context); + burn_screen.group_action_id = Some(*id); burn_screen.amount_to_burn = info .split_whitespace() .next() .unwrap_or("0") .to_string(); + action |= AppAction::AddScreen( Screen::BurnTokensScreen(burn_screen), ); From 3c3fd359cdc85f7d233cbbf308dbf1446e928d49 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 19:31:16 +0700 Subject: [PATCH 06/20] fix ui for active group action --- src/ui/helpers.rs | 20 ++++++++++++++++++-- src/ui/tokens/mint_tokens_screen.rs | 18 ++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/ui/helpers.rs b/src/ui/helpers.rs index 908854d26..4d45c71c9 100644 --- a/src/ui/helpers.rs +++ b/src/ui/helpers.rs @@ -17,7 +17,7 @@ use dash_sdk::{ }, platform_value::string_encoding::Encoding, }, - platform::IdentityPublicKey, + platform::{Identifier, IdentityPublicKey}, }; use egui::{Color32, ComboBox, Ui}; @@ -263,8 +263,24 @@ pub fn render_group_action_text( group: &Option<(u16, Group)>, identity_token_info: &IdentityTokenInfo, group_action_type_str: &str, + group_action_id: &Option, ) -> String { - if let Some((_, group)) = group.as_ref() { + if let Some(group_action_id) = group_action_id { + ui.add_space(20.0); + ui.add(egui::Label::new( + egui::RichText::new("This is a group action.") + .heading() + .color(egui::Color32::DARK_RED), + )); + + ui.add_space(10.0); + ui.label(format!( + "You are signing the active {} group action with ID {}", + group_action_type_str, + group_action_id.to_string(Encoding::Base58) + )); + return format!("Sign {}", group_action_type_str); + } else if let Some((_, group)) = group.as_ref() { let your_power = group .members() .get(&identity_token_info.identity.identity.id()); diff --git a/src/ui/tokens/mint_tokens_screen.rs b/src/ui/tokens/mint_tokens_screen.rs index 749fd75c2..f4394fd5c 100644 --- a/src/ui/tokens/mint_tokens_screen.rs +++ b/src/ui/tokens/mint_tokens_screen.rs @@ -593,10 +593,6 @@ impl ScreenLike for MintTokensScreen { self.render_amount_input(ui); } - ui.add_space(10.0); - ui.separator(); - ui.add_space(10.0); - if self .identity_token_info .token_config @@ -604,6 +600,10 @@ impl ScreenLike for MintTokensScreen { .minting_allow_choosing_destination() || self.app_context.developer_mode { + ui.add_space(10.0); + ui.separator(); + ui.add_space(10.0); + if self .identity_token_info .token_config @@ -616,13 +616,7 @@ impl ScreenLike for MintTokensScreen { ui.heading("3. Recipient identity (required)"); } ui.add_space(5.0); - if self.group_action_id.is_some() { - ui.label( - "You are signing a group mint so you are not allowed to choose the recipient.", - ); - } else { - self.render_recipient_input(ui); - } + self.render_recipient_input(ui); } ui.add_space(10.0); @@ -648,7 +642,7 @@ impl ScreenLike for MintTokensScreen { }); let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Mint"); + render_group_action_text(ui, &self.group, &self.identity_token_info, "Mint", &self.group_action_id); // Mint button if self.app_context.developer_mode || !button_text.contains("Test") { From d3cffea63597bc404714a6d6b8d28ef05947a689 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 19:33:13 +0700 Subject: [PATCH 07/20] fix --- src/ui/tokens/burn_tokens_screen.rs | 2 +- src/ui/tokens/destroy_frozen_funds_screen.rs | 1 + src/ui/tokens/freeze_tokens_screen.rs | 2 +- src/ui/tokens/pause_tokens_screen.rs | 9 +++++++-- src/ui/tokens/resume_tokens_screen.rs | 9 +++++++-- src/ui/tokens/unfreeze_tokens_screen.rs | 1 + src/ui/tokens/update_token_config.rs | 9 +++++++-- 7 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index 0ff5c1e37..cea7cfc2c 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -581,7 +581,7 @@ impl ScreenLike for BurnTokensScreen { }); let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Burn"); + render_group_action_text(ui, &self.group, &self.identity_token_info, "Burn", &self.group_action_id); // Burn button if self.app_context.developer_mode || !button_text.contains("Test") { diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index ae76f4740..f38bf9248 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -583,6 +583,7 @@ impl ScreenLike for DestroyFrozenFundsScreen { &self.group, &self.identity_token_info, "Destroy Frozen Funds", + &self.group_action_id, ); // Destroy button diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index e6b7bd9ac..8354488d6 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -558,7 +558,7 @@ impl ScreenLike for FreezeTokensScreen { }); let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Freeze"); + render_group_action_text(ui, &self.group, &self.identity_token_info, "Freeze", &self.group_action_id); // Freeze button if self.app_context.developer_mode || !button_text.contains("Test") { diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 63d3d1779..0a31dc00e 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -496,8 +496,13 @@ impl ScreenLike for PauseTokensScreen { } }); - let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Pause"); + let button_text = render_group_action_text( + ui, + &self.group, + &self.identity_token_info, + "Pause", + &self.group_action_id, + ); // Pause button if self.app_context.developer_mode || !button_text.contains("Test") { diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 202fb04e1..3ec61bd51 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -495,8 +495,13 @@ impl ScreenLike for ResumeTokensScreen { } }); - let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Resume"); + let button_text = render_group_action_text( + ui, + &self.group, + &self.identity_token_info, + "Resume", + &self.group_action_id, + ); // Resume button if self.app_context.developer_mode || !button_text.contains("Test") { diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index 421dffae1..bce0eb900 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -559,6 +559,7 @@ impl ScreenLike for UnfreezeTokensScreen { &self.group, &self.identity_token_info, "Unfreeze", + &self.group_action_id, ); // Unfreeze button diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index 7eb5e0f2d..d38180a9d 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -577,8 +577,13 @@ impl UpdateTokenConfigScreen { } }); - let button_text = - render_group_action_text(ui, &self.group, &self.identity_token_info, "Update Config"); + let button_text = render_group_action_text( + ui, + &self.group, + &self.identity_token_info, + "Update Config", + &self.group_action_id, + ); let button = egui::Button::new(RichText::new(&button_text).color(Color32::WHITE)) .fill(Color32::from_rgb(0, 128, 255)) From aafc6d246d4c0d227100f8b2cd70c1bb536dcc7d Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 19:36:50 +0700 Subject: [PATCH 08/20] fix --- Cargo.lock | 42 +++++++++---------- Cargo.toml | 2 +- .../tokens/update_token_config.rs | 5 ++- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e7719be3..43768d401 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1430,7 +1430,7 @@ dependencies = [ [[package]] name = "dapi-grpc" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1448,7 +1448,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "heck", "quote", @@ -1544,7 +1544,7 @@ dependencies = [ [[package]] name = "dash-sdk" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "arc-swap", "async-trait", @@ -1656,7 +1656,7 @@ dependencies = [ [[package]] name = "dashpay-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -1667,7 +1667,7 @@ dependencies = [ [[package]] name = "data-contracts" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1918,7 +1918,7 @@ checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "dpns-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -1929,7 +1929,7 @@ dependencies = [ [[package]] name = "dpp" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "anyhow", "async-trait", @@ -1971,7 +1971,7 @@ dependencies = [ [[package]] name = "drive" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "bincode", "byteorder", @@ -1996,7 +1996,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "bincode", "dapi-grpc", @@ -2505,7 +2505,7 @@ dependencies = [ [[package]] name = "feature-flags-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -3759,7 +3759,7 @@ dependencies = [ [[package]] name = "keyword-search-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -3894,7 +3894,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -4908,7 +4908,7 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "platform-serialization" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "bincode", "platform-version", @@ -4917,7 +4917,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "proc-macro2", "quote", @@ -4928,7 +4928,7 @@ dependencies = [ [[package]] name = "platform-value" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "base64 0.22.1", "bincode", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "platform-version" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "bincode", "grovedb-version", @@ -4960,7 +4960,7 @@ dependencies = [ [[package]] name = "platform-versioning" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "proc-macro2", "quote", @@ -5485,7 +5485,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "backon", "chrono", @@ -6497,7 +6497,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token-history-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -7070,7 +7070,7 @@ dependencies = [ [[package]] name = "wallet-utils-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "platform-value", "platform-version", @@ -8006,7 +8006,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=8165601fbd28ac44675cb49d45872047eec521b3#8165601fbd28ac44675cb49d45872047eec521b3" +source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/Cargo.toml b/Cargo.toml index 44031bf1d..77087b45e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ rfd = "0.15.1" qrcode = "0.14.1" eframe = { version = "0.31.1", features = ["persistence"] } base64 = "0.22.1" -dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "8165601fbd28ac44675cb49d45872047eec521b3" } +dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "d6bde19c47b0acac7a6262a0893441087e3d7749" } thiserror = "2" serde = "1.0.219" serde_json = "1.0.140" diff --git a/src/backend_task/tokens/update_token_config.rs b/src/backend_task/tokens/update_token_config.rs index c1ff147e8..78594fa9e 100644 --- a/src/backend_task/tokens/update_token_config.rs +++ b/src/backend_task/tokens/update_token_config.rs @@ -66,7 +66,6 @@ impl AppContext { identity_token_info.token_position, identity_token_info.identity.identity.id(), change_item.clone(), - group_info, ); // Add the optional public note @@ -74,6 +73,10 @@ impl AppContext { builder = builder.with_public_note(public_note.clone()); } + if let Some(group_info) = group_info { + builder = builder.with_using_group_info(group_info); + } + let options = self.state_transition_options(); // Sign the state transition From a31111effbb11d6000774d1368c4c35b20cdf97f Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 19:41:38 +0700 Subject: [PATCH 09/20] fix --- src/ui/helpers.rs | 2 +- src/ui/tokens/burn_tokens_screen.rs | 6 +++++- src/ui/tokens/destroy_frozen_funds_screen.rs | 7 +++++-- src/ui/tokens/freeze_tokens_screen.rs | 6 +++++- src/ui/tokens/mint_tokens_screen.rs | 6 +++++- src/ui/tokens/pause_tokens_screen.rs | 2 +- src/ui/tokens/resume_tokens_screen.rs | 2 +- src/ui/tokens/unfreeze_tokens_screen.rs | 6 +++++- src/ui/tokens/update_token_config.rs | 4 ++-- 9 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/ui/helpers.rs b/src/ui/helpers.rs index 4d45c71c9..bdf490140 100644 --- a/src/ui/helpers.rs +++ b/src/ui/helpers.rs @@ -275,7 +275,7 @@ pub fn render_group_action_text( ui.add_space(10.0); ui.label(format!( - "You are signing the active {} group action with ID {}", + "You are signing an active {} group action (Action ID {})", group_action_type_str, group_action_id.to_string(Encoding::Base58) )); diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index cea7cfc2c..e55459185 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -576,7 +576,11 @@ impl ScreenLike for BurnTokensScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { + Some(txt) + } else { + None + }; } }); diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index f38bf9248..2320ed6c8 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -573,10 +573,13 @@ impl ScreenLike for DestroyFrozenFundsScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { + Some(txt) + } else { + None + }; } }); - ui.add_space(10.0); let button_text = render_group_action_text( ui, diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index 8354488d6..b5d195bc6 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -553,7 +553,11 @@ impl ScreenLike for FreezeTokensScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { + Some(txt) + } else { + None + }; } }); diff --git a/src/ui/tokens/mint_tokens_screen.rs b/src/ui/tokens/mint_tokens_screen.rs index f4394fd5c..e4257f10a 100644 --- a/src/ui/tokens/mint_tokens_screen.rs +++ b/src/ui/tokens/mint_tokens_screen.rs @@ -637,7 +637,11 @@ impl ScreenLike for MintTokensScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { + Some(txt) + } else { + None + }; } }); diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 0a31dc00e..29ae1abd5 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -492,7 +492,7 @@ impl ScreenLike for PauseTokensScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { Some(txt) } else { None }; } }); diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 3ec61bd51..6520bf951 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -491,7 +491,7 @@ impl ScreenLike for ResumeTokensScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { Some(txt) } else { None }; } }); diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index bce0eb900..2bd9e4a38 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -550,7 +550,11 @@ impl ScreenLike for UnfreezeTokensScreen { ) .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { + Some(txt) + } else { + None + }; } }); diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index d38180a9d..b4b87e6b1 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -570,10 +570,10 @@ impl UpdateTokenConfigScreen { let mut txt = self.public_note.clone().unwrap_or_default(); if ui .text_edit_singleline(&mut txt) - .on_hover_text("A note to go with the transaction that can be seen by the public") + .on_hover_text("A note about the transaction that can be seen by the public.") .changed() { - self.public_note = Some(txt); + self.public_note = if txt.len() > 0 { Some(txt) } else { None }; } }); From 472ac4a0c86771332451ec865877b1fadac0e577 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 13 May 2025 20:55:57 +0700 Subject: [PATCH 10/20] update sdk --- Cargo.lock | 84 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 43768d401..d54dfe7da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1429,8 +1429,8 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1447,8 +1447,8 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "heck", "quote", @@ -1543,8 +1543,8 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "arc-swap", "async-trait", @@ -1655,8 +1655,8 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -1666,8 +1666,8 @@ dependencies = [ [[package]] name = "data-contracts" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1917,8 +1917,8 @@ checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "dpns-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -1928,8 +1928,8 @@ dependencies = [ [[package]] name = "dpp" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "anyhow", "async-trait", @@ -1970,8 +1970,8 @@ dependencies = [ [[package]] name = "drive" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "bincode", "byteorder", @@ -1995,8 +1995,8 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "bincode", "dapi-grpc", @@ -2504,8 +2504,8 @@ dependencies = [ [[package]] name = "feature-flags-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -3758,8 +3758,8 @@ dependencies = [ [[package]] name = "keyword-search-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -3893,8 +3893,8 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -4907,8 +4907,8 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "platform-serialization" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "bincode", "platform-version", @@ -4916,8 +4916,8 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "proc-macro2", "quote", @@ -4927,8 +4927,8 @@ dependencies = [ [[package]] name = "platform-value" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "base64 0.22.1", "bincode", @@ -4947,8 +4947,8 @@ dependencies = [ [[package]] name = "platform-version" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "bincode", "grovedb-version", @@ -4959,8 +4959,8 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "proc-macro2", "quote", @@ -5484,8 +5484,8 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "backon", "chrono", @@ -6496,8 +6496,8 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token-history-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -7069,8 +7069,8 @@ dependencies = [ [[package]] name = "wallet-utils-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "platform-value", "platform-version", @@ -8005,8 +8005,8 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "2.0.0-rc.9" -source = "git+https://github.com/dashpay/platform.git?rev=d6bde19c47b0acac7a6262a0893441087e3d7749#d6bde19c47b0acac7a6262a0893441087e3d7749" +version = "2.0.0-rc.10" +source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/Cargo.toml b/Cargo.toml index 77087b45e..88b35a9f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ rfd = "0.15.1" qrcode = "0.14.1" eframe = { version = "0.31.1", features = ["persistence"] } base64 = "0.22.1" -dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "d6bde19c47b0acac7a6262a0893441087e3d7749" } +dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "9724a7cca47adfdec338ed35b484b9b1c7d5da61" } thiserror = "2" serde = "1.0.219" serde_json = "1.0.140" From 5834e54b117025164218f0bf1d9d850f53319698 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Wed, 14 May 2025 21:03:58 +0700 Subject: [PATCH 11/20] fix success messages --- src/ui/tokens/burn_tokens_screen.rs | 6 +++++- src/ui/tokens/destroy_frozen_funds_screen.rs | 6 +++++- src/ui/tokens/freeze_tokens_screen.rs | 6 +++++- src/ui/tokens/mint_tokens_screen.rs | 6 +++++- src/ui/tokens/pause_tokens_screen.rs | 6 +++++- src/ui/tokens/resume_tokens_screen.rs | 6 +++++- src/ui/tokens/unfreeze_tokens_screen.rs | 6 +++++- src/ui/tokens/update_token_config.rs | 6 +++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index e55459185..80ae64f9b 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -349,7 +349,11 @@ impl BurnTokensScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Burn Successful!"); + if self.group_action_id.is_some() { + ui.label("Group Burn Signing Successful."); + } else { + ui.heading("Burn Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index 2320ed6c8..19c2f96c8 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -364,7 +364,11 @@ impl DestroyFrozenFundsScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Successfully destroyed frozen funds!"); + if self.group_action_id.is_some() { + ui.label("Group Destroy Signing Successful."); + } else { + ui.heading("Destroy Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index b5d195bc6..1a31550a8 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -348,7 +348,11 @@ impl FreezeTokensScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Frozen Successfully!"); + if self.group_action_id.is_some() { + ui.label("Group Freeze Signing Successful."); + } else { + ui.heading("Freeze Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/mint_tokens_screen.rs b/src/ui/tokens/mint_tokens_screen.rs index e4257f10a..eee35c3fd 100644 --- a/src/ui/tokens/mint_tokens_screen.rs +++ b/src/ui/tokens/mint_tokens_screen.rs @@ -384,7 +384,11 @@ impl MintTokensScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Mint Successful!"); + if self.group_action_id.is_some() { + ui.label("Group Mint Signing Successful."); + } else { + ui.heading("Mint Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 29ae1abd5..54829b5fc 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -309,7 +309,11 @@ impl PauseTokensScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Paused Successfully!"); + if self.group_action_id.is_some() { + ui.label("Group Pause Signing Successful."); + } else { + ui.heading("Pause Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 6520bf951..3130a1220 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -308,7 +308,11 @@ impl ResumeTokensScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Resumed Successfully!"); + if self.group_action_id.is_some() { + ui.label("Group Resume Signing Successful."); + } else { + ui.heading("Resume Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index 2bd9e4a38..5ca38f0ac 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -345,7 +345,11 @@ impl UnfreezeTokensScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading("Unfroze Successfully!"); + if self.group_action_id.is_some() { + ui.label("Group Unfreeze Signing Successful."); + } else { + ui.heading("Unfreeze Successful."); + } ui.add_space(20.0); diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index 80b2da596..62141b8ec 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -781,7 +781,11 @@ impl UpdateTokenConfigScreen { ui.add_space(50.0); ui.heading("🎉"); - ui.heading(format!("{}", self.backend_message.as_ref().unwrap().0)); + if self.group_action_id.is_some() { + ui.label("Group Update Signing Successful."); + } else { + ui.heading(format!("{}", self.backend_message.as_ref().unwrap().0)); + } ui.add_space(20.0); From 52424eebd04aa4ec316b357ab49c4b34c8b95fe8 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 16:02:59 +0700 Subject: [PATCH 12/20] fix unused error message on token screen builds --- Cargo.lock | 42 ++++++++++---------- Cargo.toml | 2 +- src/ui/tokens/burn_tokens_screen.rs | 2 +- src/ui/tokens/claim_tokens_screen.rs | 2 +- src/ui/tokens/destroy_frozen_funds_screen.rs | 2 +- src/ui/tokens/freeze_tokens_screen.rs | 2 +- src/ui/tokens/mint_tokens_screen.rs | 2 +- src/ui/tokens/pause_tokens_screen.rs | 2 +- src/ui/tokens/resume_tokens_screen.rs | 2 +- src/ui/tokens/unfreeze_tokens_screen.rs | 2 +- src/ui/tokens/update_token_config.rs | 2 +- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03043ea50..659c66c3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1430,7 +1430,7 @@ dependencies = [ [[package]] name = "dapi-grpc" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1448,7 +1448,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "heck", "quote", @@ -1545,7 +1545,7 @@ dependencies = [ [[package]] name = "dash-sdk" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "arc-swap", "async-trait", @@ -1657,7 +1657,7 @@ dependencies = [ [[package]] name = "dashpay-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -1668,7 +1668,7 @@ dependencies = [ [[package]] name = "data-contracts" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1919,7 +1919,7 @@ checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "dpns-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -1930,7 +1930,7 @@ dependencies = [ [[package]] name = "dpp" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "anyhow", "async-trait", @@ -1972,7 +1972,7 @@ dependencies = [ [[package]] name = "drive" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "bincode", "byteorder", @@ -1997,7 +1997,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "bincode", "dapi-grpc", @@ -2506,7 +2506,7 @@ dependencies = [ [[package]] name = "feature-flags-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -3760,7 +3760,7 @@ dependencies = [ [[package]] name = "keyword-search-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -3896,7 +3896,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -4910,7 +4910,7 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "platform-serialization" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "bincode", "platform-version", @@ -4919,7 +4919,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "proc-macro2", "quote", @@ -4930,7 +4930,7 @@ dependencies = [ [[package]] name = "platform-value" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "base64 0.22.1", "bincode", @@ -4950,7 +4950,7 @@ dependencies = [ [[package]] name = "platform-version" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "bincode", "grovedb-version", @@ -4962,7 +4962,7 @@ dependencies = [ [[package]] name = "platform-versioning" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "proc-macro2", "quote", @@ -5487,7 +5487,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "backon", "chrono", @@ -6499,7 +6499,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token-history-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -7072,7 +7072,7 @@ dependencies = [ [[package]] name = "wallet-utils-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "platform-value", "platform-version", @@ -8008,7 +8008,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=9724a7cca47adfdec338ed35b484b9b1c7d5da61#9724a7cca47adfdec338ed35b484b9b1c7d5da61" +source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/Cargo.toml b/Cargo.toml index 82b9c0053..168e9a517 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ rfd = "0.15.1" qrcode = "0.14.1" eframe = { version = "0.31.1", features = ["persistence"] } base64 = "0.22.1" -dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "9724a7cca47adfdec338ed35b484b9b1c7d5da61" } +dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "6b40214f878ef8d5580253694a117231112c7a93" } thiserror = "2" serde = "1.0.219" serde_json = "1.0.140" diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index 80ae64f9b..73fb08a04 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -169,7 +169,7 @@ impl BurnTokensScreen { amount_to_burn: String::new(), public_note: None, status: BurnTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/claim_tokens_screen.rs b/src/ui/tokens/claim_tokens_screen.rs index 3fa61d516..4422c8229 100644 --- a/src/ui/tokens/claim_tokens_screen.rs +++ b/src/ui/tokens/claim_tokens_screen.rs @@ -111,7 +111,7 @@ impl ClaimTokensScreen { token_configuration, distribution_type, status: ClaimTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index 19c2f96c8..b55249e94 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -182,7 +182,7 @@ impl DestroyFrozenFundsScreen { group_action_id: None, public_note: None, status: DestroyFrozenFundsStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index 1a31550a8..dd562c978 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -174,7 +174,7 @@ impl FreezeTokensScreen { public_note: None, freeze_identity_id: String::new(), status: FreezeTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/mint_tokens_screen.rs b/src/ui/tokens/mint_tokens_screen.rs index eee35c3fd..3bcf49fc0 100644 --- a/src/ui/tokens/mint_tokens_screen.rs +++ b/src/ui/tokens/mint_tokens_screen.rs @@ -170,7 +170,7 @@ impl MintTokensScreen { recipient_identity_id: "".to_string(), amount_to_mint: "".to_string(), status: MintTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 54829b5fc..634f07f00 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -169,7 +169,7 @@ impl PauseTokensScreen { group_action_id: None, public_note: None, status: PauseTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index 3130a1220..7bbf1d3ac 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -168,7 +168,7 @@ impl ResumeTokensScreen { group_action_id: None, public_note: None, status: ResumeTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index 5ca38f0ac..6bdb006d7 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -175,7 +175,7 @@ impl UnfreezeTokensScreen { public_note: None, unfreeze_identity_id: String::new(), status: UnfreezeTokensStatus::NotStarted, - error_message: None, + error_message, app_context: app_context.clone(), show_confirmation_popup: false, selected_wallet, diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index 62141b8ec..7a3aca3cb 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -185,7 +185,7 @@ impl UpdateTokenConfigScreen { selected_wallet, wallet_password: String::new(), show_password: false, - error_message: None, // unused + error_message, identity: identity_token_info.identity, group, From 90b382cbdf5e5920f44e7e2eca87b91f3cbd3734 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 16:55:52 +0700 Subject: [PATCH 13/20] handle error in group actions screen rather than expect --- .../group_actions_screen.rs | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/ui/contracts_documents/group_actions_screen.rs b/src/ui/contracts_documents/group_actions_screen.rs index 8ce04ff80..89669166c 100644 --- a/src/ui/contracts_documents/group_actions_screen.rs +++ b/src/ui/contracts_documents/group_actions_screen.rs @@ -86,7 +86,10 @@ impl GroupActionsScreen { pub fn new(app_context: &Arc) -> Self { let qualified_identities = app_context .load_local_qualified_identities() - .expect("Failed to load identities"); + .unwrap_or_else(|_| { + tracing::info!("Failed to load local qualified identities"); + vec![] + }); let contracts_with_group_actions = app_context.db.get_contracts(app_context, None, None).unwrap_or_default().into_iter().filter_map(|qualified_contract| { let tokens = qualified_contract.contract.tokens().clone().into_iter().filter_map(|(pos, token_config)| { @@ -119,9 +122,13 @@ impl GroupActionsScreen { } }).collect(); - let identity_token_balances = app_context - .identity_token_balances() - .expect("Failed to load identity token balances"); + let identity_token_balances = match app_context.identity_token_balances() { + Ok(identity_token_balances) => identity_token_balances, + Err(e) => { + tracing::error!("Failed to load identity token balances: {}", e); + IndexMap::new() + } + }; Self { // Contract and identity selectors @@ -141,7 +148,7 @@ impl GroupActionsScreen { } fn render_group_actions( - &self, + &mut self, ui: &mut egui::Ui, group_actions: &IndexMap, ) -> AppAction { @@ -312,8 +319,8 @@ impl GroupActionsScreen { .token_contract_position() .clone(), }; - let token_id = self.selected_contract.clone().expect("No contract selected").contract.token_id(token_contract_position).expect("No token ID found"); - let identity_token_balance = self + let token_id = self.selected_contract.clone().expect("No contract selected").contract.token_id(token_contract_position).expect("No token ID found at the given position"); + let identity_token_balance = match self .identity_token_balances .get(&IdentityTokenIdentifier { token_id, @@ -323,9 +330,26 @@ impl GroupActionsScreen { .identity .id() }) - .cloned() - .expect("Failed to get identity token balance"); - let identity_token_info = IdentityTokenInfo::try_from_identity_token_balance_with_lookup(&identity_token_balance, &self.app_context).expect("Failed to convert identity token balance"); + .cloned() { + Some(identity_token_balance) => identity_token_balance, + None => { + self.fetch_group_actions_status = + FetchGroupActionsStatus::ErrorMessage( + "No identity token balance found".to_string(), + ); + return; + } + }; + let identity_token_info = match IdentityTokenInfo::try_from_identity_token_balance_with_lookup(&identity_token_balance, &self.app_context) { + Ok(identity_token_info) => identity_token_info, + Err(e) => { + self.fetch_group_actions_status = + FetchGroupActionsStatus::ErrorMessage( + format!("Failed to get identity token info: {}", e), + ); + return; + } + }; match typ { "Mint" => { let mut mint_screen = @@ -613,10 +637,11 @@ impl ScreenLike for GroupActionsScreen { if let FetchGroupActionsStatus::Complete(group_actions) = &self.fetch_group_actions_status { + let group_actions = group_actions.clone(); ui.add_space(10.0); ui.separator(); ui.add_space(10.0); - action |= self.render_group_actions(ui, group_actions); + action |= self.render_group_actions(ui, &group_actions); } }); From a8604b100dbfd6d82435bc4a3efd37954bc805b4 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 17:43:33 +0700 Subject: [PATCH 14/20] insert identity token balances when inserting identity --- src/database/tokens.rs | 7 +++++++ src/ui/tokens/tokens_screen.rs | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/database/tokens.rs b/src/database/tokens.rs index fa1c92486..896eefb4b 100644 --- a/src/database/tokens.rs +++ b/src/database/tokens.rs @@ -1,6 +1,7 @@ use bincode::{self, config::standard}; use dash_sdk::dpp::dashcore::Network; use dash_sdk::dpp::data_contract::TokenConfiguration; +use dash_sdk::dpp::identity::accessors::IdentityGettersV0; use dash_sdk::platform::Identifier; use dash_sdk::query_types::IndexMap; use rusqlite::params; @@ -122,6 +123,12 @@ impl Database { ], )?; + // Insert an identity token balance of 0 for each identity for this token + let wallets = app_context.wallets.read().unwrap(); + for identity in self.get_local_qualified_identities(app_context, &wallets)? { + self.insert_identity_token_balance(&token_id, &identity.identity.id(), 0, app_context)?; + } + Ok(()) } diff --git a/src/ui/tokens/tokens_screen.rs b/src/ui/tokens/tokens_screen.rs index 35c3cb6b6..75874f225 100644 --- a/src/ui/tokens/tokens_screen.rs +++ b/src/ui/tokens/tokens_screen.rs @@ -4888,9 +4888,13 @@ Emits tokens in fixed amounts for specific intervals. self.display_message("Added token", MessageType::Success); - AppAction::BackendTask(BackendTask::TokenTask(TokenTask::SaveTokenLocally( - token_info, - ))) + AppAction::BackendTasks( + vec![ + BackendTask::TokenTask(TokenTask::SaveTokenLocally(token_info)), + BackendTask::TokenTask(TokenTask::QueryMyTokenBalances), + ], + BackendTasksExecutionMode::Sequential, + ) } fn goto_next_search_page(&mut self) -> AppAction { From cc3ecba07827383a792d3c129c049c26a40bc5f7 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 17:47:57 +0700 Subject: [PATCH 15/20] fix tokens screens routing to the wrong screens --- src/ui/mod.rs | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index e23624470..244573175 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -322,27 +322,18 @@ impl ScreenType { app_context, )) } - ScreenType::FreezeTokensScreen(identity_token_info) => { - Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_info.clone(), - app_context, - )) - } - ScreenType::UnfreezeTokensScreen(identity_token_info) => { - Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_info.clone(), - app_context, - )) - } - ScreenType::PauseTokensScreen(identity_token_info) => Screen::DestroyFrozenFundsScreen( - DestroyFrozenFundsScreen::new(identity_token_info.clone(), app_context), + ScreenType::FreezeTokensScreen(identity_token_info) => Screen::FreezeTokensScreen( + FreezeTokensScreen::new(identity_token_info.clone(), app_context), + ), + ScreenType::UnfreezeTokensScreen(identity_token_info) => Screen::UnfreezeTokensScreen( + UnfreezeTokensScreen::new(identity_token_info.clone(), app_context), + ), + ScreenType::PauseTokensScreen(identity_token_info) => Screen::PauseTokensScreen( + PauseTokensScreen::new(identity_token_info.clone(), app_context), + ), + ScreenType::ResumeTokensScreen(identity_token_info) => Screen::ResumeTokensScreen( + ResumeTokensScreen::new(identity_token_info.clone(), app_context), ), - ScreenType::ResumeTokensScreen(identity_token_info) => { - Screen::DestroyFrozenFundsScreen(DestroyFrozenFundsScreen::new( - identity_token_info.clone(), - app_context, - )) - } ScreenType::ClaimTokensScreen(_) => { unreachable!(); } From 77a4d174538781abb84ec8c6e4b4da8be083d18d Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 17:54:01 +0700 Subject: [PATCH 16/20] query token balances after adding new token --- src/ui/tokens/add_token_by_id_screen.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ui/tokens/add_token_by_id_screen.rs b/src/ui/tokens/add_token_by_id_screen.rs index b1ced076c..c5296f967 100644 --- a/src/ui/tokens/add_token_by_id_screen.rs +++ b/src/ui/tokens/add_token_by_id_screen.rs @@ -137,9 +137,17 @@ impl AddTokenByIdScreen { InsertTokensToo::SomeTokensShouldBeAdded(vec![tok.token_position]); // None for alias; change if you allow user alias input - return AppAction::BackendTask(BackendTask::ContractTask( - ContractTask::SaveDataContract(contract.clone(), None, insert_mode), - )); + return AppAction::BackendTasks( + vec![ + BackendTask::ContractTask(ContractTask::SaveDataContract( + contract.clone(), + None, + insert_mode, + )), + BackendTask::TokenTask(TokenTask::QueryMyTokenBalances), + ], + crate::app::BackendTasksExecutionMode::Sequential, + ); } } AppAction::None From 973c3fd527763c0e02ec7422a47cae0f9131f2f8 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 20:04:12 +0700 Subject: [PATCH 17/20] fix --- src/ui/tokens/tokens_screen.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ui/tokens/tokens_screen.rs b/src/ui/tokens/tokens_screen.rs index 75874f225..de5d373c2 100644 --- a/src/ui/tokens/tokens_screen.rs +++ b/src/ui/tokens/tokens_screen.rs @@ -1766,8 +1766,6 @@ impl TokensScreen { // self.sort_vec(&mut detail_list); // } - // This is basically your old `render_table_my_token_balances` logic, but - // limited to just the single token. // Allocate space for refreshing indicator let refreshing_height = 33.0; let mut max_scroll_height = if let RefreshingStatus::Refreshing(_) = self.refreshing_status From 77006723e047bfa2bc0dd3681565e7464f37d381 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 19 May 2025 20:05:22 +0700 Subject: [PATCH 18/20] fix --- src/ui/contracts_documents/group_actions_screen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/contracts_documents/group_actions_screen.rs b/src/ui/contracts_documents/group_actions_screen.rs index 89669166c..db6719dcb 100644 --- a/src/ui/contracts_documents/group_actions_screen.rs +++ b/src/ui/contracts_documents/group_actions_screen.rs @@ -187,7 +187,7 @@ impl GroupActionsScreen { }); } header.col(|ui| { - ui.label(""); // No header for button + ui.label(""); }); }) .body(|mut body| { From 97900e046a69f9f31e2b7cadb82975e15f83e57a Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 19 May 2025 16:16:41 +0200 Subject: [PATCH 19/20] update sdk to rc.11 --- Cargo.lock | 931 +++++++++--------- Cargo.toml | 2 +- src/backend_task/tokens/claim_tokens.rs | 2 - .../group_actions_screen.rs | 4 +- 4 files changed, 465 insertions(+), 474 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 659c66c3a..bc8b95278 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,7 +49,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" dependencies = [ "accesskit", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "immutable-chunkmap", ] @@ -61,7 +61,7 @@ checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", @@ -93,7 +93,7 @@ checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "paste", "static_assertions", "windows", @@ -166,16 +166,16 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "serde", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -200,7 +200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.9.0", + "bitflags 2.9.1", "cc", "cesu8", "jni", @@ -309,11 +309,11 @@ dependencies = [ "clipboard-win", "image", "log", - "objc2 0.6.0", - "objc2-app-kit 0.3.0", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.1", "parking_lot", "percent-encoding", "windows-sys 0.59.0", @@ -387,7 +387,7 @@ dependencies = [ "serde", "serde_repr", "url", - "zbus 5.5.0", + "zbus 5.7.0", ] [[package]] @@ -416,14 +416,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] @@ -506,7 +507,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -541,7 +542,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -632,9 +633,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -802,9 +803,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -832,9 +833,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -869,11 +870,11 @@ dependencies = [ [[package]] name = "block2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d59b4c170e16f0405a2e95aff44432a0d41aa97675f3d52623effe95792a037" +checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" dependencies = [ - "objc2 0.6.0", + "objc2 0.6.1", ] [[package]] @@ -962,9 +963,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" dependencies = [ "bytemuck_derive", ] @@ -977,7 +978,7 @@ checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1007,7 +1008,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "log", "polling", "rustix 0.38.44", @@ -1029,9 +1030,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.19" +version = "1.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" dependencies = [ "jobserver", "libc", @@ -1077,9 +1078,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1424,17 +1425,17 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "dapi-grpc" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "dapi-grpc-macros", "futures-core", - "getrandom 0.2.15", + "getrandom 0.2.16", "platform-version", "prost", "serde", @@ -1447,12 +1448,12 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "heck", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1476,7 +1477,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1487,7 +1488,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1500,7 +1501,7 @@ dependencies = [ "base64 0.22.1", "bincode", "bip39", - "bitflags 2.9.0", + "bitflags 2.9.1", "chrono", "chrono-humanize", "crossbeam-channel", @@ -1544,8 +1545,8 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "arc-swap", "async-trait", @@ -1585,7 +1586,7 @@ dependencies = [ "anyhow", "base64-compat", "bech32", - "bitflags 2.9.0", + "bitflags 2.9.1", "blake3", "blsful", "dashcore-private", @@ -1656,8 +1657,8 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -1667,8 +1668,8 @@ dependencies = [ [[package]] name = "data-contracts" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1712,7 +1713,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1733,7 +1734,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1743,7 +1744,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1772,7 +1773,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "unicode-xid", ] @@ -1784,7 +1785,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1863,10 +1864,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.9.1", + "block2 0.6.1", "libc", - "objc2 0.6.0", + "objc2 0.6.1", +] + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", ] [[package]] @@ -1877,7 +1888,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1912,14 +1923,14 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" [[package]] name = "dpns-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -1929,8 +1940,8 @@ dependencies = [ [[package]] name = "dpp" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "anyhow", "async-trait", @@ -1945,7 +1956,7 @@ dependencies = [ "data-contracts", "derive_more 1.0.0", "env_logger", - "getrandom 0.2.15", + "getrandom 0.2.16", "hex", "indexmap 2.9.0", "integer-encoding", @@ -1971,8 +1982,8 @@ dependencies = [ [[package]] name = "drive" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "bincode", "byteorder", @@ -1996,8 +2007,8 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "bincode", "dapi-grpc", @@ -2119,7 +2130,7 @@ checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" dependencies = [ "accesskit", "ahash", - "bitflags 2.9.0", + "bitflags 2.9.1", "emath", "epaint", "log", @@ -2309,7 +2320,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2330,7 +2341,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2351,7 +2362,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2362,7 +2373,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2430,9 +2441,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -2440,9 +2451,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "event-listener" @@ -2505,8 +2516,8 @@ dependencies = [ [[package]] name = "feature-flags-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -2595,7 +2606,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2700,7 +2711,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2766,9 +2777,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -2779,9 +2790,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", @@ -2848,22 +2859,22 @@ dependencies = [ [[package]] name = "glutin" -version = "0.32.2" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03642b8b0cce622392deb0ee3e88511f75df2daac806102597905c3ea1974848" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg_aliases", "cgl", - "core-foundation 0.9.4", - "dispatch", + "dispatch2 0.3.0", "glutin_egl_sys", "glutin_glx_sys", "glutin_wgl_sys", "libloading", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", "once_cell", "raw-window-handle 0.6.2", "wayland-sys", @@ -2918,7 +2929,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "gpu-alloc-types", ] @@ -2928,7 +2939,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -2937,9 +2948,9 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "gpu-descriptor-types", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -2948,7 +2959,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -3055,9 +3066,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -3109,9 +3120,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -3385,7 +3396,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.0", + "windows-core 0.61.1", ] [[package]] @@ -3399,21 +3410,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -3422,31 +3434,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -3454,67 +3446,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -3534,9 +3513,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -3582,7 +3561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -3657,9 +3636,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.8" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ad87c89110f55e4cd4dc2893a9790820206729eaf221555f742d540b0724a0" +checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806" dependencies = [ "jiff-static", "log", @@ -3670,13 +3649,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.8" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d076d5b64a7e2fe6f0743f02c43ca4a6725c0f904203bfe276a5b3e793103605" +checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3707,7 +3686,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "libc", ] @@ -3759,8 +3738,8 @@ dependencies = [ [[package]] name = "keyword-search-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -3805,12 +3784,12 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.53.0", ] [[package]] @@ -3819,9 +3798,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", ] [[package]] @@ -3849,9 +3828,9 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" @@ -3881,7 +3860,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -3895,8 +3874,8 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -3955,7 +3934,7 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -3972,9 +3951,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess2" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54028747dfea8e8bf00d3c2d4e83cf023c1accfd5d436335456e9864940cb85" +checksum = "1706dc14a2e140dec0a7a07109d9a3d5890b81e85bd6c60b906b249a77adf0ca" dependencies = [ "mime", "phf", @@ -4024,9 +4003,9 @@ dependencies = [ [[package]] name = "multimap" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "murmur3" @@ -4042,7 +4021,7 @@ checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" dependencies = [ "arrayvec", "bit-set 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg_aliases", "codespan-reporting", "hexf-parse", @@ -4102,7 +4081,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -4141,7 +4120,20 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -4225,7 +4217,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4318,7 +4310,7 @@ dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4359,9 +4351,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" dependencies = [ "objc2-encode", ] @@ -4372,7 +4364,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4384,15 +4376,16 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", - "objc2 0.6.0", + "bitflags 2.9.1", + "block2 0.6.1", + "objc2 0.6.1", + "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.1", ] [[package]] @@ -4401,7 +4394,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -4425,7 +4418,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4433,22 +4426,24 @@ dependencies = [ [[package]] name = "objc2-core-foundation" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.9.1", + "dispatch2 0.3.0", + "objc2 0.6.1", ] [[package]] name = "objc2-core-graphics" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.9.1", + "dispatch2 0.3.0", + "objc2 0.6.1", "objc2-core-foundation", "objc2-io-surface", ] @@ -4489,7 +4484,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "dispatch", "libc", @@ -4498,23 +4493,23 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.9.1", + "objc2 0.6.1", "objc2-core-foundation", ] [[package]] name = "objc2-io-surface" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161a8b87e32610086e1a7a9e9ec39f84459db7b3a0881c1f16ca5a2605581c19" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.9.1", + "objc2 0.6.1", "objc2-core-foundation", ] @@ -4536,7 +4531,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4548,7 +4543,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4571,7 +4566,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "objc2 0.5.2", "objc2-cloud-kit", @@ -4603,7 +4598,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -4646,7 +4641,7 @@ version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "foreign-types 0.3.2", "libc", @@ -4663,7 +4658,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4674,9 +4669,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -4766,7 +4761,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", "smallvec", "windows-targets 0.52.6", ] @@ -4834,7 +4829,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "unicase", ] @@ -4865,7 +4860,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4909,8 +4904,8 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "platform-serialization" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "bincode", "platform-version", @@ -4918,19 +4913,19 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "virtue 0.0.17", ] [[package]] name = "platform-value" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "base64 0.22.1", "bincode", @@ -4949,8 +4944,8 @@ dependencies = [ [[package]] name = "platform-version" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "bincode", "grovedb-version", @@ -4961,12 +4956,12 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5030,6 +5025,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -5042,7 +5046,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy", ] [[package]] @@ -5052,7 +5056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5071,7 +5075,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.22.26", ] [[package]] @@ -5115,7 +5119,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.100", + "syn 2.0.101", "tempfile", ] @@ -5129,7 +5133,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5147,7 +5151,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "memchr", "unicase", ] @@ -5173,9 +5177,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.37.4" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", ] @@ -5248,7 +5252,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -5257,7 +5261,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -5275,7 +5279,7 @@ version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -5321,11 +5325,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -5334,7 +5338,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -5441,14 +5445,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" dependencies = [ "ashpd", - "block2 0.6.0", - "dispatch2", + "block2 0.6.1", + "dispatch2 0.2.0", "js-sys", "log", - "objc2 0.6.0", - "objc2-app-kit 0.3.0", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.1", "pollster", "raw-window-handle 0.6.2", "urlencoding", @@ -5466,7 +5470,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -5479,21 +5483,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.9.1", "serde", "serde_derive", ] [[package]] name = "rs-dapi-client" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "backon", "chrono", "dapi-grpc", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "gloo-timers", "hex", "http", @@ -5516,7 +5520,7 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -5526,9 +5530,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.7.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fbc0ee50fcb99af7cebb442e5df7b5b45e9460ffa3f8f549cd26b862bec49d" +checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -5537,22 +5541,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.7.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf418c9a2e3f6663ca38b8a7134cc2c2167c9d69688860e8961e3faa731702e" +checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.100", + "syn 2.0.101", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.7.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d55b95147fe01265d06b3955db798bdaed52e60e2211c41137701b3aba8e21" +checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" dependencies = [ "sha2", "walkdir", @@ -5585,7 +5589,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -5594,11 +5598,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", @@ -5607,9 +5611,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "log", "once_cell", @@ -5643,15 +5647,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -5754,7 +5761,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -5767,7 +5774,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -5825,7 +5832,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5849,7 +5856,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5898,7 +5905,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5937,9 +5944,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -5973,9 +5980,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -6031,7 +6038,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "calloop", "calloop-wayland-source", "cursor-icon", @@ -6095,7 +6102,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -6170,7 +6177,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6201,9 +6208,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -6221,13 +6228,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6236,7 +6243,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6278,14 +6285,14 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -6371,7 +6378,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6382,7 +6389,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6473,9 +6480,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -6498,8 +6505,8 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token-history-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -6509,9 +6516,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -6533,7 +6540,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6569,9 +6576,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -6583,21 +6590,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.24", + "toml_edit 0.22.26", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] @@ -6615,22 +6622,22 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.6", + "winnow 0.7.10", ] [[package]] name = "tonic" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85839f0b32fd242bb3209262371d07feda6d780d16ee9d2bc88581b89da1549b" +checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" dependencies = [ "async-trait", "base64 0.22.1", @@ -6654,21 +6661,21 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] name = "tonic-build" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85f0383fadd15609306383a90e85eaed44169f931a5d2be1b42c76ceff1825e" +checksum = "eac6f67be712d12f0b41328db3137e0d0757645d8904b4cb7d51cd9c2279e847" dependencies = [ "prettyplease", "proc-macro2", "prost-build", "prost-types", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6746,7 +6753,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6917,7 +6924,7 @@ dependencies = [ "rustls-pki-types", "ureq-proto", "utf-8", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -6956,12 +6963,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -6980,7 +6981,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -7071,8 +7072,8 @@ dependencies = [ [[package]] name = "wallet-utils-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "platform-value", "platform-version", @@ -7126,7 +7127,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -7161,7 +7162,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7190,9 +7191,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" dependencies = [ "cc", "downcast-rs", @@ -7204,11 +7205,11 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "rustix 0.38.44", "wayland-backend", "wayland-scanner", @@ -7220,16 +7221,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" dependencies = [ "rustix 0.38.44", "wayland-client", @@ -7238,11 +7239,11 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.6" +version = "0.32.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7250,11 +7251,11 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7263,11 +7264,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7281,7 +7282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", - "quick-xml 0.37.4", + "quick-xml 0.37.5", "quote", ] @@ -7328,17 +7329,26 @@ dependencies = [ "jni", "log", "ndk-context", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "objc2 0.6.1", + "objc2-foundation 0.3.1", "url", "web-sys", ] [[package]] name = "webpki-roots" -version = "0.26.8" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] @@ -7366,7 +7376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35904fb00ba2d2e0a4d002fcbbb6e1b89b574d272a50e5fc95f6e81cf281c245" dependencies = [ "arrayvec", - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg_aliases", "document-features", "js-sys", @@ -7392,7 +7402,7 @@ checksum = "671c25545d479b47d3f0a8e373aceb2060b67c6eb841b24ac8c32348151c7a0c" dependencies = [ "arrayvec", "bit-vec 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg_aliases", "document-features", "indexmap 2.9.0", @@ -7418,7 +7428,7 @@ dependencies = [ "android_system_properties", "arrayvec", "ash", - "bitflags 2.9.0", + "bitflags 2.9.1", "bytemuck", "cfg_aliases", "core-graphics-types", @@ -7456,7 +7466,7 @@ version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "js-sys", "log", "web-sys", @@ -7530,15 +7540,15 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "46ec44dc15085cea82cf9c78f85a9114c463a369786585ad2882d1ff0b0acf40" dependencies = [ "windows-implement 0.60.0", "windows-interface 0.59.1", "windows-link", - "windows-result 0.3.2", - "windows-strings 0.4.0", + "windows-result 0.3.3", + "windows-strings 0.4.1", ] [[package]] @@ -7549,7 +7559,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7560,7 +7570,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7571,7 +7581,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7582,7 +7592,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7597,7 +7607,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result 0.3.2", + "windows-result 0.3.3", "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -7613,9 +7623,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" dependencies = [ "windows-link", ] @@ -7641,9 +7651,9 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "2a7ab927b2637c19b3dbe0965e75d8f2d30bdd697a1516191cad2ec4df8fb28a" dependencies = [ "windows-link", ] @@ -7928,14 +7938,14 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winit" -version = "0.30.9" +version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" +checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.9.0", + "bitflags 2.9.1", "block2 0.5.1", "bytemuck", "calloop", @@ -7989,9 +7999,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] @@ -8002,13 +8012,13 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] name = "withdrawals-contract" -version = "2.0.0-rc.10" -source = "git+https://github.com/dashpay/platform.git?rev=6b40214f878ef8d5580253694a117231112c7a93#6b40214f878ef8d5580253694a117231112c7a93" +version = "2.0.0-rc.11" +source = "git+https://github.com/dashpay/platform.git?rev=9c98e6b72cd250dd7ea9ded1d74fe84d17733915#9c98e6b72cd250dd7ea9ded1d74fe84d17733915" dependencies = [ "num_enum 0.5.11", "platform-value", @@ -8019,17 +8029,11 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -8094,7 +8098,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "dlib", "log", "once_cell", @@ -8115,9 +8119,9 @@ checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -8127,13 +8131,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -8159,7 +8163,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix", + "nix 0.29.0", "ordered-stream", "rand 0.8.5", "serde", @@ -8177,13 +8181,12 @@ dependencies = [ [[package]] name = "zbus" -version = "5.5.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" +checksum = "88232b74ba057a0c85472ec1bae8a17569960be17da2d5e5ad30d5efe7ea6719" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -8196,19 +8199,17 @@ dependencies = [ "futures-core", "futures-lite", "hex", - "nix", + "nix 0.30.1", "ordered-stream", "serde", "serde_repr", - "static_assertions", "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.6", - "xdg-home", - "zbus_macros 5.5.0", + "winnow 0.7.10", + "zbus_macros 5.7.0", "zbus_names 4.2.0", - "zvariant 5.4.0", + "zvariant 5.5.3", ] [[package]] @@ -8229,7 +8230,7 @@ checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zbus-lockstep", "zbus_xml", "zvariant 4.2.0", @@ -8244,22 +8245,22 @@ dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zvariant_utils 2.1.0", ] [[package]] name = "zbus_macros" -version = "5.5.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" +checksum = "6969c06899233334676e60da1675740539cf034ee472a6c5b5c54e50a0a554c9" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zbus_names 4.2.0", - "zvariant 5.4.0", + "zvariant 5.5.3", "zvariant_utils 3.2.0", ] @@ -8282,8 +8283,8 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.6", - "zvariant 5.4.0", + "winnow 0.7.10", + "zvariant 5.5.3", ] [[package]] @@ -8301,42 +8302,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive 0.8.24", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8356,7 +8337,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -8378,7 +8359,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8418,11 +8399,22 @@ dependencies = [ "dircpy", ] +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -8431,27 +8423,29 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "zip" -version = "2.6.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" dependencies = [ "arbitrary", "crc32fast", "crossbeam-utils", + "displaydoc", "flate2", "indexmap 2.9.0", "memchr", + "thiserror 2.0.12", "zopfli", ] @@ -8504,17 +8498,16 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", "url", - "winnow 0.7.6", - "zvariant_derive 5.4.0", + "winnow 0.7.10", + "zvariant_derive 5.5.3", "zvariant_utils 3.2.0", ] @@ -8527,20 +8520,20 @@ dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zvariant_utils 2.1.0", ] [[package]] name = "zvariant_derive" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zvariant_utils 3.2.0", ] @@ -8552,7 +8545,7 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8565,8 +8558,8 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.100", - "winnow 0.7.6", + "syn 2.0.101", + "winnow 0.7.10", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 168e9a517..76ee7ae2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ rfd = "0.15.1" qrcode = "0.14.1" eframe = { version = "0.31.1", features = ["persistence"] } base64 = "0.22.1" -dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "6b40214f878ef8d5580253694a117231112c7a93" } +dash-sdk = { git = "https://github.com/dashpay/platform.git", rev = "9c98e6b72cd250dd7ea9ded1d74fe84d17733915" } thiserror = "2" serde = "1.0.219" serde_json = "1.0.140" diff --git a/src/backend_task/tokens/claim_tokens.rs b/src/backend_task/tokens/claim_tokens.rs index 53c22c71c..b3bcc0647 100644 --- a/src/backend_task/tokens/claim_tokens.rs +++ b/src/backend_task/tokens/claim_tokens.rs @@ -5,9 +5,7 @@ use crate::model::qualified_identity::QualifiedIdentity; use crate::model::proof_log_item::{ProofLogItem, RequestType}; use dash_sdk::dpp::data_contract::associated_token::token_distribution_key::TokenDistributionType; use dash_sdk::dpp::identity::accessors::IdentityGettersV0; -use dash_sdk::dpp::state_transition::batch_transition::methods::StateTransitionCreationOptions; use dash_sdk::dpp::state_transition::proof_result::StateTransitionProofResult; -use dash_sdk::dpp::state_transition::StateTransitionSigningOptions; use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; use dash_sdk::platform::transition::fungible_tokens::claim::TokenClaimTransitionBuilder; use dash_sdk::platform::{DataContract, IdentityPublicKey}; diff --git a/src/ui/contracts_documents/group_actions_screen.rs b/src/ui/contracts_documents/group_actions_screen.rs index 89669166c..78d5acdf5 100644 --- a/src/ui/contracts_documents/group_actions_screen.rs +++ b/src/ui/contracts_documents/group_actions_screen.rs @@ -201,9 +201,9 @@ impl GroupActionsScreen { format!("{} to {}", amount, identifier), format!("{}", note_opt.clone().unwrap_or_default()), ), - TokenEvent::Burn(amount, note_opt) => ( + TokenEvent::Burn(amount, burn_from, note_opt) => ( "Burn", - format!("{}", amount), + format!("{} from {}", amount, burn_from), format!("{}", note_opt.clone().unwrap_or_default()), ), TokenEvent::Freeze(identifier, note_opt) => ( From f85ffe2aeb195952c5e4c659c00b4baab03eac24 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Tue, 20 May 2025 07:34:05 +0200 Subject: [PATCH 20/20] restricted keys --- src/ui/tokens/burn_tokens_screen.rs | 6 +----- src/ui/tokens/destroy_frozen_funds_screen.rs | 6 +----- src/ui/tokens/freeze_tokens_screen.rs | 6 +----- src/ui/tokens/pause_tokens_screen.rs | 6 +----- src/ui/tokens/resume_tokens_screen.rs | 6 +----- src/ui/tokens/unfreeze_tokens_screen.rs | 6 +----- src/ui/tokens/update_token_config.rs | 6 +----- 7 files changed, 7 insertions(+), 35 deletions(-) diff --git a/src/ui/tokens/burn_tokens_screen.rs b/src/ui/tokens/burn_tokens_screen.rs index e424d7077..493f0cb1e 100644 --- a/src/ui/tokens/burn_tokens_screen.rs +++ b/src/ui/tokens/burn_tokens_screen.rs @@ -76,11 +76,7 @@ impl BurnTokensScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, ) diff --git a/src/ui/tokens/destroy_frozen_funds_screen.rs b/src/ui/tokens/destroy_frozen_funds_screen.rs index c051553a5..afab8e2eb 100644 --- a/src/ui/tokens/destroy_frozen_funds_screen.rs +++ b/src/ui/tokens/destroy_frozen_funds_screen.rs @@ -88,11 +88,7 @@ impl DestroyFrozenFundsScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, ) diff --git a/src/ui/tokens/freeze_tokens_screen.rs b/src/ui/tokens/freeze_tokens_screen.rs index 4a6a74c29..f540dba7f 100644 --- a/src/ui/tokens/freeze_tokens_screen.rs +++ b/src/ui/tokens/freeze_tokens_screen.rs @@ -80,11 +80,7 @@ impl FreezeTokensScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, ) diff --git a/src/ui/tokens/pause_tokens_screen.rs b/src/ui/tokens/pause_tokens_screen.rs index 77e536b1a..e54332790 100644 --- a/src/ui/tokens/pause_tokens_screen.rs +++ b/src/ui/tokens/pause_tokens_screen.rs @@ -76,11 +76,7 @@ impl PauseTokensScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, ) diff --git a/src/ui/tokens/resume_tokens_screen.rs b/src/ui/tokens/resume_tokens_screen.rs index ca83fa1fa..fe1d568fd 100644 --- a/src/ui/tokens/resume_tokens_screen.rs +++ b/src/ui/tokens/resume_tokens_screen.rs @@ -75,11 +75,7 @@ impl ResumeTokensScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, ) diff --git a/src/ui/tokens/unfreeze_tokens_screen.rs b/src/ui/tokens/unfreeze_tokens_screen.rs index cbd286e05..97ec305e6 100644 --- a/src/ui/tokens/unfreeze_tokens_screen.rs +++ b/src/ui/tokens/unfreeze_tokens_screen.rs @@ -81,11 +81,7 @@ impl UnfreezeTokensScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, ) diff --git a/src/ui/tokens/update_token_config.rs b/src/ui/tokens/update_token_config.rs index 56148a995..66ff44249 100644 --- a/src/ui/tokens/update_token_config.rs +++ b/src/ui/tokens/update_token_config.rs @@ -80,11 +80,7 @@ impl UpdateTokenConfigScreen { .identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::MEDIUM, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), KeyType::all_key_types().into(), false, )