Explorar el Código

app: run make fmt

jkds hace 2 semanas
padre
commit
e0fbeb54ff
Se han modificado 35 ficheros con 1046 adiciones y 739 borrados
  1. 1 3
      bin/app/src/app/locale.rs
  2. 4 7
      bin/app/src/app/node.rs
  3. 25 26
      bin/app/src/app/schema/menu/channel.rs
  4. 24 25
      bin/app/src/app/schema/menu/contact.rs
  5. 14 4
      bin/app/src/app/schema/menu/edit_buttons.rs
  6. 2 6
      bin/app/src/app/schema/menu/edit_switch.rs
  7. 15 21
      bin/app/src/app/schema/menu/mod.rs
  8. 1 1
      bin/app/src/app/schema/mod.rs
  9. 39 16
      bin/app/src/app/schema/wallet/main.rs
  10. 5 15
      bin/app/src/app/schema/wallet/mod.rs
  11. 6 4
      bin/app/src/app/schema/wallet/netstatus.rs
  12. 29 8
      bin/app/src/app/schema/wallet/receive.rs
  13. 51 25
      bin/app/src/app/schema/wallet/send.rs
  14. 25 10
      bin/app/src/app/schema/wallet/send_step1.rs
  15. 42 24
      bin/app/src/app/schema/wallet/send_step2.rs
  16. 81 39
      bin/app/src/app/schema/wallet/send_step3.rs
  17. 60 21
      bin/app/src/app/schema/wallet/send_step4.rs
  18. 36 14
      bin/app/src/app/schema/wallet/tx_status.rs
  19. 37 30
      bin/app/src/app/schema/wallet/util.rs
  20. 4 5
      bin/app/src/clipboard.rs
  21. 364 314
      bin/app/src/main.rs
  22. 9 7
      bin/app/src/plugin/darkirc2.rs
  23. 84 40
      bin/app/src/plugin/drk.rs
  24. 2 2
      bin/app/src/plugin/mod.rs
  25. 8 7
      bin/app/src/prop/wrap.rs
  26. 1 1
      bin/app/src/scene.rs
  27. 4 1
      bin/app/src/shape/blockchain_netlogo1.rs
  28. 4 1
      bin/app/src/shape/blockchain_netlogo2.rs
  29. 4 1
      bin/app/src/shape/blockchain_netlogo3.rs
  30. 4 1
      bin/app/src/shape/blockchain_netlogo4.rs
  31. 4 1
      bin/app/src/shape/copy.rs
  32. 10 6
      bin/app/src/ui/button.rs
  33. 6 3
      bin/app/src/ui/edit/mod.rs
  34. 24 6
      bin/app/src/ui/text.rs
  35. 17 44
      bin/app/src/ui/tokentable/mod.rs

+ 1 - 3
bin/app/src/app/locale.rs

@@ -22,9 +22,7 @@ use std::sync::mpsc::sync_channel;
 mod ui_consts {
     pub const LOCALE_PATH: &str = "lang/{locale}/{entry}";
 }
-#[cfg(
-    any(target_os = "linux", target_os = "macos", target_os = "windows")
-)]
+#[cfg(any(target_os = "linux", target_os = "macos", target_os = "windows"))]
 mod ui_consts {
     pub const LOCALE_PATH: &str = "assets/lang/{locale}/{entry}";
 }

+ 4 - 7
bin/app/src/app/node.rs

@@ -325,7 +325,8 @@ pub fn create_baseedit(name: &str) -> SceneNode {
     let prop = Property::new("placeholder_text", PropertyType::Str, PropertySubType::Null);
     node.add_property(prop).unwrap();
 
-    let mut prop = Property::new("placeholder_color", PropertyType::Float32, PropertySubType::Color);
+    let mut prop =
+        Property::new("placeholder_color", PropertyType::Float32, PropertySubType::Color);
     prop.set_array_len(4);
     prop.set_range_f32(0., 1.);
     node.add_property(prop).unwrap();
@@ -834,12 +835,8 @@ pub fn create_tokentable(name: &str) -> SceneNode {
     )
     .unwrap();
 
-    node.add_method(
-        "set_tokens",
-        vec![("tokens", "Token rows data", CallArgType::Hash)],
-        None,
-    )
-    .unwrap();
+    node.add_method("set_tokens", vec![("tokens", "Token rows data", CallArgType::Hash)], None)
+        .unwrap();
 
     node
 }

+ 25 - 26
bin/app/src/app/schema/menu/channel.rs

@@ -33,7 +33,7 @@ use crate::{
     },
     expr,
     gfx::gfxtag,
-    mesh::{COLOR_CYAN, COLOR_INACTIVE, COLOR_MINT, COLOR_MINT_OP, MINT_BTN_GRADIENT,},
+    mesh::{COLOR_CYAN, COLOR_INACTIVE, COLOR_MINT, COLOR_MINT_OP, MINT_BTN_GRADIENT},
     prop::{PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     shape,
@@ -570,21 +570,21 @@ pub async fn make(
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-    let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
-    prop.set_expr(atom, Role::App, 0, code).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
-    let code = cc.compile("w").unwrap();
-    prop.set_expr(atom, Role::App, 2, code).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        prop.set_expr(atom, Role::App, 0, code).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
+        let code = cc.compile("w").unwrap();
+        prop.set_expr(atom, Role::App, 2, code).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-    let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
-    prop.set_expr(atom, Role::App, 0, code).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
-    let code = cc.compile("w").unwrap();
-    prop.set_expr(atom, Role::App, 2, code).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        prop.set_expr(atom, Role::App, 0, code).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
+        let code = cc.compile("w").unwrap();
+        prop.set_expr(atom, Role::App, 2, code).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     node.set_property_f32(atom, Role::App, "font_size", LABEL_FONTSIZE).unwrap();
@@ -638,17 +638,17 @@ pub async fn make(
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-    prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
-    prop.set_f32(atom, Role::App, 2, 200.).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
+        prop.set_f32(atom, Role::App, 2, 200.).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-    prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
-    prop.set_f32(atom, Role::App, 2, 200.).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
+        prop.set_f32(atom, Role::App, 2, 200.).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     node.set_property_f32(atom, Role::App, "font_size", LABEL_FONTSIZE).unwrap();
@@ -1087,7 +1087,7 @@ pub async fn make(
     prop.set_expr(atom, Role::App, 2, code).unwrap();
     prop.set_f32(atom, Role::App, 3, CHATEDIT_HEIGHT).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 7).unwrap();
-    
+
     let mut shape = VectorShape::new();
     shape.add_outline(
         expr::const_f32(0.),
@@ -1229,9 +1229,8 @@ pub async fn make(
     editlayer_node.link(node);
 
     // Create cancel/done edit buttons at bottom of screen
-    let btns = edit_buttons::create_edit_buttons(
-        app, content.clone(), &window_scale, i18n_fish,
-    ).await;
+    let btns =
+        edit_buttons::create_edit_buttons(app, content.clone(), &window_scale, i18n_fish).await;
 
     let node = create_menu("nick_menu");
     let prop = node.get_property("rect").unwrap();
@@ -1315,4 +1314,4 @@ pub async fn make(
     );
 
     content
-}
+}

+ 24 - 25
bin/app/src/app/schema/menu/contact.rs

@@ -33,7 +33,7 @@ use crate::{
     },
     expr,
     gfx::gfxtag,
-    mesh::{COLOR_CYAN, COLOR_INACTIVE, COLOR_MINT, COLOR_MINT_OP, MINT_BTN_GRADIENT,},
+    mesh::{COLOR_CYAN, COLOR_INACTIVE, COLOR_MINT, COLOR_MINT_OP, MINT_BTN_GRADIENT},
     prop::{PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     shape,
@@ -570,17 +570,17 @@ pub async fn make(
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-    prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
-    prop.set_f32(atom, Role::App, 2, 200.).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
+        prop.set_f32(atom, Role::App, 2, 200.).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-    prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
-    prop.set_f32(atom, Role::App, 2, 200.).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
+        prop.set_f32(atom, Role::App, 2, 200.).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     node.set_property_f32(atom, Role::App, "font_size", LABEL_FONTSIZE).unwrap();
@@ -635,21 +635,21 @@ pub async fn make(
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-    let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
-    prop.set_expr(atom, Role::App, 0, code).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
-    let code = cc.compile("w").unwrap();
-    prop.set_expr(atom, Role::App, 2, code).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        prop.set_expr(atom, Role::App, 0, code).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
+        let code = cc.compile("w").unwrap();
+        prop.set_expr(atom, Role::App, 2, code).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-    let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
-    prop.set_expr(atom, Role::App, 0, code).unwrap();
-    prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
-    let code = cc.compile("w").unwrap();
-    prop.set_expr(atom, Role::App, 2, code).unwrap();
-    prop.set_f32(atom, Role::App, 3, 40.).unwrap();
+        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        prop.set_expr(atom, Role::App, 0, code).unwrap();
+        prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
+        let code = cc.compile("w").unwrap();
+        prop.set_expr(atom, Role::App, 2, code).unwrap();
+        prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     node.set_property_f32(atom, Role::App, "font_size", LABEL_FONTSIZE).unwrap();
@@ -1090,7 +1090,7 @@ pub async fn make(
     prop.set_expr(atom, Role::App, 2, code).unwrap();
     prop.set_f32(atom, Role::App, 3, CHATEDIT_HEIGHT).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 7).unwrap();
-    
+
     let mut shape = VectorShape::new();
     shape.add_outline(
         expr::const_f32(0.),
@@ -1250,9 +1250,8 @@ pub async fn make(
     editlayer_node.link(node);
 
     // Create cancel/done edit buttons at bottom of screen
-    let btns = edit_buttons::create_edit_buttons(
-        app, content.clone(), &window_scale, i18n_fish,
-    ).await;
+    let btns =
+        edit_buttons::create_edit_buttons(app, content.clone(), &window_scale, i18n_fish).await;
 
     let node = create_menu("nick_menu");
     let prop = node.get_property("rect").unwrap();

+ 14 - 4
bin/app/src/app/schema/menu/edit_buttons.rs

@@ -25,7 +25,7 @@ use crate::{
     },
     expr,
     gfx::gfxtag,
-    mesh::{COLOR_CYAN, COLOR_RED, DONE_MENU_BTN_GRADIENT, CANCEL_MENU_BTN_GRADIENT},
+    mesh::{CANCEL_MENU_BTN_GRADIENT, COLOR_CYAN, COLOR_RED, DONE_MENU_BTN_GRADIENT},
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     ui::{Button, Layer, Text, VectorArt, VectorShape},
@@ -262,10 +262,20 @@ impl EditButtons {
 
         // Cancel and done button click handlers
         self.connect_btn_handler(
-            app, &self.cancel_btn, menu_node, "cancel_clicked", "cancel_edit", sibling.clone(),
+            app,
+            &self.cancel_btn,
+            menu_node,
+            "cancel_clicked",
+            "cancel_edit",
+            sibling.clone(),
         );
         self.connect_btn_handler(
-            app, &self.done_btn, menu_node, "done_clicked", "done_edit", sibling.clone(),
+            app,
+            &self.done_btn,
+            menu_node,
+            "done_clicked",
+            "done_edit",
+            sibling.clone(),
         );
     }
 
@@ -296,4 +306,4 @@ impl EditButtons {
         });
         app.tasks.lock().unwrap().push(task);
     }
-}
+}

+ 2 - 6
bin/app/src/app/schema/menu/edit_switch.rs

@@ -23,11 +23,7 @@ use crate::{
 
 /// Prolly misplaced for now lel.
 /// Only allow one editor to be active in the list at any one time.
-pub fn edit_switch(
-    tasks: &mut Vec<smol::Task<()>>,
-    edit_nodes: &[SceneNodePtr],
-    ex: ExecutorPtr,
-) {
+pub fn edit_switch(tasks: &mut Vec<smol::Task<()>>, edit_nodes: &[SceneNodePtr], ex: ExecutorPtr) {
     for (i, edit_node) in edit_nodes.iter().enumerate() {
         let others: Vec<SceneNodePtr> =
             edit_nodes[..i].iter().chain(edit_nodes[i + 1..].iter()).cloned().collect();
@@ -47,4 +43,4 @@ pub fn edit_switch(
         });
         tasks.push(is_focused_task);
     }
-}
+}

+ 15 - 21
bin/app/src/app/schema/menu/mod.rs

@@ -22,15 +22,12 @@ use ui_consts::*;
 use super::{ColorScheme, CHANNELS, COLOR_SCHEME};
 use crate::{
     app::{
-        node::{
-            create_button, create_layer, create_menu, create_text,
-            create_vector_art,
-        },
+        node::{create_button, create_layer, create_menu, create_text, create_vector_art},
         App,
     },
     expr,
     gfx::gfxtag,
-    mesh::{COLOR_CYAN, DONE_MENU_BTN_GRADIENT, CANCEL_MENU_BTN_GRADIENT},
+    mesh::{CANCEL_MENU_BTN_GRADIENT, COLOR_CYAN, DONE_MENU_BTN_GRADIENT},
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     shape,
@@ -287,7 +284,7 @@ pub async fn make(app: &App, content: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
     node.set_property_f32(atom, Role::App, "scale", VERBLOCK_SCALE).unwrap();
     let shape = shape::create_version_block([1., 0., 0.25, 1.]);
-    
+
     let node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone())).await;
     mainlayer_node.link(node);
 
@@ -376,9 +373,8 @@ pub async fn make(app: &App, content: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     mainlayer_node.link(node);
 
     // Create cancel/done edit buttons
-    let btns = edit_buttons::create_edit_buttons(
-        app, layer_node.clone(), &window_scale, i18n_fish,
-    ).await;
+    let btns =
+        edit_buttons::create_edit_buttons(app, layer_node.clone(), &window_scale, i18n_fish).await;
 
     // Menu
     let node = create_menu("main_menu");
@@ -435,15 +431,7 @@ pub async fn make(app: &App, content: SceneNodePtr, i18n_fish: &I18nBabelFish) {
         prop.push_str(atom, Role::App, *channel).unwrap();
     }
     for channel in [
-        "@john",
-        "@stacy",
-        "@barry",
-        "@steve",
-        "@obombo",
-        "@xyz",
-        "@lunar",
-        "@fren",
-        "@anon",
+        "@john", "@stacy", "@barry", "@steve", "@obombo", "@xyz", "@lunar", "@fren", "@anon",
         "@anon1",
     ] {
         prop.push_str(atom, Role::App, channel).unwrap();
@@ -507,7 +495,8 @@ pub async fn setup_wallet_button(app: &App, menu_layer: SceneNodePtr, i18n_fish:
     .unwrap();
 
     let menulayer_is_visible = PropertyBool::wrap(&menu_layer, Role::App, "is_visible", 0).unwrap();
-    let mainlayer_node = app.sg_root.lookup_node("/window/content/menu_layer/mainbtn_layer").unwrap();
+    let mainlayer_node =
+        app.sg_root.lookup_node("/window/content/menu_layer/mainbtn_layer").unwrap();
 
     // Wallet button
     let node = create_vector_art("walletbtn_bg");
@@ -553,8 +542,13 @@ pub async fn setup_wallet_button(app: &App, menu_layer: SceneNodePtr, i18n_fish:
     let (slot, recvr) = Slot::new("wallet_clicked");
     node.register("click", slot).unwrap();
     let sg_root = app.sg_root.clone();
-    let wallet_is_visible =
-        PropertyBool::wrap(&sg_root.lookup_node("/window/content/wallet").unwrap(), Role::App, "is_visible", 0).unwrap();
+    let wallet_is_visible = PropertyBool::wrap(
+        &sg_root.lookup_node("/window/content/wallet").unwrap(),
+        Role::App,
+        "is_visible",
+        0,
+    )
+    .unwrap();
     let renderer = app.renderer.clone();
     let menulayer_is_visible2 = menulayer_is_visible.clone();
     let listen_click = app.ex.spawn(async move {

+ 1 - 1
bin/app/src/app/schema/mod.rs

@@ -38,9 +38,9 @@ use crate::{
 mod chat;
 mod menu;
 //mod settings;
-mod wallet;
 pub mod test;
 pub mod test_scroll_layer;
+mod wallet;
 
 macro_rules! i { ($($arg:tt)*) => { info!(target: "app::schema", $($arg)*); } }
 macro_rules! e { ($($arg:tt)*) => { error!(target: "app::schema", $($arg)*); } }

+ 39 - 16
bin/app/src/app/schema/wallet/main.rs

@@ -20,9 +20,9 @@ use darkfi_serial::Decodable;
 
 use crate::{
     app::{
-        App,
         node::{create_button, create_layer, create_text, create_tokentable, create_vector_art},
         schema::COLOR_SCHEME,
+        App,
     },
     expr,
     gfx::gfxtag,
@@ -148,17 +148,24 @@ pub async fn make(
             let atom = &mut renderer.make_guard(gfxtag!("receive button click"));
             main_is_visible2.set(atom, false);
 
-            let receive_layer = sg_root.lookup_node("/window/content/wallet/receive_layer").unwrap();
+            let receive_layer =
+                sg_root.lookup_node("/window/content/wallet/receive_layer").unwrap();
             receive_layer.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
 
             // Get the default address from drk plugin and update the UI
             if let Some(drk_node) = sg_root.lookup_node("/plugin/drk") {
-                if let Ok(Some(response_data)) = drk_node.call_method("get_default_address", vec![]).await {
+                if let Ok(Some(response_data)) =
+                    drk_node.call_method("get_default_address", vec![]).await
+                {
                     let mut cur = std::io::Cursor::new(response_data);
                     if let Ok(address) = String::decode(&mut cur) {
                         d!("Got default address from drk: {address}");
-                        if let Some(receive_address_node) = receive_layer.lookup_node("/receive_address") {
-                            receive_address_node.set_property_str(atom, Role::App, "text", address).unwrap();
+                        if let Some(receive_address_node) =
+                            receive_layer.lookup_node("/receive_address")
+                        {
+                            receive_address_node
+                                .set_property_str(atom, Role::App, "text", address)
+                                .unwrap();
                         }
                     } else {
                         e!("Failed to decode default address response");
@@ -180,7 +187,8 @@ pub async fn make(
     let node = create_text("receive_label");
     let prop = node.get_property("rect").unwrap();
     prop.set_f32(atom, Role::App, 0, PADDING_X).unwrap();
-    prop.set_f32(atom, Role::App, 1, y + PADDING_X + BUTTON_HEIGHT / 2. - BUTTON_FONTSIZE / 1.8).unwrap();
+    prop.set_f32(atom, Role::App, 1, y + PADDING_X + BUTTON_HEIGHT / 2. - BUTTON_FONTSIZE / 1.8)
+        .unwrap();
     let code = cc.compile("w / 2 - PADDING_X * 1.5").unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
     prop.set_f32(atom, Role::App, 3, BUTTON_HEIGHT).unwrap();
@@ -247,7 +255,8 @@ pub async fn make(
         while let Ok(_) = recvr.recv().await {
             let atom = &mut renderer.make_guard(gfxtag!("send button click"));
             main_is_visible3.set(atom, false);
-            let send_layer = sg_root.lookup_node("/window/content/wallet/send_step1_layer").unwrap();
+            let send_layer =
+                sg_root.lookup_node("/window/content/wallet/send_step1_layer").unwrap();
             send_layer.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
         }
     });
@@ -261,7 +270,8 @@ pub async fn make(
     let prop = node.get_property("rect").unwrap();
     let code = cc.compile("PADDING_X / 2 + w / 2").unwrap();
     prop.set_expr(atom, Role::App, 0, code).unwrap();
-    prop.set_f32(atom, Role::App, 1, y + PADDING_X + BUTTON_HEIGHT / 2. - BUTTON_FONTSIZE / 1.8).unwrap();
+    prop.set_f32(atom, Role::App, 1, y + PADDING_X + BUTTON_HEIGHT / 2. - BUTTON_FONTSIZE / 1.8)
+        .unwrap();
     let code = cc.compile("w / 2 - PADDING_X * 1.5").unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
     prop.set_f32(atom, Role::App, 3, BUTTON_HEIGHT).unwrap();
@@ -328,15 +338,18 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 0.2784).unwrap();
     prop.set_f32(atom, Role::App, 3, 1.).unwrap();
 
-    let tokens_table = tokens_table
-        .setup(|me| TokenTable::new(me, app.renderer.clone()))
-        .await;
+    let tokens_table = tokens_table.setup(|me| TokenTable::new(me, app.renderer.clone())).await;
     main_layer.link(tokens_table.clone());
 
     main_layer
 }
 
-async fn create_chat_btn(app: &App, atom: &mut PropertyAtomicGuard, cc: &expr::Compiler, parent: &SceneNodePtr) {
+async fn create_chat_btn(
+    app: &App,
+    atom: &mut PropertyAtomicGuard,
+    cc: &expr::Compiler,
+    parent: &SceneNodePtr,
+) {
     let node = create_vector_art("chat_btn_bg");
     let prop = node.get_property("rect").unwrap();
     let code = cc.compile(format!("w - {CHAT_BTN_SIZE} - {CHAT_BTN_MARGIN}")).unwrap();
@@ -394,10 +407,20 @@ async fn create_chat_btn(app: &App, atom: &mut PropertyAtomicGuard, cc: &expr::C
 
     let sg_root = app.sg_root.clone();
     let renderer = app.renderer.clone();
-    let menu_is_visible =
-        PropertyBool::wrap(&sg_root.lookup_node("/window/content/menu_layer").unwrap(), Role::App, "is_visible", 0).unwrap();
-    let wallet_is_visible =
-        PropertyBool::wrap(&sg_root.lookup_node("/window/content/wallet").unwrap(), Role::App, "is_visible", 0).unwrap();
+    let menu_is_visible = PropertyBool::wrap(
+        &sg_root.lookup_node("/window/content/menu_layer").unwrap(),
+        Role::App,
+        "is_visible",
+        0,
+    )
+    .unwrap();
+    let wallet_is_visible = PropertyBool::wrap(
+        &sg_root.lookup_node("/window/content/wallet").unwrap(),
+        Role::App,
+        "is_visible",
+        0,
+    )
+    .unwrap();
     let (slot, recvr) = Slot::new("chat_btn_clicked");
     node.register("click", slot).unwrap();
     let listen_click = app.ex.spawn(async move {

+ 5 - 15
bin/app/src/app/schema/wallet/mod.rs

@@ -20,8 +20,8 @@ macro_rules! d { ($($arg:tt)*) => { debug!(target: "app::schema::wallet", $($arg
 macro_rules! e { ($($arg:tt)*) => { error!(target: "app::schema::wallet", $($arg)*); } }
 
 pub mod data;
-pub mod util;
 pub mod main;
+pub mod netstatus;
 pub mod receive;
 pub mod send;
 pub mod send_step1;
@@ -29,10 +29,10 @@ pub mod send_step2;
 pub mod send_step3;
 pub mod send_step4;
 pub mod tx_status;
-pub mod netstatus;
+pub mod util;
 
 use crate::{
-    app::{App, node::create_layer},
+    app::{node::create_layer, App},
     expr,
     prop::{PropertyAtomicGuard, PropertyFloat32, Role},
     scene::SceneNodePtr,
@@ -68,18 +68,8 @@ pub async fn make(app: &App, content: SceneNodePtr, i18n_fish: &I18nBabelFish) {
     let _ = netstatus::make(app, wallet_layer.clone(), i18n_fish, window_scale.clone()).await;
 
     // Create receive layer
-    let _ = receive::make(
-        app,
-        wallet_layer.clone(),
-        i18n_fish,
-        window_scale.clone(),
-    ).await;
+    let _ = receive::make(app, wallet_layer.clone(), i18n_fish, window_scale.clone()).await;
 
     // Create send layer
-    let _ = send::make(
-        app,
-        wallet_layer.clone(),
-        i18n_fish,
-        window_scale.clone(),
-    ).await;
+    let _ = send::make(app, wallet_layer.clone(), i18n_fish, window_scale.clone()).await;
 }

+ 6 - 4
bin/app/src/app/schema/wallet/netstatus.rs

@@ -18,16 +18,18 @@
 
 use crate::{
     app::{
+        schema::{
+            create_layer, create_vector_art,
+            wallet::data::{NETLOGO_SCALE, NETSTATUS_ICON_SIZE},
+        },
         App,
-        schema::{create_vector_art, create_layer},
-        schema::wallet::data::{NETSTATUS_ICON_SIZE, NETLOGO_SCALE}
     },
     expr,
     prop::{PropertyAtomicGuard, PropertyFloat32, Role},
-    shape,
     scene::SceneNodePtr,
+    shape,
     ui::{Layer, VectorArt},
-    util::i18n::I18nBabelFish
+    util::i18n::I18nBabelFish,
 };
 
 pub async fn make(

+ 29 - 8
bin/app/src/app/schema/wallet/receive.rs

@@ -18,12 +18,11 @@
 
 use crate::{
     app::{
-        App,
         node::{create_button, create_layer, create_text, create_vector_art},
         schema::COLOR_SCHEME,
+        App,
     },
-    clipboard,
-    expr,
+    clipboard, expr,
     gfx::gfxtag,
     mesh::COLOR_CYAN,
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, PropertyStr, Role},
@@ -87,7 +86,8 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 3, HEADER_HEIGHT).unwrap();
 
     let main_is_visible = PropertyBool::wrap(&main_layer, Role::App, "is_visible", 0).unwrap();
-    let receive_is_visible = PropertyBool::wrap(&receive_layer, Role::App, "is_visible", 0).unwrap();
+    let receive_is_visible =
+        PropertyBool::wrap(&receive_layer, Role::App, "is_visible", 0).unwrap();
     let renderer = app.renderer.clone();
     let (slot, recvr) = Slot::new("receive_back_clicked");
     node.register("click", slot).unwrap();
@@ -107,7 +107,17 @@ pub async fn make(
 
     create_title(app, atom, &receive_layer, &window_scale, i18n_fish, "RECEIVE", &mut y).await;
 
-    create_subtitle(app, atom, &receive_layer, &window_scale, i18n_fish, "address", "Address", &mut y).await;
+    create_subtitle(
+        app,
+        atom,
+        &receive_layer,
+        &window_scale,
+        i18n_fish,
+        "address",
+        "Address",
+        &mut y,
+    )
+    .await;
 
     // Address display
     let node = create_text("receive_address");
@@ -178,7 +188,9 @@ pub async fn make(
             clipboard::set(&addr);
 
             // Show tooltip
-            if let Some(tooltip) = sg_root.lookup_node("/window/content/wallet/receive_layer/receive_copy_tooltip") {
+            if let Some(tooltip) =
+                sg_root.lookup_node("/window/content/wallet/receive_layer/receive_copy_tooltip")
+            {
                 let _ = tooltip.call_method("show", vec![]).await;
             }
         }
@@ -197,7 +209,8 @@ pub async fn make(
         atom,
         window_scale.clone(),
         i18n_fish,
-    ).await;
+    )
+    .await;
 
     // Position tooltip
     let tooltip_y_expr = cc.compile(format!("{y} + PADDING_Y * 3 + addr_height + 1")).unwrap();
@@ -207,7 +220,15 @@ pub async fn make(
     tooltip_rect.set_expr(atom, Role::App, 1, tooltip_y_expr).unwrap();
     tooltip_rect.add_depend(&addr_h_prop, 0, "addr_height");
 
-    let sep = create_separator_expr(app, atom, &receive_layer, "receive_address_separator", &mut cc, &format!("{y} + PADDING_Y * 2 + addr_height + 1")).await;
+    let sep = create_separator_expr(
+        app,
+        atom,
+        &receive_layer,
+        "receive_address_separator",
+        &mut cc,
+        &format!("{y} + PADDING_Y * 2 + addr_height + 1"),
+    )
+    .await;
     let prop = sep.get_property("rect").unwrap();
     prop.add_depend(&addr_h_prop, 0, "addr_height");
 

+ 51 - 25
bin/app/src/app/schema/wallet/send.rs

@@ -16,8 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use darkfi::util::parse::encode_base10;
-use darkfi::tx::Transaction;
+use darkfi::{tx::Transaction, util::parse::encode_base10};
 use darkfi_serial::Decodable;
 
 use crate::{
@@ -29,7 +28,10 @@ use crate::{
     util::i18n::I18nBabelFish,
 };
 
-use super::{data::SendTxData, data::BALANCE_BASE10_DECIMALS, send_step1, send_step2, send_step3, send_step4, tx_status};
+use super::{
+    data::{SendTxData, BALANCE_BASE10_DECIMALS},
+    send_step1, send_step2, send_step3, send_step4, tx_status,
+};
 
 pub async fn make(
     app: &App,
@@ -45,9 +47,11 @@ pub async fn make(
         i18n_fish,
         window_scale.clone(),
         send_tx_data.clone(),
-    ).await;
+    )
+    .await;
 
-    let step1_is_visible = PropertyBool::wrap(&send_step1_layer, Role::App, "is_visible", 0).unwrap();
+    let step1_is_visible =
+        PropertyBool::wrap(&send_step1_layer, Role::App, "is_visible", 0).unwrap();
 
     let send_step2_layer = send_step2::make(
         app,
@@ -56,9 +60,11 @@ pub async fn make(
         window_scale.clone(),
         send_tx_data.clone(),
         step1_is_visible.clone(),
-    ).await;
+    )
+    .await;
 
-    let step2_is_visible = PropertyBool::wrap(&send_step2_layer, Role::App, "is_visible", 0).unwrap();
+    let step2_is_visible =
+        PropertyBool::wrap(&send_step2_layer, Role::App, "is_visible", 0).unwrap();
 
     let send_step3_layer = send_step3::make(
         app,
@@ -67,9 +73,11 @@ pub async fn make(
         window_scale.clone(),
         send_tx_data.clone(),
         step2_is_visible.clone(),
-    ).await;
+    )
+    .await;
 
-    let step3_is_visible = PropertyBool::wrap(&send_step3_layer, Role::App, "is_visible", 0).unwrap();
+    let step3_is_visible =
+        PropertyBool::wrap(&send_step3_layer, Role::App, "is_visible", 0).unwrap();
 
     let _send_step4_layer = send_step4::make(
         app,
@@ -78,15 +86,12 @@ pub async fn make(
         window_scale.clone(),
         send_tx_data.clone(),
         step3_is_visible.clone(),
-    ).await;
+    )
+    .await;
 
-    let tx_status_layer = tx_status::make(
-        app,
-        wallet_layer.clone(),
-        i18n_fish,
-        window_scale.clone(),
-        send_tx_data,
-    ).await;
+    let tx_status_layer =
+        tx_status::make(app, wallet_layer.clone(), i18n_fish, window_scale.clone(), send_tx_data)
+            .await;
 
     // Add listener for tx built signal to update send button label and show fee
     let set_built_tx_sub = tx_status_layer.subscribe_method_call("set_built_tx").unwrap();
@@ -108,7 +113,9 @@ pub async fn make(
             let atom = &mut renderer_for_built.make_guard(gfxtag!("tx built - update send button"));
 
             // Make send button active
-            if let Some(send_label_node) = sg_root_for_built.lookup_node("/window/content/wallet/send_step4_layer/send_btn_label") {
+            if let Some(send_label_node) = sg_root_for_built
+                .lookup_node("/window/content/wallet/send_step4_layer/send_btn_label")
+            {
                 send_label_node.set_property_str(atom, Role::App, "text", "send").unwrap();
                 let prop = send_label_node.get_property("text_color").unwrap();
                 prop.set_f32(atom, Role::App, 0, COLOR_CYAN[0]).unwrap();
@@ -116,23 +123,38 @@ pub async fn make(
                 prop.set_f32(atom, Role::App, 2, COLOR_CYAN[2]).unwrap();
                 prop.set_f32(atom, Role::App, 3, COLOR_CYAN[3]).unwrap();
             }
-            if let Some(send_bg_grey_node) = sg_root_for_built.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg_grey") {
+            if let Some(send_bg_grey_node) = sg_root_for_built
+                .lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg_grey")
+            {
                 send_bg_grey_node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
             }
-            if let Some(send_bg_node) = sg_root_for_built.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg") {
+            if let Some(send_bg_node) =
+                sg_root_for_built.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg")
+            {
                 send_bg_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
             }
 
             // Show transaction fee
-            if let Some(tx_fee_label) = sg_root_for_built.lookup_node("/window/content/wallet/send_step4_layer/send_fee_label") {
+            if let Some(tx_fee_label) = sg_root_for_built
+                .lookup_node("/window/content/wallet/send_step4_layer/send_fee_label")
+            {
                 let prop = tx_fee_label.get_property("text_color").unwrap();
                 prop.set_f32(atom, Role::App, 0, 1.).unwrap();
                 prop.set_f32(atom, Role::App, 1, 1.).unwrap();
                 prop.set_f32(atom, Role::App, 2, 1.).unwrap();
                 prop.set_f32(atom, Role::App, 3, 1.).unwrap();
             }
-            if let Some(tx_fee_value) = sg_root_for_built.lookup_node("/window/content/wallet/send_step4_layer/send_fee_value") {
-                tx_fee_value.set_property_str(atom, Role::App, "text", encode_base10(fees, BALANCE_BASE10_DECIMALS)).unwrap();
+            if let Some(tx_fee_value) = sg_root_for_built
+                .lookup_node("/window/content/wallet/send_step4_layer/send_fee_value")
+            {
+                tx_fee_value
+                    .set_property_str(
+                        atom,
+                        Role::App,
+                        "text",
+                        encode_base10(fees, BALANCE_BASE10_DECIMALS),
+                    )
+                    .unwrap();
                 let prop = tx_fee_value.get_property("text_color").unwrap();
                 prop.set_f32(atom, Role::App, 0, 1.).unwrap();
                 prop.set_f32(atom, Role::App, 1, 1.).unwrap();
@@ -148,12 +170,16 @@ pub async fn make(
     let step2_is_visible_sub = step2_is_visible.prop().subscribe_modify();
     let listen_step2_visible = app.ex.spawn(async move {
         while let Ok(_) = step2_is_visible_sub.receive().await {
-            let recipient_input_node = sg_root_for_focus.lookup_node("/window/content/wallet/send_step2_layer/send_recipient_input").unwrap();
+            let recipient_input_node = sg_root_for_focus
+                .lookup_node("/window/content/wallet/send_step2_layer/send_recipient_input")
+                .unwrap();
             if step2_is_visible_for_focus.get() {
                 // Focus when becoming visible
                 loop {
                     darkfi::system::msleep(16).await;
-                    let input_rect = crate::prop::PropertyRect::wrap(&recipient_input_node, Role::App, "rect").unwrap();
+                    let input_rect =
+                        crate::prop::PropertyRect::wrap(&recipient_input_node, Role::App, "rect")
+                            .unwrap();
                     if input_rect.has_cached() {
                         break;
                     }

+ 25 - 10
bin/app/src/app/schema/wallet/send_step1.rs

@@ -22,16 +22,16 @@ use darkfi_serial::Decodable;
 
 use crate::{
     app::{
-        App,
         node::{create_button, create_layer, create_tokentable, create_vector_art},
         schema::COLOR_SCHEME,
+        App,
     },
     expr,
     gfx::gfxtag,
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     shape,
-    ui::{Button, Layer, TokenTable, TokenRow, VectorArt},
+    ui::{Button, Layer, TokenRow, TokenTable, VectorArt},
     util::i18n::I18nBabelFish,
 };
 
@@ -73,7 +73,8 @@ pub async fn make(
     send_step1_layer.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     let send_step1_layer = send_step1_layer.setup(|me| Layer::new(me, app.renderer.clone())).await;
     wallet_layer.link(send_step1_layer.clone());
-    let step1_is_visible = PropertyBool::wrap(&send_step1_layer, Role::App, "is_visible", 0).unwrap();
+    let step1_is_visible =
+        PropertyBool::wrap(&send_step1_layer, Role::App, "is_visible", 0).unwrap();
 
     create_bg_mesh(app, atom, &send_step1_layer, "send_bg").await;
     create_header_bg(app, atom, &send_step1_layer, "send_header_bg").await;
@@ -122,7 +123,17 @@ pub async fn make(
 
     create_title(app, atom, &send_step1_layer, &window_scale, i18n_fish, "SEND", &mut y).await;
 
-    create_subtitle(app, atom, &send_step1_layer, &window_scale, i18n_fish, "pick_label", "Pick a token to send", &mut y).await;
+    create_subtitle(
+        app,
+        atom,
+        &send_step1_layer,
+        &window_scale,
+        i18n_fish,
+        "pick_label",
+        "Pick a token to send",
+        &mut y,
+    )
+    .await;
 
     let send_tokens_table = create_tokentable("tokens_table");
     let prop = send_tokens_table.get_property("rect").unwrap();
@@ -155,9 +166,8 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 0.2784).unwrap();
     prop.set_f32(atom, Role::App, 3, 1.).unwrap();
 
-    let send_tokens_table = send_tokens_table
-        .setup(|me| TokenTable::new(me, app.renderer.clone()))
-        .await;
+    let send_tokens_table =
+        send_tokens_table.setup(|me| TokenTable::new(me, app.renderer.clone())).await;
     send_step1_layer.link(send_tokens_table.clone());
 
     let (slot, recvr) = Slot::new("token_row_clicked");
@@ -176,12 +186,17 @@ pub async fn make(
                 drop(data);
 
                 let atom = &mut renderer.make_guard(gfxtag!("token selection"));
-                if let Some(selected_token_symbol) = sg_root.lookup_node("/window/content/wallet/send_step2_layer/send_selected_token_symbol") {
-                    selected_token_symbol.set_property_str(atom, Role::App, "text", &row.symbol).unwrap();
+                if let Some(selected_token_symbol) = sg_root.lookup_node(
+                    "/window/content/wallet/send_step2_layer/send_selected_token_symbol",
+                ) {
+                    selected_token_symbol
+                        .set_property_str(atom, Role::App, "text", &row.symbol)
+                        .unwrap();
                 }
 
                 step1_is_visible3.set(atom, false);
-                if let Some(step2) = sg_root.lookup_node("/window/content/wallet/send_step2_layer") {
+                if let Some(step2) = sg_root.lookup_node("/window/content/wallet/send_step2_layer")
+                {
                     step2.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
                 }
             }

+ 42 - 24
bin/app/src/app/schema/wallet/send_step2.rs

@@ -16,17 +16,18 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use std::sync::Arc;
 use darkfi_sdk::crypto::keypair::Address;
+use std::sync::Arc;
 
 use crate::{
     app::{
-        App,
-        node::{create_button, create_layer, create_singleline_edit, create_text, create_vector_art},
+        node::{
+            create_button, create_layer, create_singleline_edit, create_text, create_vector_art,
+        },
         schema::COLOR_SCHEME,
+        App,
     },
-    clipboard,
-    expr,
+    clipboard, expr,
     gfx::gfxtag,
     mesh::COLOR_CYAN,
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
@@ -101,7 +102,8 @@ pub async fn make(
     send_step2_layer.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     let send_step2_layer = send_step2_layer.setup(|me| Layer::new(me, app.renderer.clone())).await;
     wallet_layer.link(send_step2_layer.clone());
-    let step2_is_visible = PropertyBool::wrap(&send_step2_layer, Role::App, "is_visible", 0).unwrap();
+    let step2_is_visible =
+        PropertyBool::wrap(&send_step2_layer, Role::App, "is_visible", 0).unwrap();
 
     create_bg_mesh(app, atom, &send_step2_layer, "send_bg2").await;
     create_header_bg(app, atom, &send_step2_layer, "send_header_bg2").await;
@@ -237,11 +239,17 @@ pub async fn make(
     let prop = recipient_input.get_property("rect").unwrap();
     prop.set_f32(atom, Role::App, 0, RECIPIENT_INPUT_MARGIN + RECIPIENT_INPUT_PADDING_X).unwrap();
     prop.set_f32(atom, Role::App, 1, y).unwrap();
-    let code = cc.compile("parent_w - RECIPIENT_INPUT_MARGIN * 2 - RECIPIENT_INPUT_PADDING_X - PASTE_WIDTH").unwrap();
+    let code = cc
+        .compile("parent_w - RECIPIENT_INPUT_MARGIN * 2 - RECIPIENT_INPUT_PADDING_X - PASTE_WIDTH")
+        .unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
     prop.set_f32(atom, Role::App, 3, RECIPIENT_INPUT_HEIGHT).unwrap();
-    recipient_input.set_property_f32(atom, Role::App, "font_size", RECIPIENT_INPUT_FONTSIZE).unwrap();
-    recipient_input.set_property_str(atom, Role::App, "placeholder_text", "recipient address...").unwrap();
+    recipient_input
+        .set_property_f32(atom, Role::App, "font_size", RECIPIENT_INPUT_FONTSIZE)
+        .unwrap();
+    recipient_input
+        .set_property_str(atom, Role::App, "placeholder_text", "recipient address...")
+        .unwrap();
     let prop = recipient_input.get_property("placeholder_color").unwrap();
     prop.set_f32(atom, Role::App, 0, 1.).unwrap();
     prop.set_f32(atom, Role::App, 1, 1.).unwrap();
@@ -282,10 +290,18 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 1.).unwrap();
     prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     recipient_input.set_property_f32(atom, Role::App, "cursor_ascent", 0.).unwrap();
-    recipient_input.set_property_f32(atom, Role::App, "cursor_descent", RECIPIENT_INPUT_FONTSIZE*1.3).unwrap();
-    recipient_input.set_property_f32(atom, Role::App, "select_ascent", RECIPIENT_INPUT_FONTSIZE*1.3).unwrap();
-    recipient_input.set_property_f32(atom, Role::App, "select_descent", RECIPIENT_INPUT_FONTSIZE/3.).unwrap();
-    recipient_input.set_property_f32(atom, Role::App, "handle_descent", RECIPIENT_INPUT_FONTSIZE/2.5).unwrap();
+    recipient_input
+        .set_property_f32(atom, Role::App, "cursor_descent", RECIPIENT_INPUT_FONTSIZE * 1.3)
+        .unwrap();
+    recipient_input
+        .set_property_f32(atom, Role::App, "select_ascent", RECIPIENT_INPUT_FONTSIZE * 1.3)
+        .unwrap();
+    recipient_input
+        .set_property_f32(atom, Role::App, "select_descent", RECIPIENT_INPUT_FONTSIZE / 3.)
+        .unwrap();
+    recipient_input
+        .set_property_f32(atom, Role::App, "handle_descent", RECIPIENT_INPUT_FONTSIZE / 2.5)
+        .unwrap();
     recipient_input.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     let recipient_input = recipient_input
         .setup(|me| {
@@ -345,17 +361,19 @@ pub async fn make(
     send_step2_layer.link(node);
 
     // Add recipient button
-    let (node, btn_bg_valid, btn_bg_invalid, add_recipient_label_node) = create_bottom_button_with_states(
-        app,
-        atom,
-        &send_step2_layer,
-        "send_add_recipient_btn",
-        &mut cc,
-        "add recipient",
-        &window_scale,
-        i18n_fish,
-        false,
-    ).await;
+    let (node, btn_bg_valid, btn_bg_invalid, add_recipient_label_node) =
+        create_bottom_button_with_states(
+            app,
+            atom,
+            &send_step2_layer,
+            "send_add_recipient_btn",
+            &mut cc,
+            "add recipient",
+            &window_scale,
+            i18n_fish,
+            false,
+        )
+        .await;
     let recipient_input2 = recipient_input.clone();
     let recipient_text = recipient_input.get_property("text").unwrap();
     let recipient_text_sub = recipient_text.subscribe_modify();

+ 81 - 39
bin/app/src/app/schema/wallet/send_step3.rs

@@ -23,9 +23,12 @@ use darkfi_serial::Encodable;
 
 use crate::{
     app::{
-        App,
-        node::{create_button, create_layer, create_decimal_edit, create_singleline_edit, create_text, create_vector_art},
+        node::{
+            create_button, create_decimal_edit, create_layer, create_singleline_edit, create_text,
+            create_vector_art,
+        },
         schema::COLOR_SCHEME,
+        App,
     },
     expr,
     gfx::gfxtag,
@@ -74,7 +77,8 @@ pub async fn make(
     send_step3_layer.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     let send_step3_layer = send_step3_layer.setup(|me| Layer::new(me, app.renderer.clone())).await;
     wallet_layer.link(send_step3_layer.clone());
-    let step3_is_visible = PropertyBool::wrap(&send_step3_layer, Role::App, "is_visible", 0).unwrap();
+    let step3_is_visible =
+        PropertyBool::wrap(&send_step3_layer, Role::App, "is_visible", 0).unwrap();
 
     create_bg_mesh(app, atom, &send_step3_layer, "send_bg3").await;
     create_header_bg(app, atom, &send_step3_layer, "send_header_bg3").await;
@@ -111,7 +115,9 @@ pub async fn make(
         while let Ok(_) = recvr.recv().await {
             let atom = &mut renderer.make_guard(gfxtag!("send step3 back button"));
             // Reset error message on back button click
-            if let Some(error_node) = sg_root2.lookup_node("/window/content/wallet/send_step3_layer/error") {
+            if let Some(error_node) =
+                sg_root2.lookup_node("/window/content/wallet/send_step3_layer/error")
+            {
                 error_node.set_property_str(atom, Role::App, "text", "").unwrap();
             }
             step3_is_visible1.set(atom, false);
@@ -136,7 +142,8 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 3, BASE_FONTSIZE).unwrap();
     node.set_property_f32(atom, Role::App, "font_size", BASE_FONTSIZE).unwrap();
     // Set initial token value from send_tx_data
-    let token_symbol_text = send_tx_data.lock().unwrap().token_symbol.clone().unwrap_or_else(|| "".to_string());
+    let token_symbol_text =
+        send_tx_data.lock().unwrap().token_symbol.clone().unwrap_or_else(|| "".to_string());
     node.set_property_str(atom, Role::App, "text", &token_symbol_text).unwrap();
     let prop = node.get_property("text_color").unwrap();
     if COLOR_SCHEME == ColorScheme::DarkMode {
@@ -164,7 +171,8 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 3, BASE_FONTSIZE).unwrap();
     node.set_property_f32(atom, Role::App, "font_size", BASE_FONTSIZE).unwrap();
     // Set initial token value from send_tx_data
-    let token_name_text = send_tx_data.lock().unwrap().token_name.clone().unwrap_or_else(|| "".to_string());
+    let token_name_text =
+        send_tx_data.lock().unwrap().token_name.clone().unwrap_or_else(|| "".to_string());
     node.set_property_str(atom, Role::App, "text", &token_name_text).unwrap();
     let prop = node.get_property("text_color").unwrap();
     if COLOR_SCHEME == ColorScheme::DarkMode {
@@ -250,7 +258,14 @@ pub async fn make(
     // Separator line
     let mut y_ = y.clone();
     let y2 = format!("{y} + (PADDING_Y * 2. + addr_height) + 1");
-    let node = create_separator(&app.renderer, atom, &send_step3_layer, "send_amount_label_separator", &mut y_).await;
+    let node = create_separator(
+        &app.renderer,
+        atom,
+        &send_step3_layer,
+        "send_amount_label_separator",
+        &mut y_,
+    )
+    .await;
     let prop = node.get_property("rect").unwrap();
     let code = cc.compile(&y2).unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
@@ -260,7 +275,8 @@ pub async fn make(
     let available_balance_node = create_text("send_available_balance");
     let prop = available_balance_node.get_property("rect").unwrap();
     prop.set_f32(atom, Role::App, 0, PADDING_X).unwrap();
-    let code = cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - BASE_FONTSIZE - 1").unwrap();
+    let code =
+        cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - BASE_FONTSIZE - 1").unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
     prop.set_f32(atom, Role::App, 2, 1000.).unwrap();
     prop.set_f32(atom, Role::App, 3, BASE_FONTSIZE).unwrap();
@@ -279,7 +295,9 @@ pub async fn make(
         prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     }
     available_balance_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
-    let available_balance_node = available_balance_node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let available_balance_node = available_balance_node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     send_step3_layer.link(available_balance_node.clone());
 
     // Separator line below available balance
@@ -290,7 +308,8 @@ pub async fn make(
         "available_balance_separator",
         &mut cc,
         "h - PADDING_X * 2 - BUTTON_HEIGHT",
-    ).await;
+    )
+    .await;
 
     // Amount wrapper layer
     let amount_y = format!("({y2}) + (h - ({y2}) - BUTTON_HEIGHT - PADDING_X * 2 - PADDING_Y - BASE_FONTSIZE - AMOUNT_FONTSIZE - 1) / 2");
@@ -327,7 +346,9 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 0.3).unwrap();
     prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     error_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
-    let error_node = error_node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let error_node = error_node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     send_step3_layer.link(error_node.clone());
 
     // Amount input
@@ -337,7 +358,7 @@ pub async fn make(
     // Position at (0, 0) within wrapper - wrapper controls the position
     prop.set_f32(atom, Role::App, 0, 0.).unwrap();
     prop.set_f32(atom, Role::App, 1, 0.).unwrap();
-    cc.add_const_f32("AMOUNT_CHAR_WIDTH", AMOUNT_CHAR_WIDTH+6.); // Initial width for "0"
+    cc.add_const_f32("AMOUNT_CHAR_WIDTH", AMOUNT_CHAR_WIDTH + 6.); // Initial width for "0"
     let code = cc.compile("AMOUNT_CHAR_WIDTH").unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
     prop.set_f32(atom, Role::App, 3, AMOUNT_FONTSIZE).unwrap();
@@ -377,10 +398,10 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 1.).unwrap();
     prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     input_node.set_property_f32(atom, Role::App, "cursor_ascent", 0.).unwrap();
-    input_node.set_property_f32(atom, Role::App, "cursor_descent", AMOUNT_FONTSIZE*1.3).unwrap();
-    input_node.set_property_f32(atom, Role::App, "select_ascent", AMOUNT_FONTSIZE*1.3).unwrap();
-    input_node.set_property_f32(atom, Role::App, "select_descent", AMOUNT_FONTSIZE/3.).unwrap();
-    input_node.set_property_f32(atom, Role::App, "handle_descent", AMOUNT_FONTSIZE/2.5).unwrap();
+    input_node.set_property_f32(atom, Role::App, "cursor_descent", AMOUNT_FONTSIZE * 1.3).unwrap();
+    input_node.set_property_f32(atom, Role::App, "select_ascent", AMOUNT_FONTSIZE * 1.3).unwrap();
+    input_node.set_property_f32(atom, Role::App, "select_descent", AMOUNT_FONTSIZE / 3.).unwrap();
+    input_node.set_property_f32(atom, Role::App, "handle_descent", AMOUNT_FONTSIZE / 2.5).unwrap();
     input_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
 
     input_node.set_property_str(atom, Role::App, "placeholder_text", "0").unwrap();
@@ -448,10 +469,18 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 1.).unwrap();
     prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     token_symbol_node.set_property_f32(atom, Role::App, "cursor_ascent", 0.).unwrap();
-    token_symbol_node.set_property_f32(atom, Role::App, "cursor_descent", AMOUNT_FONTSIZE*1.3).unwrap();
-    token_symbol_node.set_property_f32(atom, Role::App, "select_ascent", AMOUNT_FONTSIZE*1.3).unwrap();
-    token_symbol_node.set_property_f32(atom, Role::App, "select_descent", AMOUNT_FONTSIZE/3.).unwrap();
-    token_symbol_node.set_property_f32(atom, Role::App, "handle_descent", AMOUNT_FONTSIZE/2.5).unwrap();
+    token_symbol_node
+        .set_property_f32(atom, Role::App, "cursor_descent", AMOUNT_FONTSIZE * 1.3)
+        .unwrap();
+    token_symbol_node
+        .set_property_f32(atom, Role::App, "select_ascent", AMOUNT_FONTSIZE * 1.3)
+        .unwrap();
+    token_symbol_node
+        .set_property_f32(atom, Role::App, "select_descent", AMOUNT_FONTSIZE / 3.)
+        .unwrap();
+    token_symbol_node
+        .set_property_f32(atom, Role::App, "handle_descent", AMOUNT_FONTSIZE / 2.5)
+        .unwrap();
     token_symbol_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
 
     let token_symbol_node = token_symbol_node
@@ -468,17 +497,19 @@ pub async fn make(
     amount_wrapper.link(token_symbol_node.clone());
 
     // Add amount button with states
-    let (node, btn_bg_valid, btn_bg_invalid, add_amount_label_node) = create_bottom_button_with_states(
-        app,
-        atom,
-        &send_step3_layer,
-        "send_add_amount_btn",
-        &mut cc,
-        "add amount",
-        &window_scale,
-        i18n_fish,
-        false, // Start with invalid state (grey)
-    ).await;
+    let (node, btn_bg_valid, btn_bg_invalid, add_amount_label_node) =
+        create_bottom_button_with_states(
+            app,
+            atom,
+            &send_step3_layer,
+            "send_add_amount_btn",
+            &mut cc,
+            "add amount",
+            &window_scale,
+            i18n_fish,
+            false, // Start with invalid state (grey)
+        )
+        .await;
 
     // Amount input validation listener
     let amount_input2 = input_node.clone();
@@ -497,11 +528,14 @@ pub async fn make(
         while let Ok(_) = amount_text_sub.receive().await {
             let atom = &mut renderer.make_guard(gfxtag!("wallet amount input recv"));
             // Reset error message on amount change
-            if let Some(error_node) = sg_root.lookup_node("/window/content/wallet/send_step3_layer/error") {
+            if let Some(error_node) =
+                sg_root.lookup_node("/window/content/wallet/send_step3_layer/error")
+            {
                 error_node.set_property_str(atom, Role::App, "text", "").unwrap();
             }
 
-            let label_text_color = add_amount_label_node_for_validation.get_property("text_color").unwrap();
+            let label_text_color =
+                add_amount_label_node_for_validation.get_property("text_color").unwrap();
             let btn_bg_valid_visible = btn_bg_valid_clone.get_property("is_visible").unwrap();
             let btn_bg_invalid_visible = btn_bg_invalid_clone.get_property("is_visible").unwrap();
             let amount = amount_input2.get_property_str("text").unwrap();
@@ -527,7 +561,8 @@ pub async fn make(
                     &amount_input2,
                     &token_symbol_node2,
                     Some(&available_balance_node2),
-                ).await;
+                )
+                .await;
                 let is_valid = if sanitized_amount == "0" {
                     false
                 } else {
@@ -661,9 +696,11 @@ pub async fn make(
     let listen_step3_visible = app.ex.spawn(async move {
         while let Ok(_) = step3_is_visible_sub.receive().await {
             if step3_is_visible_clone.get() {
-                loop { // TODO: this waits for draw, there's probably a better way
+                loop {
+                    // TODO: this waits for draw, there's probably a better way
                     darkfi::system::msleep(50).await;
-                    let input_rect = PropertyRect::wrap(&input_node_clone, Role::App, "rect").unwrap();
+                    let input_rect =
+                        PropertyRect::wrap(&input_node_clone, Role::App, "rect").unwrap();
                     if input_rect.has_cached() {
                         break;
                     }
@@ -674,11 +711,15 @@ pub async fn make(
 
                 let (token_id, token_symbol) = {
                     let data = send_tx_data_clone.lock().unwrap();
-                    (data.token_id.clone(), data.token_symbol.clone().unwrap_or_else(|| "".to_string()))
+                    (
+                        data.token_id.clone(),
+                        data.token_symbol.clone().unwrap_or_else(|| "".to_string()),
+                    )
                 };
                 if let Some(token_id) = token_id {
                     if !token_symbol.is_empty() {
-                        let atom = &mut renderer_clone.make_guard(gfxtag!("update amount positions on visible"));
+                        let atom = &mut renderer_clone
+                            .make_guard(gfxtag!("update amount positions on visible"));
                         update_amount_screen(
                             atom,
                             &sg_root,
@@ -688,7 +729,8 @@ pub async fn make(
                             &input_node_clone,
                             &token_symbol_node_clone,
                             Some(&available_balance_node_clone),
-                        ).await;
+                        )
+                        .await;
                     }
                 }
             } else {

+ 60 - 21
bin/app/src/app/schema/wallet/send_step4.rs

@@ -22,9 +22,9 @@ use darkfi_serial::{Decodable, Encodable};
 
 use crate::{
     app::{
-        App,
         node::{create_button, create_layer, create_text, create_vector_art},
         schema::COLOR_SCHEME,
+        App,
     },
     expr,
     gfx::gfxtag,
@@ -72,7 +72,8 @@ pub async fn make(
     send_step4_layer.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
     let send_step4_layer = send_step4_layer.setup(|me| Layer::new(me, app.renderer.clone())).await;
     wallet_layer.link(send_step4_layer.clone());
-    let step4_is_visible = PropertyBool::wrap(&send_step4_layer, Role::App, "is_visible", 0).unwrap();
+    let step4_is_visible =
+        PropertyBool::wrap(&send_step4_layer, Role::App, "is_visible", 0).unwrap();
 
     create_bg_mesh(app, atom, &send_step4_layer, "send_bg4").await;
     create_header_bg(app, atom, &send_step4_layer, "send_header_bg4").await;
@@ -239,7 +240,14 @@ pub async fn make(
     // Separator line
     let mut y_ = y.clone();
     let y2 = format!("{y} + (PADDING_Y * 2. + addr_height) + 1");
-    let node = create_separator(&app.renderer, atom, &send_step4_layer, "send_amount_label_separator4", &mut y_).await;
+    let node = create_separator(
+        &app.renderer,
+        atom,
+        &send_step4_layer,
+        "send_amount_label_separator4",
+        &mut y_,
+    )
+    .await;
     let prop = node.get_property("rect").unwrap();
     let code = cc.compile(&y2).unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
@@ -312,7 +320,8 @@ pub async fn make(
     let tx_fee_label_node = create_text("send_fee_label");
     let prop = tx_fee_label_node.get_property("rect").unwrap();
     prop.set_f32(atom, Role::App, 0, PADDING_X).unwrap();
-    let code = cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - BASE_FONTSIZE - 1").unwrap();
+    let code =
+        cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - BASE_FONTSIZE - 1").unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
     prop.set_f32(atom, Role::App, 2, 1000.).unwrap();
     prop.set_f32(atom, Role::App, 3, BASE_FONTSIZE).unwrap();
@@ -324,14 +333,17 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, 0.).unwrap();
     prop.set_f32(atom, Role::App, 3, 0.).unwrap();
     tx_fee_label_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
-    let tx_fee_label_node = tx_fee_label_node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let tx_fee_label_node = tx_fee_label_node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     send_step4_layer.link(tx_fee_label_node.clone());
 
     // Transaction fee value
     let tx_fee_value_node = create_text("send_fee_value");
     let prop = tx_fee_value_node.get_property("rect").unwrap();
     prop.set_f32(atom, Role::App, 0, PADDING_X).unwrap();
-    let code = cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - BASE_FONTSIZE - 1").unwrap();
+    let code =
+        cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - BASE_FONTSIZE - 1").unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
     let code = cc.compile("w - PADDING_X * 2").unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
@@ -345,7 +357,9 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 1, 0.).unwrap();
     prop.set_f32(atom, Role::App, 2, 0.).unwrap();
     prop.set_f32(atom, Role::App, 3, 0.).unwrap();
-    let tx_fee_value_node = tx_fee_value_node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let tx_fee_value_node = tx_fee_value_node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     send_step4_layer.link(tx_fee_value_node.clone());
 
     // Separator line
@@ -356,7 +370,8 @@ pub async fn make(
         "tx_fee_separator",
         &mut cc,
         "h - PADDING_X * 2 - BUTTON_HEIGHT",
-    ).await;
+    )
+    .await;
 
     // Send button (bottom button)
     let (node, _bg_valid, _bg_invalid, _label) = create_bottom_button_with_states(
@@ -369,7 +384,8 @@ pub async fn make(
         &window_scale,
         i18n_fish,
         true,
-    ).await;
+    )
+    .await;
 
     let renderer = app.renderer.clone();
     let sg_root = app.sg_root.clone();
@@ -380,7 +396,9 @@ pub async fn make(
     let listen_click = app.ex.spawn(async move {
         while let Ok(_) = recvr.recv().await {
             // Skip if the button is disabled
-            if let Some(btn_node) = sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg") {
+            if let Some(btn_node) =
+                sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg")
+            {
                 if !btn_node.get_property_bool("is_visible").unwrap() {
                     continue;
                 }
@@ -397,17 +415,25 @@ pub async fn make(
             if let (Some(tx), Some(drk_node)) = (tx, sg_root.lookup_node("/plugin/drk")) {
                 let mut encoded_data = vec![];
                 tx.encode(&mut encoded_data).unwrap();
-                if let Ok(Some(response_data)) = drk_node.call_method("broadcast_tx", encoded_data).await {
+                if let Ok(Some(response_data)) =
+                    drk_node.call_method("broadcast_tx", encoded_data).await
+                {
                     let mut cur = std::io::Cursor::new(response_data);
                     if let Ok(tx_id) = String::decode(&mut cur) {
                         d!("Transaction broadcasted: {tx_id}");
                         let mut tx_id_data = vec![];
                         tx_id.encode(&mut tx_id_data).unwrap();
-                        if let Ok(Some(data)) = drk_node.call_method("get_tx_status", tx_id_data).await {
+                        if let Ok(Some(data)) =
+                            drk_node.call_method("get_tx_status", tx_id_data).await
+                        {
                             let mut cur = std::io::Cursor::new(data);
                             if let Ok(status_text) = String::decode(&mut cur) {
-                                if let Some(tx_status) = sg_root.lookup_node("/window/content/wallet/tx_status_layer/status") {
-                                    tx_status.set_property_str(atom, Role::App, "text", status_text).unwrap();
+                                if let Some(tx_status) = sg_root
+                                    .lookup_node("/window/content/wallet/tx_status_layer/status")
+                                {
+                                    tx_status
+                                        .set_property_str(atom, Role::App, "text", status_text)
+                                        .unwrap();
                                 }
                             }
                         }
@@ -432,7 +458,9 @@ pub async fn make(
             if step4_is_visible_clone.get() {
                 loop {
                     darkfi::system::msleep(50).await;
-                    let text_rect = crate::prop::PropertyRect::wrap(&amount_text_node_clone, Role::App, "rect").unwrap();
+                    let text_rect =
+                        crate::prop::PropertyRect::wrap(&amount_text_node_clone, Role::App, "rect")
+                            .unwrap();
                     if text_rect.has_cached() {
                         break;
                     }
@@ -454,22 +482,29 @@ pub async fn make(
                     &amount_text_node_clone,
                     &token_symbol_node_clone,
                     None,
-                ).await;
+                )
+                .await;
 
                 if data.tx_built {
                     // Set send button label
-                    if let Some(send_label_node) = sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_btn_label") {
+                    if let Some(send_label_node) = sg_root
+                        .lookup_node("/window/content/wallet/send_step4_layer/send_btn_label")
+                    {
                         send_label_node.set_property_str(atom, Role::App, "text", "send").unwrap();
                     }
                     // Show transaction fee
-                    if let Some(tx_fee_label) = sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_fee_label") {
+                    if let Some(tx_fee_label) = sg_root
+                        .lookup_node("/window/content/wallet/send_step4_layer/send_fee_label")
+                    {
                         let prop = tx_fee_label.get_property("text_color").unwrap();
                         prop.set_f32(atom, Role::App, 0, 1.).unwrap();
                         prop.set_f32(atom, Role::App, 1, 1.).unwrap();
                         prop.set_f32(atom, Role::App, 2, 1.).unwrap();
                         prop.set_f32(atom, Role::App, 3, 1.).unwrap();
                     }
-                    if let Some(tx_fee_value) = sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_fee_value") {
+                    if let Some(tx_fee_value) = sg_root
+                        .lookup_node("/window/content/wallet/send_step4_layer/send_fee_value")
+                    {
                         let prop = tx_fee_value.get_property("text_color").unwrap();
                         prop.set_f32(atom, Role::App, 0, 1.).unwrap();
                         prop.set_f32(atom, Role::App, 1, 1.).unwrap();
@@ -478,14 +513,18 @@ pub async fn make(
                     }
                 } else {
                     // Hide transaction fee
-                    if let Some(tx_fee_label) = sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_fee_label") {
+                    if let Some(tx_fee_label) = sg_root
+                        .lookup_node("/window/content/wallet/send_step4_layer/send_fee_label")
+                    {
                         let prop = tx_fee_label.get_property("text_color").unwrap();
                         prop.set_f32(atom, Role::App, 0, 0.).unwrap();
                         prop.set_f32(atom, Role::App, 1, 0.).unwrap();
                         prop.set_f32(atom, Role::App, 2, 0.).unwrap();
                         prop.set_f32(atom, Role::App, 3, 0.).unwrap();
                     }
-                    if let Some(tx_fee_value) = sg_root.lookup_node("/window/content/wallet/send_step4_layer/send_fee_value") {
+                    if let Some(tx_fee_value) = sg_root
+                        .lookup_node("/window/content/wallet/send_step4_layer/send_fee_value")
+                    {
                         let prop = tx_fee_value.get_property("text_color").unwrap();
                         prop.set_f32(atom, Role::App, 0, 0.).unwrap();
                         prop.set_f32(atom, Role::App, 1, 0.).unwrap();

+ 36 - 14
bin/app/src/app/schema/wallet/tx_status.rs

@@ -18,18 +18,21 @@
 
 use std::sync::Arc;
 
-use darkfi_serial::Decodable;
 use darkfi::tx::Transaction;
+use darkfi_serial::Decodable;
 
 use crate::{
     app::{
-        App,
         node::{create_layer, create_text},
         schema::COLOR_SCHEME,
+        App,
     },
     expr,
     gfx::gfxtag,
-    prop::{Property, PropertyAtomicGuard, PropertyBool, PropertyFloat32, PropertySubType, PropertyType, Role},
+    prop::{
+        Property, PropertyAtomicGuard, PropertyBool, PropertyFloat32, PropertySubType,
+        PropertyType, Role,
+    },
     scene::{SceneNodePtr, Slot},
     ui::{Layer, Text},
     util::i18n::I18nBabelFish,
@@ -102,7 +105,8 @@ pub async fn make(
     tx_status_layer.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
     let tx_status_layer = tx_status_layer.setup(|me| Layer::new(me, app.renderer.clone())).await;
     wallet_layer.link(tx_status_layer.clone());
-    let tx_status_is_visible = PropertyBool::wrap(&tx_status_layer, Role::App, "is_visible", 0).unwrap();
+    let tx_status_is_visible =
+        PropertyBool::wrap(&tx_status_layer, Role::App, "is_visible", 0).unwrap();
 
     create_bg_mesh(app, atom, &tx_status_layer, "tx_status_bg").await;
     create_header_bg(app, atom, &tx_status_layer, "tx_status_header_bg").await;
@@ -172,7 +176,8 @@ pub async fn make(
         .await;
     tx_status_layer.link(node);
 
-    let sep = create_separator(&app.renderer, atom, &tx_status_layer, "tx_info_separator", &mut 0.).await;
+    let sep =
+        create_separator(&app.renderer, atom, &tx_status_layer, "tx_info_separator", &mut 0.).await;
     let prop = sep.get_property("rect").unwrap();
     let code = cc.compile(format!("{y} + PADDING_Y * 2 + info_height + 1")).unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
@@ -183,14 +188,22 @@ pub async fn make(
     let prop = hint_node.get_property("rect").unwrap();
     let code = cc.compile("w / 2 - (HINT_FONTSIZE * 0.7 * 31) / 2").unwrap();
     prop.set_expr(atom, Role::App, 0, code).unwrap();
-    let code = cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - HINT_FONTSIZE * 2").unwrap();
+    let code =
+        cc.compile("h - PADDING_X * 2 - BUTTON_HEIGHT - PADDING_Y - HINT_FONTSIZE * 2").unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
     let code = cc.compile("HINT_FONTSIZE * 0.7 * 31").unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
-    prop.set_f32(atom, Role::App, 3, HINT_FONTSIZE/2.).unwrap();
+    prop.set_f32(atom, Role::App, 3, HINT_FONTSIZE / 2.).unwrap();
     hint_node.set_property_f32(atom, Role::App, "font_size", HINT_FONTSIZE).unwrap();
     hint_node.set_property_enum(atom, Role::App, "text_align", "center").unwrap();
-    hint_node.set_property_str(atom, Role::App, "text", "You can close this screen while the transaction is confirming.").unwrap();
+    hint_node
+        .set_property_str(
+            atom,
+            Role::App,
+            "text",
+            "You can close this screen while the transaction is confirming.",
+        )
+        .unwrap();
     let prop = hint_node.get_property("text_color").unwrap();
     prop.set_f32(atom, Role::App, 0, 1.).unwrap();
     prop.set_f32(atom, Role::App, 1, 1.).unwrap();
@@ -210,7 +223,8 @@ pub async fn make(
         "tx_status_hint_separator",
         &mut cc,
         "h - PADDING_X * 2 - BUTTON_HEIGHT",
-    ).await;
+    )
+    .await;
 
     // Close button
     let node = create_bottom_button(
@@ -222,7 +236,8 @@ pub async fn make(
         Some("close"),
         &window_scale,
         i18n_fish,
-    ).await;
+    )
+    .await;
 
     let main_is_visible = PropertyBool::wrap(&main_layer, Role::App, "is_visible", 0).unwrap();
     let renderer = app.renderer.clone();
@@ -267,15 +282,22 @@ pub async fn make(
 
             // Update status text
             if let Some(text) = status_text {
-                if let Some(status_node) = sg_root.lookup_node("/window/content/wallet/tx_status_layer/status") {
+                if let Some(status_node) =
+                    sg_root.lookup_node("/window/content/wallet/tx_status_layer/status")
+                {
                     status_node.set_property_str(atom, Role::App, "text", &text).unwrap();
                 }
             }
 
             // Update transaction info display
-            if let (Some(amount), Some(token_symbol), Some(recipient_str)) = (amount, token_symbol, recipient_str) {
-                if let Some(tx_info) = sg_root.lookup_node("/window/content/wallet/tx_status_layer/tx_info") {
-                    let tx_text = format!("Sending {} {} to {}", amount, token_symbol, recipient_str);
+            if let (Some(amount), Some(token_symbol), Some(recipient_str)) =
+                (amount, token_symbol, recipient_str)
+            {
+                if let Some(tx_info) =
+                    sg_root.lookup_node("/window/content/wallet/tx_status_layer/tx_info")
+                {
+                    let tx_text =
+                        format!("Sending {} {} to {}", amount, token_symbol, recipient_str);
                     tx_info.set_property_str(atom, Role::App, "text", tx_text).unwrap();
                 }
             }

+ 37 - 30
bin/app/src/app/schema/wallet/util.rs

@@ -24,15 +24,16 @@ use futures::FutureExt;
 use smol::channel::unbounded;
 
 use crate::{
-    app::App,
-    app::node::{create_button, create_layer, create_text, create_vector_art},
-    app::schema::COLOR_SCHEME,
+    app::{
+        node::{create_button, create_layer, create_text, create_vector_art},
+        schema::COLOR_SCHEME,
+        App,
+    },
     expr::{self, Compiler},
     gfx::{gfxtag, Renderer},
-    mesh::{COLOR_TEAL, COLOR_CYAN},
+    mesh::{COLOR_CYAN, COLOR_TEAL},
     prop::{PropertyAtomicGuard, PropertyFloat32, Role},
-    scene::SceneNodePtr,
-    scene::Pimpl,
+    scene::{Pimpl, SceneNodePtr},
     text,
     ui::{Button, Layer, Text, VectorArt, VectorShape},
     util::i18n::I18nBabelFish,
@@ -41,16 +42,12 @@ use crate::{
 use super::{super::ColorScheme, data::*};
 
 pub async fn get_balance(sg_root: &SceneNodePtr, token_id: &TokenId) -> u64 {
-    let Some(drk_node) = sg_root.lookup_node("/plugin/drk") else {
-        return 0
-    };
+    let Some(drk_node) = sg_root.lookup_node("/plugin/drk") else { return 0 };
     let Ok(Some(response_data)) = drk_node.call_method("get_balances", vec![]).await else {
         return 0
     };
     let mut cur = std::io::Cursor::new(response_data);
-    let Ok(balances) = Vec::<(String, TokenId, u64)>::decode(&mut cur) else {
-        return 0
-    };
+    let Ok(balances) = Vec::<(String, TokenId, u64)>::decode(&mut cur) else { return 0 };
 
     balances
         .iter()
@@ -86,7 +83,9 @@ pub async fn update_amount_screen(
     cc.add_const_f32("AMOUNT_FONTSIZE", AMOUNT_FONTSIZE);
 
     let wrapper_rect = amount_wrapper_node.get_property("rect").unwrap();
-    wrapper_rect.set_expr(atom, Role::App, 0, cc.compile("(w - AMOUNT_TOTAL_WIDTH) / 2").unwrap()).unwrap();
+    wrapper_rect
+        .set_expr(atom, Role::App, 0, cc.compile("(w - AMOUNT_TOTAL_WIDTH) / 2").unwrap())
+        .unwrap();
 
     let width_code = cc.compile("AMOUNT_WIDTH").unwrap();
     let amount_rect = amount_input_node.get_property("rect").unwrap();
@@ -102,13 +101,17 @@ pub async fn update_amount_screen(
 
     // Update token symbol position
     let token_rect = token_node.get_property("rect").unwrap();
-    token_rect.set_expr(atom, Role::App, 0, cc.compile("AMOUNT_TOKEN_SPACING + AMOUNT_WIDTH").unwrap()).unwrap();
+    token_rect
+        .set_expr(atom, Role::App, 0, cc.compile("AMOUNT_TOKEN_SPACING + AMOUNT_WIDTH").unwrap())
+        .unwrap();
 
     // Set available balance
     let balance = get_balance(sg_root, token_id).await;
     if let Some(available_balance_node) = available_balance_node {
         let available_balance = encode_base10(balance, BALANCE_BASE10_DECIMALS);
-        available_balance_node.set_property_str(atom, Role::App, "text", format!("{available_balance} available")).unwrap();
+        available_balance_node
+            .set_property_str(atom, Role::App, "text", format!("{available_balance} available"))
+            .unwrap();
     }
 
     balance
@@ -146,7 +149,9 @@ pub async fn create_title(
         prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     }
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
-    let node = node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let node = node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     layer.link(node.clone());
 
     *y += TITLE_PADDING * 2. + TITLE_FONTSIZE + 1.;
@@ -188,7 +193,9 @@ pub async fn create_subtitle(
         prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     }
     node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
-    let node = node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let node = node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     layer.link(node.clone());
 
     *y += PADDING_Y * 2. + TITLE_FONTSIZE + 1.;
@@ -365,7 +372,9 @@ pub async fn create_bottom_button(
         let label_node = create_text(&format!("{}_label", name));
         let prop = label_node.get_property("rect").unwrap();
         prop.set_f32(atom, Role::App, 0, PADDING_X).unwrap();
-        let code = cc.compile("h - PADDING_X - BUTTON_HEIGHT + BUTTON_HEIGHT / 2 - BUTTON_FONTSIZE / 1.8").unwrap();
+        let code = cc
+            .compile("h - PADDING_X - BUTTON_HEIGHT + BUTTON_HEIGHT / 2 - BUTTON_FONTSIZE / 1.8")
+            .unwrap();
         prop.set_expr(atom, Role::App, 1, code).unwrap();
         let code = cc.compile("w - PADDING_X * 2.").unwrap();
         prop.set_expr(atom, Role::App, 2, code).unwrap();
@@ -381,7 +390,9 @@ pub async fn create_bottom_button(
         prop.set_f32(atom, Role::App, 3, COLOR_CYAN[3]).unwrap();
         label_node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
         let label_node = label_node
-            .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+            .setup(|me| {
+                Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())
+            })
             .await;
         layer.link(label_node);
     }
@@ -465,7 +476,9 @@ pub async fn create_bottom_button_with_states(
     let label_node = create_text(&format!("{}_label", name));
     let prop = label_node.get_property("rect").unwrap();
     prop.set_f32(atom, Role::App, 0, PADDING_X).unwrap();
-    let code = cc.compile("h - PADDING_X - BUTTON_HEIGHT + BUTTON_HEIGHT / 2 - BUTTON_FONTSIZE / 1.8").unwrap();
+    let code = cc
+        .compile("h - PADDING_X - BUTTON_HEIGHT + BUTTON_HEIGHT / 2 - BUTTON_FONTSIZE / 1.8")
+        .unwrap();
     prop.set_expr(atom, Role::App, 1, code).unwrap();
     let code = cc.compile("w - PADDING_X * 2.").unwrap();
     prop.set_expr(atom, Role::App, 2, code).unwrap();
@@ -523,15 +536,7 @@ pub async fn create_tooltip(
 
     // Get actual text dimensions using make_layout
     let scale = window_scale.get();
-    let layout = text::make_layout(
-        text,
-        text_color,
-        HINT_FONTSIZE,
-        1.0,
-        scale,
-        None,
-        &[],
-    );
+    let layout = text::make_layout(text, text_color, HINT_FONTSIZE, 1.0, scale, None, &[]);
     let text_width = layout.width();
     let text_height = HINT_FONTSIZE * 1.2;
 
@@ -595,7 +600,9 @@ pub async fn create_tooltip(
     prop.set_f32(atom, Role::App, 2, text_color[2]).unwrap();
     prop.set_f32(atom, Role::App, 3, text_color[3]).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
-    let node = node.setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone())).await;
+    let node = node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone()))
+        .await;
     tooltip_layer.link(node);
 
     // Subscribe to show method for auto-hide behavior

+ 4 - 5
bin/app/src/clipboard.rs

@@ -54,11 +54,10 @@ pub fn get() -> Option<String> {
 pub fn set(text: &str) {
     #[cfg(target_os = "linux")]
     if let Some(clipboard) = get_clipboard() {
-        if clipboard.store(
-            clipboard.setter.atoms.clipboard,
-            clipboard.setter.atoms.utf8_string,
-            text,
-        ).is_ok() {
+        if clipboard
+            .store(clipboard.setter.atoms.clipboard, clipboard.setter.atoms.utf8_string, text)
+            .is_ok()
+        {
             return
         }
     }

+ 364 - 314
bin/app/src/main.rs

@@ -21,13 +21,11 @@
 #![cfg_attr(target_os = "windows", windows_subsystem = "windows")]
 
 use clap::Parser;
-use darkfi::system::CondVar;
-use darkfi::tx::Transaction;
-use darkfi::util::parse::encode_base10;
+use darkfi::{system::CondVar, tx::Transaction, util::parse::encode_base10};
 use darkfi_money_contract::model::DARK_TOKEN_ID;
-use darkfi_serial::{Decodable, Encodable, deserialize};
-use std::sync::{Arc, OnceLock};
+use darkfi_serial::{deserialize, Decodable, Encodable};
 use smol::Task;
+use std::sync::{Arc, OnceLock};
 
 #[macro_use]
 extern crate tracing;
@@ -272,21 +270,21 @@ async fn load_plugins(
 
     #[cfg(feature = "enable-plugin-darkirc")]
     {
-    let darkirc = create_darkirc("darkirc");
-    let darkirc = darkirc
-        .setup(|me| async {
-            plugin::DarkIrc2::new(me, sg_root.clone(), ex.clone())
-                .await
-                .expect("DarkIrc pimpl setup")
-        })
-        .await;
-
-    let (slot, recvr) = Slot::new("recvmsg");
-    darkirc.register("recv", slot).unwrap();
-    let sg_root2 = sg_root.clone();
-    let darkirc_nick = PropertyStr::wrap(&darkirc, Role::App, "nick", 0).unwrap();
-    let renderer2 = renderer.clone();
-    let listen_recv = ex.spawn(async move {
+        let darkirc = create_darkirc("darkirc");
+        let darkirc = darkirc
+            .setup(|me| async {
+                plugin::DarkIrc2::new(me, sg_root.clone(), ex.clone())
+                    .await
+                    .expect("DarkIrc pimpl setup")
+            })
+            .await;
+
+        let (slot, recvr) = Slot::new("recvmsg");
+        darkirc.register("recv", slot).unwrap();
+        let sg_root2 = sg_root.clone();
+        let darkirc_nick = PropertyStr::wrap(&darkirc, Role::App, "nick", 0).unwrap();
+        let renderer2 = renderer.clone();
+        let listen_recv = ex.spawn(async move {
         while let Ok(data) = recvr.recv().await {
             let atom = &mut renderer2.make_guard(gfxtag!("darkirc msg recv"));
 
@@ -343,340 +341,388 @@ async fn load_plugins(
         }
     });
 
-    let (slot, recvr) = Slot::new("connect");
-    darkirc.register("connect", slot).unwrap();
-    let sg_root2 = sg_root.clone();
-    let renderer2 = renderer.clone();
-    let listen_connect = ex.spawn(async move {
-        let net0 = sg_root2.lookup_node("/window/content/netstatus_layer/net0").unwrap();
-        let net1 = sg_root2.lookup_node("/window/content/netstatus_layer/net1").unwrap();
-        let net2 = sg_root2.lookup_node("/window/content/netstatus_layer/net2").unwrap();
-        let net3 = sg_root2.lookup_node("/window/content/netstatus_layer/net3").unwrap();
-
-        let net0_is_visible = PropertyBool::wrap(&net0, Role::App, "is_visible", 0).unwrap();
-        let net1_is_visible = PropertyBool::wrap(&net1, Role::App, "is_visible", 0).unwrap();
-        let net2_is_visible = PropertyBool::wrap(&net2, Role::App, "is_visible", 0).unwrap();
-        let net3_is_visible = PropertyBool::wrap(&net3, Role::App, "is_visible", 0).unwrap();
+        let (slot, recvr) = Slot::new("connect");
+        darkirc.register("connect", slot).unwrap();
+        let sg_root2 = sg_root.clone();
+        let renderer2 = renderer.clone();
+        let listen_connect = ex.spawn(async move {
+            let net0 = sg_root2.lookup_node("/window/content/netstatus_layer/net0").unwrap();
+            let net1 = sg_root2.lookup_node("/window/content/netstatus_layer/net1").unwrap();
+            let net2 = sg_root2.lookup_node("/window/content/netstatus_layer/net2").unwrap();
+            let net3 = sg_root2.lookup_node("/window/content/netstatus_layer/net3").unwrap();
 
-        while let Ok(data) = recvr.recv().await {
-            let (peers_count, is_dag_synced): (u32, bool) = deserialize(&data).unwrap();
+            let net0_is_visible = PropertyBool::wrap(&net0, Role::App, "is_visible", 0).unwrap();
+            let net1_is_visible = PropertyBool::wrap(&net1, Role::App, "is_visible", 0).unwrap();
+            let net2_is_visible = PropertyBool::wrap(&net2, Role::App, "is_visible", 0).unwrap();
+            let net3_is_visible = PropertyBool::wrap(&net3, Role::App, "is_visible", 0).unwrap();
 
-            let atom = &mut renderer2.make_guard(gfxtag!("netstatus change"));
+            while let Ok(data) = recvr.recv().await {
+                let (peers_count, is_dag_synced): (u32, bool) = deserialize(&data).unwrap();
 
-            if peers_count == 0 {
-                net0_is_visible.set(atom, true);
-                net1_is_visible.set(atom, false);
-                net2_is_visible.set(atom, false);
-                net3_is_visible.set(atom, false);
-                continue
-            }
+                let atom = &mut renderer2.make_guard(gfxtag!("netstatus change"));
 
-            assert!(peers_count > 0);
-            if !is_dag_synced {
-                net0_is_visible.set(atom, false);
-                net1_is_visible.set(atom, true);
-                net2_is_visible.set(atom, false);
-                net3_is_visible.set(atom, false);
-                continue
-            }
+                if peers_count == 0 {
+                    net0_is_visible.set(atom, true);
+                    net1_is_visible.set(atom, false);
+                    net2_is_visible.set(atom, false);
+                    net3_is_visible.set(atom, false);
+                    continue
+                }
+
+                assert!(peers_count > 0);
+                if !is_dag_synced {
+                    net0_is_visible.set(atom, false);
+                    net1_is_visible.set(atom, true);
+                    net2_is_visible.set(atom, false);
+                    net3_is_visible.set(atom, false);
+                    continue
+                }
+
+                assert!(peers_count > 0 && is_dag_synced);
+                if peers_count == 1 {
+                    net0_is_visible.set(atom, false);
+                    net1_is_visible.set(atom, false);
+                    net2_is_visible.set(atom, true);
+                    net3_is_visible.set(atom, false);
+                    continue
+                }
 
-            assert!(peers_count > 0 && is_dag_synced);
-            if peers_count == 1 {
                 net0_is_visible.set(atom, false);
                 net1_is_visible.set(atom, false);
-                net2_is_visible.set(atom, true);
-                net3_is_visible.set(atom, false);
-                continue
+                net2_is_visible.set(atom, false);
+                net3_is_visible.set(atom, true);
             }
+        });
 
-            net0_is_visible.set(atom, false);
-            net1_is_visible.set(atom, false);
-            net2_is_visible.set(atom, false);
-            net3_is_visible.set(atom, true);
-        }
-    });
-
-    plugin.link(darkirc);
+        plugin.link(darkirc);
 
-    listeners.push(listen_recv);
-    listeners.push(listen_connect);
+        listeners.push(listen_recv);
+        listeners.push(listen_connect);
     }
 
     #[cfg(feature = "enable-plugin-fud")]
     {
-    let fud = create_fud("fud");
-    let sg_root2 = sg_root.clone();
-    let fud = fud
-        .setup(|me| async {
-            plugin::FudPlugin::new(me, sg_root2, ex.clone()).await.expect("Fud pimpl setup")
-        })
-        .await;
-
-    let (slot, recv) = Slot::new("file_status_update");
-    let _ = fud.register("file_status_updated", slot);
-    let sg_root2 = sg_root.clone();
-    let listen_file_status = ex.spawn(async move {
-        while let Ok(data) = recv.recv().await {
-            let window = sg_root2.lookup_node("/window/content").unwrap();
-            let mut cur = Cursor::new(&data);
-            let url = Url::decode(&mut cur).unwrap();
-            let status = chatview::FileMessageStatus::decode(&mut cur).unwrap();
-            for child in window.get_children() {
-                if let Some(chatty) = child.lookup_node("/content/chatty") {
-                    let mut data = vec![];
-                    url.encode(&mut data).unwrap();
-                    status.encode(&mut data).unwrap();
-                    let _ = chatty.call_method("set_file_status", data).await;
+        let fud = create_fud("fud");
+        let sg_root2 = sg_root.clone();
+        let fud = fud
+            .setup(|me| async {
+                plugin::FudPlugin::new(me, sg_root2, ex.clone()).await.expect("Fud pimpl setup")
+            })
+            .await;
+
+        let (slot, recv) = Slot::new("file_status_update");
+        let _ = fud.register("file_status_updated", slot);
+        let sg_root2 = sg_root.clone();
+        let listen_file_status = ex.spawn(async move {
+            while let Ok(data) = recv.recv().await {
+                let window = sg_root2.lookup_node("/window/content").unwrap();
+                let mut cur = Cursor::new(&data);
+                let url = Url::decode(&mut cur).unwrap();
+                let status = chatview::FileMessageStatus::decode(&mut cur).unwrap();
+                for child in window.get_children() {
+                    if let Some(chatty) = child.lookup_node("/content/chatty") {
+                        let mut data = vec![];
+                        url.encode(&mut data).unwrap();
+                        status.encode(&mut data).unwrap();
+                        let _ = chatty.call_method("set_file_status", data).await;
+                    }
                 }
             }
-        }
-    });
+        });
 
-    plugin.link(fud);
+        plugin.link(fud);
 
-    listeners.push(listen_file_status);
+        listeners.push(listen_file_status);
     }
 
     #[cfg(feature = "enable-plugin-drk")]
     {
-    let drk = create_drk("drk");
-    let drk = drk
-        .setup(|me| async {
-            plugin::DrkPlugin::new(me, sg_root.clone(), ex.clone()).await.expect("Drk pimpl setup")
-        })
-        .await;
-
-    let (slot, recvr) = Slot::new("connect");
-    drk.register("connect", slot).unwrap();
-    let sg_root2 = sg_root.clone();
-    let renderer2 = renderer.clone();
-    let listen_connect = ex.spawn(async move {
-        let net0 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net0").unwrap();
-        let net1 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net1").unwrap();
-        let net2 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net2").unwrap();
-        let net3 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net3").unwrap();
-
-        let net0_is_visible = PropertyBool::wrap(&net0, Role::App, "is_visible", 0).unwrap();
-        let net1_is_visible = PropertyBool::wrap(&net1, Role::App, "is_visible", 0).unwrap();
-        let net2_is_visible = PropertyBool::wrap(&net2, Role::App, "is_visible", 0).unwrap();
-        let net3_is_visible = PropertyBool::wrap(&net3, Role::App, "is_visible", 0).unwrap();
-
-        while let Ok(data) = recvr.recv().await {
-            let status: u8 = deserialize(&data).unwrap();
-            let atom = &mut renderer2.make_guard(gfxtag!("blockchain netstatus change"));
-
-            match status {
-                1 => {
-                    net0_is_visible.set(atom, false);
-                    net1_is_visible.set(atom, true);
-                    net2_is_visible.set(atom, false);
-                    net3_is_visible.set(atom, false);
-                },
-                2 => {
-                    net0_is_visible.set(atom, false);
-                    net1_is_visible.set(atom, false);
-                    net2_is_visible.set(atom, true);
-                    net3_is_visible.set(atom, false);
-                },
-                3 => {
-                    net0_is_visible.set(atom, false);
-                    net1_is_visible.set(atom, false);
-                    net2_is_visible.set(atom, false);
-                    net3_is_visible.set(atom, true);
-                },
-                _ => {
-                    net0_is_visible.set(atom, true);
-                    net1_is_visible.set(atom, false);
-                    net2_is_visible.set(atom, false);
-                    net3_is_visible.set(atom, false);
+        let drk = create_drk("drk");
+        let drk = drk
+            .setup(|me| async {
+                plugin::DrkPlugin::new(me, sg_root.clone(), ex.clone())
+                    .await
+                    .expect("Drk pimpl setup")
+            })
+            .await;
+
+        let (slot, recvr) = Slot::new("connect");
+        drk.register("connect", slot).unwrap();
+        let sg_root2 = sg_root.clone();
+        let renderer2 = renderer.clone();
+        let listen_connect = ex.spawn(async move {
+            let net0 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net0").unwrap();
+            let net1 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net1").unwrap();
+            let net2 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net2").unwrap();
+            let net3 = sg_root2.lookup_node("/window/content/wallet/netstatus_layer/net3").unwrap();
+
+            let net0_is_visible = PropertyBool::wrap(&net0, Role::App, "is_visible", 0).unwrap();
+            let net1_is_visible = PropertyBool::wrap(&net1, Role::App, "is_visible", 0).unwrap();
+            let net2_is_visible = PropertyBool::wrap(&net2, Role::App, "is_visible", 0).unwrap();
+            let net3_is_visible = PropertyBool::wrap(&net3, Role::App, "is_visible", 0).unwrap();
+
+            while let Ok(data) = recvr.recv().await {
+                let status: u8 = deserialize(&data).unwrap();
+                let atom = &mut renderer2.make_guard(gfxtag!("blockchain netstatus change"));
+
+                match status {
+                    1 => {
+                        net0_is_visible.set(atom, false);
+                        net1_is_visible.set(atom, true);
+                        net2_is_visible.set(atom, false);
+                        net3_is_visible.set(atom, false);
+                    }
+                    2 => {
+                        net0_is_visible.set(atom, false);
+                        net1_is_visible.set(atom, false);
+                        net2_is_visible.set(atom, true);
+                        net3_is_visible.set(atom, false);
+                    }
+                    3 => {
+                        net0_is_visible.set(atom, false);
+                        net1_is_visible.set(atom, false);
+                        net2_is_visible.set(atom, false);
+                        net3_is_visible.set(atom, true);
+                    }
+                    _ => {
+                        net0_is_visible.set(atom, true);
+                        net1_is_visible.set(atom, false);
+                        net2_is_visible.set(atom, false);
+                        net3_is_visible.set(atom, false);
+                    }
                 }
             }
-        }
-    });
+        });
 
-    let (slot, recv) = Slot::new("balances_update");
-    let _ = drk.register("balances_updated", slot);
-    let sg_root2 = sg_root.clone();
-    let renderer2 = renderer.clone();
-    let drk_node2 = drk.clone();
-    let listen_balances = ex.spawn(async move {
-        use crate::ui::TokenRow;
-        use darkfi_money_contract::model::TokenId;
-        use darkfi_serial::Encodable;
-
-        let update = async || {
-            d!("drk balances_updated signal received");
-
-            // Fetch and update main wallet tokens table
-            if let Ok(Some(response_data)) = drk_node2.call_method("get_balances", vec![]).await {
-                let atom = &mut renderer2.make_guard(gfxtag!("wallet - refresh tokens"));
-
-                let mut cur = std::io::Cursor::new(response_data);
-                if let Ok(balances) = Vec::<(String, TokenId, u64)>::decode(&mut cur) {
-                    let token_rows: Vec<TokenRow> = balances
-                        .iter()
-                        .map(|(symbol, token_id, balance)| {
-                            TokenRow {
+        let (slot, recv) = Slot::new("balances_update");
+        let _ = drk.register("balances_updated", slot);
+        let sg_root2 = sg_root.clone();
+        let renderer2 = renderer.clone();
+        let drk_node2 = drk.clone();
+        let listen_balances = ex.spawn(async move {
+            use crate::ui::TokenRow;
+            use darkfi_money_contract::model::TokenId;
+            use darkfi_serial::Encodable;
+
+            let update = async || {
+                d!("drk balances_updated signal received");
+
+                // Fetch and update main wallet tokens table
+                if let Ok(Some(response_data)) = drk_node2.call_method("get_balances", vec![]).await
+                {
+                    let atom = &mut renderer2.make_guard(gfxtag!("wallet - refresh tokens"));
+
+                    let mut cur = std::io::Cursor::new(response_data);
+                    if let Ok(balances) = Vec::<(String, TokenId, u64)>::decode(&mut cur) {
+                        let token_rows: Vec<TokenRow> = balances
+                            .iter()
+                            .map(|(symbol, token_id, balance)| TokenRow {
                                 id: *token_id,
                                 symbol: symbol.clone(),
                                 balance: encode_base10(*balance, 8),
-                            }
-                        })
-                        .collect();
+                            })
+                            .collect();
 
-                    let mut data: Vec<u8> = vec![];
-                    for row in &token_rows {
-                        let _ = TokenRow::encode(row, &mut data);
-                    }
+                        let mut data: Vec<u8> = vec![];
+                        for row in &token_rows {
+                            let _ = TokenRow::encode(row, &mut data);
+                        }
 
-                    if let Some(tokens_table) = sg_root2.lookup_node("/window/content/wallet/main_layer/tokens_table") {
-                        let _ = tokens_table.call_method("set_tokens", data.clone()).await;
-                    }
+                        if let Some(tokens_table) =
+                            sg_root2.lookup_node("/window/content/wallet/main_layer/tokens_table")
+                        {
+                            let _ = tokens_table.call_method("set_tokens", data.clone()).await;
+                        }
 
-                    if let Some(send_tokens_table) = sg_root2.lookup_node("/window/content/wallet/send_step1_layer/tokens_table") {
-                        let _ = send_tokens_table.call_method("set_tokens", data).await;
-                    }
+                        if let Some(send_tokens_table) = sg_root2
+                            .lookup_node("/window/content/wallet/send_step1_layer/tokens_table")
+                        {
+                            let _ = send_tokens_table.call_method("set_tokens", data).await;
+                        }
 
-                    // Update main wallet balance
-                    if let Some(drk_row) = token_rows.iter().find(|row| row.id == *DARK_TOKEN_ID) {
-                        if let Some(balance_node) = sg_root2.lookup_node("/window/content/wallet/main_layer/wallet_balance") {
-                            balance_node.set_property_str(atom, Role::App, "text", format!("DRK {}", drk_row.balance)).unwrap();
+                        // Update main wallet balance
+                        if let Some(drk_row) =
+                            token_rows.iter().find(|row| row.id == *DARK_TOKEN_ID)
+                        {
+                            if let Some(balance_node) = sg_root2
+                                .lookup_node("/window/content/wallet/main_layer/wallet_balance")
+                            {
+                                balance_node
+                                    .set_property_str(
+                                        atom,
+                                        Role::App,
+                                        "text",
+                                        format!("DRK {}", drk_row.balance),
+                                    )
+                                    .unwrap();
+                            }
                         }
-                    }
 
-                    if let Some(tx_status_layer) = sg_root2.lookup_node("/window/content/wallet/tx_status_layer") {
-                        let tx_id = tx_status_layer.get_property_str("tx_id").unwrap();
-                        if !tx_id.is_empty() {
-                            let mut tx_id_data = vec![];
-                            tx_id.encode(&mut tx_id_data).unwrap();
-                            if let Ok(Some(data)) = drk_node2.call_method("get_tx_status", tx_id_data).await {
-                                let mut cur = std::io::Cursor::new(data);
-                                let status_text = String::decode(&mut cur).unwrap();
-                                if let Some(status_node) = tx_status_layer.lookup_node("/status") {
-                                    status_node.set_property_str(atom, Role::App, "text", status_text).unwrap();
+                        if let Some(tx_status_layer) =
+                            sg_root2.lookup_node("/window/content/wallet/tx_status_layer")
+                        {
+                            let tx_id = tx_status_layer.get_property_str("tx_id").unwrap();
+                            if !tx_id.is_empty() {
+                                let mut tx_id_data = vec![];
+                                tx_id.encode(&mut tx_id_data).unwrap();
+                                if let Ok(Some(data)) =
+                                    drk_node2.call_method("get_tx_status", tx_id_data).await
+                                {
+                                    let mut cur = std::io::Cursor::new(data);
+                                    let status_text = String::decode(&mut cur).unwrap();
+                                    if let Some(status_node) =
+                                        tx_status_layer.lookup_node("/status")
+                                    {
+                                        status_node
+                                            .set_property_str(atom, Role::App, "text", status_text)
+                                            .unwrap();
+                                    }
                                 }
                             }
                         }
                     }
                 }
-            }
-        };
+            };
 
-        update().await;
-        while let Ok(_) = recv.recv().await {
             update().await;
-        }
-    });
-
-    let (slot, recv) = Slot::new("tx_updated");
-    let _ = drk.register("tx_updated", slot);
-    let sg_root2 = sg_root.clone();
-    let listen_tx = ex.spawn(async move {
-        while let Ok(data) = recv.recv().await {
-            if let Some(tx_status_layer) = sg_root2.lookup_node("/window/content/wallet/tx_status_layer") {
-                let _ = tx_status_layer.call_method("set_tx_status", data).await;
+            while let Ok(_) = recv.recv().await {
+                update().await;
             }
-        }
-    });
+        });
 
-    // Listen for tx_built signal - emitted when transaction is built (non-blocking)
-    let (slot, recv) = Slot::new("tx_built");
-    let _ = drk.register("tx_built", slot);
-    let sg_root2 = sg_root.clone();
-    let renderer2 = renderer.clone();
-    let listen_tx_built = ex.spawn(async move {
-        while let Ok(data) = recv.recv().await {
-            let mut cur = std::io::Cursor::new(data);
-            let amount = String::decode(&mut cur).unwrap();
-            let token_symbol = String::decode(&mut cur).unwrap();
-            let recipient_str = String::decode(&mut cur).unwrap();
-
-            // Decode transaction and pass to wallet schema
-            let tx = Transaction::decode(&mut cur).unwrap();
-
-            // Update tx_status_layer with built transaction
-            let atom = &mut renderer2.make_guard(gfxtag!("tx built"));
-            if let Some(tx_status) = sg_root2.lookup_node("/window/content/wallet/tx_status_layer") {
-                let mut tx_status_data = vec![];
-                None::<String>.encode(&mut tx_status_data).unwrap();
-                Some("Broadcasting transaction...".to_string()).encode(&mut tx_status_data).unwrap();
-                Some(amount).encode(&mut tx_status_data).unwrap();
-                Some(token_symbol).encode(&mut tx_status_data).unwrap();
-                Some(recipient_str).encode(&mut tx_status_data).unwrap();
-                let _ = tx_status.call_method("set_tx_status", tx_status_data).await;
-
-                // Call set_built_tx to store transaction for later broadcast
-                let mut set_built_tx_data = vec![];
-                tx.encode(&mut set_built_tx_data).unwrap();
-                let _ = tx_status.call_method("set_built_tx", set_built_tx_data).await;
+        let (slot, recv) = Slot::new("tx_updated");
+        let _ = drk.register("tx_updated", slot);
+        let sg_root2 = sg_root.clone();
+        let listen_tx = ex.spawn(async move {
+            while let Ok(data) = recv.recv().await {
+                if let Some(tx_status_layer) =
+                    sg_root2.lookup_node("/window/content/wallet/tx_status_layer")
+                {
+                    let _ = tx_status_layer.call_method("set_tx_status", data).await;
+                }
             }
+        });
 
-            // Hide step3 layer
-            if let Some(step4_layer) = sg_root2.lookup_node("/window/content/wallet/send_step3_layer") {
-                step4_layer.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
-            }
+        // Listen for tx_built signal - emitted when transaction is built (non-blocking)
+        let (slot, recv) = Slot::new("tx_built");
+        let _ = drk.register("tx_built", slot);
+        let sg_root2 = sg_root.clone();
+        let renderer2 = renderer.clone();
+        let listen_tx_built = ex.spawn(async move {
+            while let Ok(data) = recv.recv().await {
+                let mut cur = std::io::Cursor::new(data);
+                let amount = String::decode(&mut cur).unwrap();
+                let token_symbol = String::decode(&mut cur).unwrap();
+                let recipient_str = String::decode(&mut cur).unwrap();
+
+                // Decode transaction and pass to wallet schema
+                let tx = Transaction::decode(&mut cur).unwrap();
+
+                // Update tx_status_layer with built transaction
+                let atom = &mut renderer2.make_guard(gfxtag!("tx built"));
+                if let Some(tx_status) =
+                    sg_root2.lookup_node("/window/content/wallet/tx_status_layer")
+                {
+                    let mut tx_status_data = vec![];
+                    None::<String>.encode(&mut tx_status_data).unwrap();
+                    Some("Broadcasting transaction...".to_string())
+                        .encode(&mut tx_status_data)
+                        .unwrap();
+                    Some(amount).encode(&mut tx_status_data).unwrap();
+                    Some(token_symbol).encode(&mut tx_status_data).unwrap();
+                    Some(recipient_str).encode(&mut tx_status_data).unwrap();
+                    let _ = tx_status.call_method("set_tx_status", tx_status_data).await;
+
+                    // Call set_built_tx to store transaction for later broadcast
+                    let mut set_built_tx_data = vec![];
+                    tx.encode(&mut set_built_tx_data).unwrap();
+                    let _ = tx_status.call_method("set_built_tx", set_built_tx_data).await;
+                }
 
-            // Show step4 layer
-            if let Some(step4_layer) = sg_root2.lookup_node("/window/content/wallet/send_step4_layer") {
-                step4_layer.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
-            }
-        }
-    });
+                // Hide step3 layer
+                if let Some(step4_layer) =
+                    sg_root2.lookup_node("/window/content/wallet/send_step3_layer")
+                {
+                    step4_layer.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
+                }
 
-    // Listen for tx_built_error signal - emitted when transaction building fails
-    let (slot, recv) = Slot::new("tx_built_error");
-    let _ = drk.register("tx_built_error", slot);
-    let sg_root2 = sg_root.clone();
-    let renderer2 = renderer.clone();
-    let listen_tx_built_error = ex.spawn(async move {
-        while let Ok(data) = recv.recv().await {
-            let mut cur = std::io::Cursor::new(data);
-            let error_message = String::decode(&mut cur).unwrap();
-            let atom = &mut renderer2.make_guard(gfxtag!("tx built error"));
-
-            // Display error message in step3
-            if let Some(error_node) = sg_root2.lookup_node("/window/content/wallet/send_step3_layer/error") {
-                error_node.set_property_str(atom, Role::App, "text", error_message).unwrap();
+                // Show step4 layer
+                if let Some(step4_layer) =
+                    sg_root2.lookup_node("/window/content/wallet/send_step4_layer")
+                {
+                    step4_layer.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
+                }
             }
+        });
 
-            // Reset step4 send button to disabled state
-            if let Some(send_label_node) = sg_root2.lookup_node("/window/content/wallet/send_step4_layer/send_btn_label") {
-                send_label_node.set_property_str(atom, Role::App, "text", "send").unwrap();
-                let prop = send_label_node.get_property("text_color").unwrap();
-                prop.set_f32(atom, Role::App, 0, 0.5).unwrap();
-                prop.set_f32(atom, Role::App, 1, 0.5).unwrap();
-                prop.set_f32(atom, Role::App, 2, 0.5).unwrap();
-                prop.set_f32(atom, Role::App, 3, 1.).unwrap();
-            }
-            if let Some(send_bg_grey_node) = sg_root2.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg_grey") {
-                send_bg_grey_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
-            }
-            if let Some(send_bg_node) = sg_root2.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg") {
-                send_bg_node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
-            }
+        // Listen for tx_built_error signal - emitted when transaction building fails
+        let (slot, recv) = Slot::new("tx_built_error");
+        let _ = drk.register("tx_built_error", slot);
+        let sg_root2 = sg_root.clone();
+        let renderer2 = renderer.clone();
+        let listen_tx_built_error = ex.spawn(async move {
+            while let Ok(data) = recv.recv().await {
+                let mut cur = std::io::Cursor::new(data);
+                let error_message = String::decode(&mut cur).unwrap();
+                let atom = &mut renderer2.make_guard(gfxtag!("tx built error"));
+
+                // Display error message in step3
+                if let Some(error_node) =
+                    sg_root2.lookup_node("/window/content/wallet/send_step3_layer/error")
+                {
+                    error_node.set_property_str(atom, Role::App, "text", error_message).unwrap();
+                }
 
-            // Go back to step3
-            if let Some(step4) = sg_root2.lookup_node("/window/content/wallet/send_step4_layer") {
-                step4.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
-            }
-            if let Some(step3) = sg_root2.lookup_node("/window/content/wallet/send_step3_layer") {
-                step3.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
-            }
+                // Reset step4 send button to disabled state
+                if let Some(send_label_node) =
+                    sg_root2.lookup_node("/window/content/wallet/send_step4_layer/send_btn_label")
+                {
+                    send_label_node.set_property_str(atom, Role::App, "text", "send").unwrap();
+                    let prop = send_label_node.get_property("text_color").unwrap();
+                    prop.set_f32(atom, Role::App, 0, 0.5).unwrap();
+                    prop.set_f32(atom, Role::App, 1, 0.5).unwrap();
+                    prop.set_f32(atom, Role::App, 2, 0.5).unwrap();
+                    prop.set_f32(atom, Role::App, 3, 1.).unwrap();
+                }
+                if let Some(send_bg_grey_node) =
+                    sg_root2.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg_grey")
+                {
+                    send_bg_grey_node
+                        .set_property_bool(atom, Role::App, "is_visible", true)
+                        .unwrap();
+                }
+                if let Some(send_bg_node) =
+                    sg_root2.lookup_node("/window/content/wallet/send_step4_layer/send_btn_bg")
+                {
+                    send_bg_node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
+                }
+
+                // Go back to step3
+                if let Some(step4) = sg_root2.lookup_node("/window/content/wallet/send_step4_layer")
+                {
+                    step4.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
+                }
+                if let Some(step3) = sg_root2.lookup_node("/window/content/wallet/send_step3_layer")
+                {
+                    step3.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
+                }
 
-            // Focus the amount input
-            if let Some(amount_input) = sg_root2.lookup_node("/window/content/wallet/send_step3_layer/send_amount_wrapper/send_amount_input") {
-                let _ = amount_input.call_method("focus", vec![]).await;
+                // Focus the amount input
+                if let Some(amount_input) = sg_root2.lookup_node(
+                    "/window/content/wallet/send_step3_layer/send_amount_wrapper/send_amount_input",
+                ) {
+                    let _ = amount_input.call_method("focus", vec![]).await;
+                }
             }
-        }
-    });
+        });
 
-    plugin.link(drk);
+        plugin.link(drk);
 
-    listeners.push(listen_connect);
-    listeners.push(listen_balances);
-    listeners.push(listen_tx);
-    listeners.push(listen_tx_built);
-    listeners.push(listen_tx_built_error);
+        listeners.push(listen_connect);
+        listeners.push(listen_balances);
+        listeners.push(listen_tx);
+        listeners.push(listen_tx_built);
+        listeners.push(listen_tx_built_error);
     }
 
     i!("Plugins loaded");
@@ -755,9 +801,7 @@ pub fn create_drk(name: &str) -> SceneNode {
     node.add_signal(
         "connect",
         "Connections and disconnects",
-        vec![
-            ("connected", "Is darkfid connected", CallArgType::Bool),
-        ],
+        vec![("connected", "Is darkfid connected", CallArgType::Bool)],
     )
     .unwrap();
 
@@ -765,19 +809,22 @@ pub fn create_drk(name: &str) -> SceneNode {
         "get_default_address",
         vec![],
         Some(vec![("address", "Default address", CallArgType::Str)]),
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_method(
         "get_balances",
         vec![],
         Some(vec![("balances", "Token balances", CallArgType::Hash)]),
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_method(
         "get_tx_status",
         vec![("tx_id", "Transaction hash", CallArgType::Str)],
         Some(vec![("status_text", "Status text", CallArgType::Str)]),
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_method(
         "build_tx",
@@ -787,13 +834,15 @@ pub fn create_drk(name: &str) -> SceneNode {
             ("recipient", "Recipient address", CallArgType::Str),
         ],
         Some(vec![("tx", "Transaction", CallArgType::Hash)]),
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_method(
         "broadcast_tx",
         vec![("tx", "Transaction", CallArgType::Hash)],
         Some(vec![("status_text", "Status text", CallArgType::Str)]),
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_signal("balances_updated", "Balances changed", vec![]).unwrap();
 
@@ -804,7 +853,8 @@ pub fn create_drk(name: &str) -> SceneNode {
             ("tx_id", "Transaction ID", CallArgType::Str),
             ("status_text", "Transaction status text", CallArgType::Str),
         ],
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_signal(
         "tx_built",
@@ -814,15 +864,15 @@ pub fn create_drk(name: &str) -> SceneNode {
             ("token_symbol", "Token symbol", CallArgType::Str),
             ("recipient_str", "Recipient address", CallArgType::Str),
         ],
-    ).unwrap();
+    )
+    .unwrap();
 
     node.add_signal(
         "tx_built_error",
         "Transaction build error",
-        vec![
-            ("error_message", "Error message", CallArgType::Str),
-        ],
-    ).unwrap();
+        vec![("error_message", "Error message", CallArgType::Str)],
+    )
+    .unwrap();
 
     node
 }

+ 9 - 7
bin/app/src/plugin/darkirc2.rs

@@ -16,7 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use std::{io::Cursor, sync::{Arc, OnceLock, Weak}};
+use std::{
+    io::Cursor,
+    sync::{Arc, OnceLock, Weak},
+};
 
 use darkfi_serial::{Decodable, Encodable};
 
@@ -24,7 +27,10 @@ use crate::{
     error::Result,
     prop::{BatchGuardPtr, PropertyStr, Role},
     scene::{MethodCallSub, Pimpl, SceneNodePtr, SceneNodeWeak},
-    ui::{chatview::{MessageId, Timestamp}, OnModify},
+    ui::{
+        chatview::{MessageId, Timestamp},
+        OnModify,
+    },
     ExecutorPtr,
 };
 
@@ -51,11 +57,7 @@ impl DarkIrc2 {
         let node_ref = &node.upgrade().unwrap();
         let nick = PropertyStr::wrap(node_ref, Role::Internal, "nick", 0).unwrap();
 
-        let self_ = Arc::new(Self {
-            node: node.clone(),
-            tasks: OnceLock::new(),
-            nick,
-        });
+        let self_ = Arc::new(Self { node: node.clone(), tasks: OnceLock::new(), nick });
 
         self_.clone().start(sg_root, ex).await;
 

+ 84 - 40
bin/app/src/plugin/drk.rs

@@ -17,16 +17,15 @@
  */
 
 use darkfi::{
-    system::{Publisher, PublisherPtr, StoppableTask, sleep},
+    system::{sleep, Publisher, PublisherPtr, StoppableTask},
     tx::Transaction,
     Result as DarkFiResult,
 };
 use darkfi_money_contract::model::TokenId;
+use darkfi_sdk::crypto::keypair::{Address, Network, PublicKey, StandardAddress};
 use darkfi_serial::{serialize, Decodable, Encodable};
-use darkfi_sdk::crypto::{keypair::{Address, Network, PublicKey, StandardAddress}};
-use drk::{Drk, rpc::subscribe_blocks};
-use smol::lock::RwLock;
-use smol::channel::unbounded;
+use drk::{rpc::subscribe_blocks, Drk};
+use smol::{channel::unbounded, lock::RwLock};
 use std::{
     io::Cursor,
     sync::{Arc, OnceLock, Weak},
@@ -36,9 +35,7 @@ use url::Url;
 use crate::{
     error::{Error, Result},
     prop::BatchGuardPtr,
-    scene::{
-        MethodCallSub, Pimpl, SceneNode, SceneNodePtr, SceneNodeType, SceneNodeWeak,
-    },
+    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodePtr, SceneNodeType, SceneNodeWeak},
     ExecutorPtr,
 };
 
@@ -129,11 +126,7 @@ pub struct DrkPlugin {
 }
 
 impl DrkPlugin {
-    pub async fn new(
-        node: SceneNodeWeak,
-        sg_root: SceneNodePtr,
-        ex: ExecutorPtr,
-    ) -> Result<Pimpl> {
+    pub async fn new(node: SceneNodeWeak, sg_root: SceneNodePtr, ex: ExecutorPtr) -> Result<Pimpl> {
         let node_ref = node.upgrade().unwrap();
 
         let setting_root = Arc::new(SceneNode::new("setting", SceneNodeType::SettingRoot));
@@ -141,7 +134,17 @@ impl DrkPlugin {
 
         let endpoint = Url::parse(DARKFID_ENDPOINT).unwrap();
 
-        let drk = match Drk::new(Network::Testnet, get_cache_path().to_string_lossy().to_string(), get_wallet_path().to_string_lossy().to_string(), "changeme".to_string(), Some(endpoint), &ex, false).await {
+        let drk = match Drk::new(
+            Network::Testnet,
+            get_cache_path().to_string_lossy().to_string(),
+            get_wallet_path().to_string_lossy().to_string(),
+            "changeme".to_string(),
+            Some(endpoint),
+            &ex,
+            false,
+        )
+        .await
+        {
             Ok(wallet) => wallet,
             Err(e) => {
                 eprintln!("Error initializing wallet: {e}");
@@ -225,9 +228,10 @@ impl DrkPlugin {
         let node_ref = node.upgrade().unwrap();
         let me2 = Arc::downgrade(&self_);
         let method_sub = node_ref.subscribe_method_call("get_default_address").unwrap();
-        let get_address_task = ex.spawn(async move {
-            while Self::process_get_default_address(&me2, &method_sub).await {}
-        });
+        let get_address_task =
+            ex.spawn(
+                async move { while Self::process_get_default_address(&me2, &method_sub).await {} },
+            );
 
         let node_ref = node.upgrade().unwrap();
         let me2 = Arc::downgrade(&self_);
@@ -246,9 +250,10 @@ impl DrkPlugin {
         let node_ref = node.upgrade().unwrap();
         let me2 = Arc::downgrade(&self_);
         let method_sub_build_tx = node_ref.subscribe_method_call("build_tx").unwrap();
-        let build_tx_task = ex.spawn(async move {
-            while Self::process_build_tx(&me2, &method_sub_build_tx).await {}
-        });
+        let build_tx_task =
+            ex.spawn(
+                async move { while Self::process_build_tx(&me2, &method_sub_build_tx).await {} },
+            );
 
         let node_ref = node.upgrade().unwrap();
         let me2 = Arc::downgrade(&self_);
@@ -257,7 +262,14 @@ impl DrkPlugin {
             while Self::process_broadcast_tx(&me2, &method_sub_broadcast_tx).await {}
         });
 
-        let tasks = vec![get_address_task, get_balances_task, get_tx_status_task, build_tx_task, broadcast_tx_task, build_tx_processor];
+        let tasks = vec![
+            get_address_task,
+            get_balances_task,
+            get_tx_status_task,
+            build_tx_task,
+            broadcast_tx_task,
+            build_tx_processor,
+        ];
         self_.clone().start(ex.clone(), tasks).await;
 
         Ok(Pimpl::Drk(self_))
@@ -340,7 +352,13 @@ impl DrkPlugin {
     }
 
     /// Emit tx_built signal when transaction is built
-    async fn emit_tx_built(&self, amount: String, token_symbol: String, recipient: Address, tx: Transaction) {
+    async fn emit_tx_built(
+        &self,
+        amount: String,
+        token_symbol: String,
+        recipient: Address,
+        tx: Transaction,
+    ) {
         if let Some(node) = self.node.upgrade() {
             let mut data = vec![];
             amount.encode(&mut data).unwrap();
@@ -499,18 +517,28 @@ impl DrkPlugin {
     }
 
     /// Build a transaction without broadcasting it
-    pub async fn build_tx(&self, amount: &str, token_id: TokenId, recipient: PublicKey) -> DarkFiResult<Transaction> {
+    pub async fn build_tx(
+        &self,
+        amount: &str,
+        token_id: TokenId,
+        recipient: PublicKey,
+    ) -> DarkFiResult<Transaction> {
         let drk = self.drk.read().await;
 
         drk.transfer(amount, token_id, recipient, None, None, false).await
     }
 
     /// Build a transaction from a BuildTxRequest (called by background task)
-    async fn build_tx_request(&self, request: BuildTxRequest) -> DarkFiResult<(Transaction, String, Address, String)> {
+    async fn build_tx_request(
+        &self,
+        request: BuildTxRequest,
+    ) -> DarkFiResult<(Transaction, String, Address, String)> {
         let drk = self.drk.read().await;
         let aliases = drk.get_aliases_mapped_by_token().await.unwrap_or_default();
-        let token_symbol = aliases.get(&request.token_id.to_string()).unwrap_or(&"UNKN".to_string()).to_string();
-        let recipient: Address = StandardAddress::from_public(drk.network, request.recipient).into();
+        let token_symbol =
+            aliases.get(&request.token_id.to_string()).unwrap_or(&"UNKN".to_string()).to_string();
+        let recipient: Address =
+            StandardAddress::from_public(drk.network, request.recipient).into();
 
         let tx = self.build_tx(&request.amount, request.token_id, request.recipient).await?;
 
@@ -574,9 +602,7 @@ impl DrkPlugin {
 
         t!("method called: broadcast_tx()");
 
-        let Some(send_res) = method_call.send_res else {
-            return true
-        };
+        let Some(send_res) = method_call.send_res else { return true };
 
         // Send empty response immediately to unblock the caller
         let _ = send_res.send(vec![]).await;
@@ -594,14 +620,20 @@ impl DrkPlugin {
         let drk = self_.drk.read().await;
         if let Err(e) = drk.mark_tx_spend(&tx, &mut vec![]).await {
             e!("Failed to mark transaction coins as spent: {e}");
-            self_.emit_tx_status_updated(&TxStatus::Error("failed to mark coins as spent".to_string())).await;
+            self_
+                .emit_tx_status_updated(&TxStatus::Error(
+                    "failed to mark coins as spent".to_string(),
+                ))
+                .await;
             return true
         };
         let tx_id = match drk.broadcast_tx(&tx, &mut vec![]).await {
             Ok(t) => t,
             Err(e) => {
                 e!("Failed to broadcast transaction: {e}");
-                self_.emit_tx_status_updated(&TxStatus::Error("failed to broadcast".to_string())).await;
+                self_
+                    .emit_tx_status_updated(&TxStatus::Error("failed to broadcast".to_string()))
+                    .await;
                 return true
             }
         };
@@ -636,15 +668,14 @@ impl DrkPlugin {
                 if first_height.is_none() {
                     first_height = Some(height);
                 }
-                let progress: f64 = match final_height-first_height.unwrap() {
+                let progress: f64 = match final_height - first_height.unwrap() {
                     0 => 0.,
-                    _ => (height-first_height.unwrap()) as f64 / (final_height-first_height.unwrap()) as f64,
-                };
-                let status: u8 = if progress > 0.5 {
-                    2
-                } else {
-                    1
+                    _ => {
+                        (height - first_height.unwrap()) as f64 /
+                            (final_height - first_height.unwrap()) as f64
+                    }
                 };
+                let status: u8 = if progress > 0.5 { 2 } else { 1 };
                 if let Some(node) = self2.node.upgrade() {
                     let _ = node.trigger("connect", serialize(&status)).await;
                 }
@@ -666,7 +697,12 @@ impl DrkPlugin {
 
                 let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&0u8)).await;
 
-                if let Err(e) = drk.read().await.scan_blocks(&mut vec![], Some(&shell_sender), &false, Some(progress_pub)).await {
+                if let Err(e) = drk
+                    .read()
+                    .await
+                    .scan_blocks(&mut vec![], Some(&shell_sender), &false, Some(progress_pub))
+                    .await
+                {
                     e!("Failed during drk scanning: {e}");
                     let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&0u8)).await;
 
@@ -678,7 +714,15 @@ impl DrkPlugin {
 
                 let _ = self2.node.upgrade().unwrap().trigger("connect", serialize(&3u8)).await;
 
-                match subscribe_blocks(&drk, subscribe_rpc_task, shell_sender.clone(), endpoint, &ex).await {
+                match subscribe_blocks(
+                    &drk,
+                    subscribe_rpc_task,
+                    shell_sender.clone(),
+                    endpoint,
+                    &ex,
+                )
+                .await
+                {
                     Ok(()) => {
                         i!("darkfid subscription closed normally (detached task stopped)");
                     }

+ 2 - 2
bin/app/src/plugin/mod.rs

@@ -43,10 +43,10 @@ pub use drk::DrkPluginPtr as DrkPtr;
 pub use darkirc::DarkIrc;
 #[cfg(feature = "enable-plugin-darkirc")]
 pub use darkirc2::DarkIrc2;
-#[cfg(feature = "enable-plugin-fud")]
-pub use fud::FudPlugin;
 #[cfg(feature = "enable-plugin-drk")]
 pub use drk::DrkPlugin;
+#[cfg(feature = "enable-plugin-fud")]
+pub use fud::FudPlugin;
 
 #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
 use darkfi::net::Settings as NetSettings;

+ 8 - 7
bin/app/src/prop/wrap.rs

@@ -17,7 +17,10 @@
  */
 
 use crate::{
-    error::{Error, Result}, expr::{SExprMachine, SExprVal}, gfx::{Dimension, Rectangle}, scene::SceneNode as SceneNode3
+    error::{Error, Result},
+    expr::{SExprMachine, SExprVal},
+    gfx::{Dimension, Rectangle},
+    scene::SceneNode as SceneNode3,
 };
 
 use super::{PropertyAtomicGuard, PropertyPtr, PropertyType, Role};
@@ -255,12 +258,10 @@ impl PropertyEnum {
     pub fn get(&self) -> String {
         // Handle both PropertyValue::Str (defaults) and PropertyValue::Enum (set values)
         match self.prop.get_value(self.idx) {
-            Ok(val) => {
-                match val.as_str() {
-                    Ok(s) => s,
-                    Err(_) => val.as_enum().unwrap(),
-                }
-            }
+            Ok(val) => match val.as_str() {
+                Ok(s) => s,
+                Err(_) => val.as_enum().unwrap(),
+            },
             Err(_) => self.prop.get_enum(self.idx).unwrap(),
         }
     }

+ 1 - 1
bin/app/src/scene.rs

@@ -29,9 +29,9 @@ use std::{
     sync::{Arc, OnceLock, RwLock as SyncRwLock, Weak},
 };
 
-use crate::plugin;
 use crate::{
     error::{Error, Result},
+    plugin,
     prop::{Property, PropertyAtomicGuard, PropertyPtr, Role},
     pubsub::{Publisher, PublisherPtr, Subscription},
     ui,

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 1
bin/app/src/shape/blockchain_netlogo1.rs


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 1
bin/app/src/shape/blockchain_netlogo2.rs


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 1
bin/app/src/shape/blockchain_netlogo3.rs


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 1
bin/app/src/shape/blockchain_netlogo4.rs


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 1
bin/app/src/shape/copy.rs


+ 10 - 6
bin/app/src/ui/button.rs

@@ -18,8 +18,8 @@
 
 use async_trait::async_trait;
 use miniquad::{MouseButton, TouchPhase};
-use rand::{rngs::OsRng, Rng};
 use parking_lot::Mutex as SyncMutex;
+use rand::{rngs::OsRng, Rng};
 use std::sync::{
     atomic::{AtomicBool, Ordering},
     Arc,
@@ -86,9 +86,7 @@ impl Button {
 
     #[instrument(target = "ui::button")]
     async fn redraw(self: Arc<Self>, batch: BatchGuardPtr) {
-        let Some(parent_rect) = self.parent_rect.lock().clone() else {
-            return
-        };
+        let Some(parent_rect) = self.parent_rect.lock().clone() else { return };
 
         let atom = &mut batch.spawn();
 
@@ -225,7 +223,13 @@ impl UIObject for Button {
         }
     }
 
-    fn handle_touch_sync(&self, _renderer: &RendererSync, phase: TouchPhase, id: u64, touch_pos: Point) -> bool {
+    fn handle_touch_sync(
+        &self,
+        _renderer: &RendererSync,
+        phase: TouchPhase,
+        id: u64,
+        touch_pos: Point,
+    ) -> bool {
         if !self.is_active.get() {
             return false
         }
@@ -244,7 +248,7 @@ impl UIObject for Button {
             TouchPhase::Started => {
                 self.mouse_btn_held.store(true, Ordering::Relaxed);
                 true
-            },
+            }
             TouchPhase::Moved => false,
             TouchPhase::Ended => false,
             TouchPhase::Cancelled => false,

+ 6 - 3
bin/app/src/ui/edit/mod.rs

@@ -246,8 +246,10 @@ impl BaseEdit {
         let text = PropertyStr::wrap(node_ref, Role::Internal, "text", 0).unwrap();
         let text_color = PropertyColor::wrap(node_ref, Role::Internal, "text_color").unwrap();
         let text_hi_color = PropertyColor::wrap(node_ref, Role::Internal, "text_hi_color").unwrap();
-        let placeholder_text = PropertyStr::wrap(node_ref, Role::Internal, "placeholder_text", 0).unwrap();
-        let placeholder_color = PropertyColor::wrap(node_ref, Role::Internal, "placeholder_color").unwrap();
+        let placeholder_text =
+            PropertyStr::wrap(node_ref, Role::Internal, "placeholder_text", 0).unwrap();
+        let placeholder_color =
+            PropertyColor::wrap(node_ref, Role::Internal, "placeholder_color").unwrap();
         //let text_cmd_color =
         //    PropertyColor::wrap(node_ref, Role::Internal, "text_cmd_color").unwrap();
         let cursor_color = PropertyColor::wrap(node_ref, Role::Internal, "cursor_color").unwrap();
@@ -274,7 +276,8 @@ impl BaseEdit {
         let priority = PropertyUint32::wrap(node_ref, Role::Internal, "priority", 0).unwrap();
         let debug = PropertyBool::wrap(node_ref, Role::Internal, "debug", 0).unwrap();
 
-        let android_input_type = PropertyUint32::wrap(node_ref, Role::Internal, "android_input_type", 0).unwrap();
+        let android_input_type =
+            PropertyUint32::wrap(node_ref, Role::Internal, "android_input_type", 0).unwrap();
 
         let action_fg_color =
             PropertyColor::wrap(node_ref, Role::Internal, "action_fg_color").unwrap();

+ 24 - 6
bin/app/src/ui/text.rs

@@ -23,10 +23,16 @@ use std::sync::Arc;
 use tracing::instrument;
 
 use crate::{
-    ExecutorPtr, gfx::{DrawCall, DrawInstruction, Rectangle, RenderApi, Renderer, gfxtag}, mesh::{Color, MeshBuilder}, prop::{
-        BatchGuardPtr, PropertyAtomicGuard, PropertyBool, PropertyColor, PropertyEnum, PropertyFloat32,
-        PropertyRect, PropertyStr, PropertyUint32, Role,
-    }, scene::{Pimpl, SceneNodeWeak}, text, util::i18n::I18nBabelFish
+    gfx::{gfxtag, DrawCall, DrawInstruction, Rectangle, RenderApi, Renderer},
+    mesh::{Color, MeshBuilder},
+    prop::{
+        BatchGuardPtr, PropertyAtomicGuard, PropertyBool, PropertyColor, PropertyEnum,
+        PropertyFloat32, PropertyRect, PropertyStr, PropertyUint32, Role,
+    },
+    scene::{Pimpl, SceneNodeWeak},
+    text,
+    util::i18n::I18nBabelFish,
+    ExecutorPtr,
 };
 
 use super::{DrawUpdate, OnModify, UIObject};
@@ -75,7 +81,8 @@ impl Text {
         let text_color = PropertyColor::wrap(node_ref, Role::Internal, "text_color").unwrap();
         let lineheight = PropertyFloat32::wrap(node_ref, Role::Internal, "lineheight", 0).unwrap();
         let text_align = PropertyEnum::wrap(node_ref, Role::Internal, "text_align", 0).unwrap();
-        let overflow_wrap = PropertyEnum::wrap(node_ref, Role::Internal, "overflow_wrap", 0).unwrap();
+        let overflow_wrap =
+            PropertyEnum::wrap(node_ref, Role::Internal, "overflow_wrap", 0).unwrap();
         let use_i18n = PropertyBool::wrap(node_ref, Role::Internal, "use_i18n", 0).unwrap();
         let debug = PropertyBool::wrap(node_ref, Role::Internal, "debug", 0).unwrap();
 
@@ -127,7 +134,18 @@ impl Text {
             text
         };
 
-        text::make_layout2(&text, text_color, font_size, lineheight, window_scale, Some(width), &[], &[], &text_align, &overflow_wrap)
+        text::make_layout2(
+            &text,
+            text_color,
+            font_size,
+            lineheight,
+            window_scale,
+            Some(width),
+            &[],
+            &[],
+            &text_align,
+            &overflow_wrap,
+        )
     }
 
     fn regen_mesh(&self, layout: &parley::Layout<Color>) -> Vec<DrawInstruction> {

+ 17 - 44
bin/app/src/ui/tokentable/mod.rs

@@ -17,7 +17,7 @@
  */
 
 use async_trait::async_trait;
-use darkfi_money_contract::model::{DARK_TOKEN_ID, TokenId};
+use darkfi_money_contract::model::{TokenId, DARK_TOKEN_ID};
 use darkfi_serial::{Decodable, Encodable, SerialEncodable};
 use miniquad::{MouseButton, TouchPhase};
 use parking_lot::Mutex as SyncMutex;
@@ -83,15 +83,13 @@ pub struct TokenTable {
 }
 
 impl TokenTable {
-    pub async fn new(
-        node: SceneNodeWeak,
-        renderer: Renderer,
-    ) -> Pimpl {
+    pub async fn new(node: SceneNodeWeak, renderer: Renderer) -> Pimpl {
         let node_ref = &node.upgrade().unwrap();
         let rect = PropertyRect::wrap(node_ref, Role::Internal, "rect").unwrap();
         let font_size = PropertyFloat32::wrap(node_ref, Role::Internal, "font_size", 0).unwrap();
         let text_color = PropertyColor::wrap(node_ref, Role::Internal, "text_color").unwrap();
-        let separator_color = PropertyColor::wrap(node_ref, Role::Internal, "separator_color").unwrap();
+        let separator_color =
+            PropertyColor::wrap(node_ref, Role::Internal, "separator_color").unwrap();
         let padding_x = PropertyFloat32::wrap(node_ref, Role::Internal, "padding_x", 0).unwrap();
         let padding_y = PropertyFloat32::wrap(node_ref, Role::Internal, "padding_y", 0).unwrap();
         let z_index = PropertyUint32::wrap(node_ref, Role::Internal, "z_index", 0).unwrap();
@@ -160,7 +158,7 @@ impl TokenTable {
                     let mut result = vec![drk];
                     result.extend(other_rows);
                     result
-                },
+                }
                 None => vec![TokenRow {
                     id: *DARK_TOKEN_ID,
                     symbol: "DRK".to_string(),
@@ -237,28 +235,15 @@ impl TokenTable {
         let mut instrs = vec![];
 
         for (i, row) in rows.iter().enumerate() {
-            let row_height = padding_y*2.+font_size+1.;
+            let row_height = padding_y * 2. + font_size + 1.;
             let y_pos = (i as f32) * row_height;
 
             // Render symbol
-            let symbol_layout = text::make_layout(
-                &row.symbol,
-                text_color,
-                font_size,
-                1.0,
-                1.0,
-                None,
-                &[],
-            );
-            instrs.push(DrawInstruction::SetPos(Point::new(
-                padding_x,
-                y_pos+padding_y,
-            )));
-            let symbol_instrs = text::render_layout(
-                &symbol_layout,
-                &self.renderer,
-                gfxtag!("tokentable_symbol"),
-            );
+            let symbol_layout =
+                text::make_layout(&row.symbol, text_color, font_size, 1.0, 1.0, None, &[]);
+            instrs.push(DrawInstruction::SetPos(Point::new(padding_x, y_pos + padding_y)));
+            let symbol_instrs =
+                text::render_layout(&symbol_layout, &self.renderer, gfxtag!("tokentable_symbol"));
             instrs.extend(symbol_instrs);
 
             // Render balance (aligned to right)
@@ -266,25 +251,17 @@ impl TokenTable {
                 text::make_layout(&row.balance, text_color, font_size, 1.0, 1.0, None, &[]);
             let balance_width = balance_layout.width();
             instrs.push(DrawInstruction::SetPos(Point::new(
-                rect.w-balance_width-padding_x,
-                y_pos+padding_y,
+                rect.w - balance_width - padding_x,
+                y_pos + padding_y,
             )));
             let balance_instrs =
                 text::render_layout(&balance_layout, &self.renderer, gfxtag!("tokentable_balance"));
             instrs.extend(balance_instrs);
 
             // Draw separator line at bottom of row
-            instrs.push(DrawInstruction::SetPos(Point::new(
-                0.,
-                y_pos+row_height,
-            )));
+            instrs.push(DrawInstruction::SetPos(Point::new(0., y_pos + row_height)));
             let mut mesh = MeshBuilder::new(gfxtag!("tokentable_separator"));
-            mesh.draw_line(
-                Point::new(0., 0.),
-                Point::new(rect.w+1., 0.),
-                separator_color,
-                1.,
-            );
+            mesh.draw_line(Point::new(0., 0.), Point::new(rect.w + 1., 0.), separator_color, 1.);
             let mesh = mesh.alloc(&self.renderer);
             instrs.push(DrawInstruction::Draw(mesh.draw_untextured()));
         }
@@ -383,18 +360,14 @@ impl UIObject for TokenTable {
             token_held
         };
 
-        let Some(token_held) = token_held else {
-            return false
-        };
+        let Some(token_held) = token_held else { return false };
 
         let rect = self.rect.get();
         if !rect.contains(mouse_pos) {
             return false
         }
 
-        let Some(row) = self.get_row_at_y(mouse_pos.y) else {
-            return false
-        };
+        let Some(row) = self.get_row_at_y(mouse_pos.y) else { return false };
 
         if row.id != token_held {
             return false

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio