diff --git a/FireWallet/MainForm.Designer.cs b/FireWallet/MainForm.Designer.cs index 1c90099..69a8c59 100644 --- a/FireWallet/MainForm.Designer.cs +++ b/FireWallet/MainForm.Designer.cs @@ -39,6 +39,7 @@ namespace FireWallet toolStripStatusLabelNetwork = new ToolStripStatusLabel(); toolStripStatusLabelstatus = new ToolStripStatusLabel(); toolStripStatusLabelaccount = new ToolStripStatusLabel(); + toolStripStatusLabelLedger = new ToolStripStatusLabel(); toolStripSplitButtonlogout = new ToolStripSplitButton(); timerNodeStatus = new System.Windows.Forms.Timer(components); panelaccount = new Panel(); @@ -80,6 +81,7 @@ namespace FireWallet labelSendingTo = new Label(); labelSendPrompt = new Label(); panelRecieve = new Panel(); + buttonAddressVerify = new Button(); pictureBoxReceiveQR = new PictureBox(); labelReceive2 = new Label(); textBoxReceiveAddress = new TextBox(); @@ -111,7 +113,6 @@ namespace FireWallet textBoxExAddr = new TextBox(); labelSettings4 = new Label(); textBoxExTX = new TextBox(); - toolStripStatusLabelLedger = new ToolStripStatusLabel(); statusStripmain.SuspendLayout(); panelaccount.SuspendLayout(); groupBoxaccount.SuspendLayout(); @@ -167,6 +168,13 @@ namespace FireWallet toolStripStatusLabelaccount.Size = new Size(55, 17); toolStripStatusLabelaccount.Text = "Account:"; // + // toolStripStatusLabelLedger + // + toolStripStatusLabelLedger.Margin = new Padding(50, 3, 50, 2); + toolStripStatusLabelLedger.Name = "toolStripStatusLabelLedger"; + toolStripStatusLabelLedger.Size = new Size(71, 17); + toolStripStatusLabelLedger.Text = "Cold Wallet:"; + // // toolStripSplitButtonlogout // toolStripSplitButtonlogout.DisplayStyle = ToolStripItemDisplayStyle.Text; @@ -619,16 +627,30 @@ namespace FireWallet // // panelRecieve // + panelRecieve.Controls.Add(buttonAddressVerify); panelRecieve.Controls.Add(pictureBoxReceiveQR); panelRecieve.Controls.Add(labelReceive2); panelRecieve.Controls.Add(textBoxReceiveAddress); panelRecieve.Controls.Add(labelReceive1); - panelRecieve.Location = new Point(1057, 62); + panelRecieve.Location = new Point(117, 34); panelRecieve.Name = "panelRecieve"; panelRecieve.Size = new Size(995, 523); panelRecieve.TabIndex = 17; panelRecieve.Visible = false; // + // buttonAddressVerify + // + buttonAddressVerify.FlatStyle = FlatStyle.Flat; + buttonAddressVerify.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); + buttonAddressVerify.Location = new Point(769, 110); + buttonAddressVerify.Name = "buttonAddressVerify"; + buttonAddressVerify.Size = new Size(126, 32); + buttonAddressVerify.TabIndex = 21; + buttonAddressVerify.Text = "Create && Verify"; + buttonAddressVerify.UseVisualStyleBackColor = true; + buttonAddressVerify.Visible = false; + buttonAddressVerify.Click += buttonAddressVerify_Click; + // // pictureBoxReceiveQR // pictureBoxReceiveQR.Location = new Point(391, 190); @@ -937,21 +959,14 @@ namespace FireWallet textBoxExTX.Size = new Size(307, 29); textBoxExTX.TabIndex = 1; // - // toolStripStatusLabelLedger - // - toolStripStatusLabelLedger.Margin = new Padding(50, 3, 50, 2); - toolStripStatusLabelLedger.Name = "toolStripStatusLabelLedger"; - toolStripStatusLabelLedger.Size = new Size(71, 17); - toolStripStatusLabelLedger.Text = "Cold Wallet:"; - // // MainForm // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1152, 575); + Controls.Add(panelRecieve); Controls.Add(panelSettings); Controls.Add(panelDomains); - Controls.Add(panelRecieve); Controls.Add(panelSend); Controls.Add(panelPortfolio); Controls.Add(panelNav); @@ -1074,5 +1089,6 @@ namespace FireWallet private GroupBox groupBoxSettingsWallet; private Button buttonSettingsRescan; private ToolStripStatusLabel toolStripStatusLabelLedger; + private Button buttonAddressVerify; } } \ No newline at end of file diff --git a/FireWallet/MainForm.cs b/FireWallet/MainForm.cs index fa3887e..e8251dd 100644 --- a/FireWallet/MainForm.cs +++ b/FireWallet/MainForm.cs @@ -46,6 +46,8 @@ namespace FireWallet account = ""; timerNodeStatus.Stop(); LoadSettings(); + UpdateTheme(); + LoadNode(); if (userSettings.ContainsKey("hide-splash")) { @@ -58,8 +60,6 @@ namespace FireWallet } } - UpdateTheme(); - LoadNode(); // Edit the theme of the navigation panel @@ -180,7 +180,7 @@ namespace FireWallet Notifyinstall.Dispose(); } hsdProcess = new Process(); - + hsdProcess.StartInfo.CreateNoWindow = true; hsdProcess.StartInfo.RedirectStandardInput = true; @@ -523,6 +523,15 @@ namespace FireWallet if (jObject["watchOnly"].ToString() == "True") watchOnly = true; else watchOnly = false; toolStripStatusLabelLedger.Text = "Cold Wallet: " + watchOnly.ToString(); + + if (watchOnly) + { + buttonAddressVerify.Visible = true; + } + else + { + buttonAddressVerify.Visible = false; + } return true; } @@ -1118,7 +1127,8 @@ namespace FireWallet labelSendingError.Hide(); labelSendingError.Text = ""; buttonNavPortfolio.PerformClick(); - } else // Cold wallet signing + } + else // Cold wallet signing { AddLog("Sending CW " + amount.ToString() + " HNS to " + address); @@ -1137,14 +1147,14 @@ namespace FireWallet // Try to install hsd-ledger try { - NotifyForm Notifyinstall = new NotifyForm("Installing hsd-ledger\nThis may take a few minutes\nDo not close FireWallet",false); + NotifyForm Notifyinstall = new NotifyForm("Installing hsd-ledger\nThis may take a few minutes\nDo not close FireWallet", false); Notifyinstall.Show(); // Wait for the notification to show await Task.Delay(1000); string repositoryUrl = "https://github.com/handshake-org/hsd-ledger.git"; string destinationPath = dir + "hsd-ledger"; - CloneRepository(repositoryUrl,destinationPath); + CloneRepository(repositoryUrl, destinationPath); Notifyinstall.CloseNotification(); Notifyinstall.Dispose(); @@ -1157,10 +1167,10 @@ namespace FireWallet notifyError.Dispose(); return; } - + } - NotifyForm notify = new NotifyForm("Please confirm the transaction on your Ledger device",false); + NotifyForm notify = new NotifyForm("Please confirm the transaction on your Ledger device", false); notify.Show(); var proc = new Process(); @@ -1202,7 +1212,8 @@ namespace FireWallet textBoxSendingTo.Text = ""; textBoxSendingAmount.Text = ""; buttonNavPortfolio.PerformClick(); - } else + } + else { NotifyForm notifyError = new NotifyForm("Error Transaction Failed\nCheck logs for more details"); notifyError.ShowDialog(); @@ -1219,7 +1230,7 @@ namespace FireWallet labelSendingError.Text = ex.Message; } } - private void CloneRepository(string repositoryUrl, string destinationPath) + public void CloneRepository(string repositoryUrl, string destinationPath) { try { @@ -1272,7 +1283,7 @@ namespace FireWallet AddLog(ex.Message); } } - static bool CheckNodeInstalled() + public bool CheckNodeInstalled() { try { @@ -1308,6 +1319,52 @@ namespace FireWallet labelReceive2.Text = "Copied to clipboard"; labelReceive2.Left = (panelRecieve.Width - labelReceive2.Width) / 2; } + private async void buttonAddressVerify_Click(object sender, EventArgs e) + { + + var proc = new Process(); + proc.StartInfo.CreateNoWindow = true; + proc.StartInfo.RedirectStandardInput = true; + proc.StartInfo.RedirectStandardOutput = true; + proc.StartInfo.UseShellExecute = false; + proc.StartInfo.RedirectStandardError = true; + proc.StartInfo.FileName = "node.exe"; + proc.StartInfo.Arguments = dir + "hsd-ledger/bin/hsd-ledger createaddress --api-key " + nodeSettings["Key"] + " -w " + account; + proc.Start(); + + // Wait 1 sec + await Task.Delay(1000); + + // Get the output into a string + string result = proc.StandardOutput.ReadLine(); + try + { + result = result.Replace("Verify address on Ledger device: ", ""); + } + catch { } + AddLog(result); + textBoxReceiveAddress.Text = result; + Size size = TextRenderer.MeasureText(textBoxReceiveAddress.Text, textBoxReceiveAddress.Font); + textBoxReceiveAddress.Width = size.Width + 10; + textBoxReceiveAddress.Left = (panelRecieve.Width - textBoxReceiveAddress.Width) / 2; + + + NotifyForm notify = new NotifyForm("Please confirm the address on your Ledger device", false); + notify.Show(); + + // Handle events until process exits + while (!proc.HasExited) + { + // Check for cancellation + if (proc.WaitForExit(100)) + break; + Application.DoEvents(); + } + + notify.CloseNotification(); + notify.Dispose(); + + } #endregion #region Domains public string[] Domains { get; set; } @@ -1520,8 +1577,10 @@ namespace FireWallet } #endregion - - + + + + diff --git a/FireWallet/NewAccountForm.Designer.cs b/FireWallet/NewAccountForm.Designer.cs index cb889c7..b661948 100644 --- a/FireWallet/NewAccountForm.Designer.cs +++ b/FireWallet/NewAccountForm.Designer.cs @@ -104,7 +104,6 @@ // // buttonCold // - buttonCold.Enabled = false; buttonCold.FlatStyle = FlatStyle.Flat; buttonCold.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); buttonCold.Location = new Point(147, 239); diff --git a/FireWallet/NewAccountForm.cs b/FireWallet/NewAccountForm.cs index 26778f5..b190020 100644 --- a/FireWallet/NewAccountForm.cs +++ b/FireWallet/NewAccountForm.cs @@ -2,9 +2,11 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; +using System.Diagnostics; using System.Drawing; using System.Linq; using System.Net.Http; +using System.Security.Principal; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -59,9 +61,50 @@ namespace FireWallet groupBoxNew.Text = "Import Wallet"; } - private void buttonCold_Click(object sender, EventArgs e) + private async void buttonCold_Click(object sender, EventArgs e) { - // TODO - Cold wallet + if (!Directory.Exists(mainForm.dir + "hsd-ledger")) + { + if (mainForm.CheckNodeInstalled() == false) + { + mainForm.AddLog("Node not installed"); + NotifyForm notify1 = new NotifyForm("Node not installed\nPlease install it to use Ledger"); + notify1.ShowDialog(); + notify1.Dispose(); + return; + } + mainForm.AddLog("Installing hsd-ledger"); + + // Try to install hsd-ledger + try + { + NotifyForm Notifyinstall = new NotifyForm("Installing hsd-ledger\nThis may take a few minutes\nDo not close FireWallet", false); + Notifyinstall.Show(); + // Wait for the notification to show + await Task.Delay(1000); + + string repositoryUrl = "https://github.com/handshake-org/hsd-ledger.git"; + string destinationPath = mainForm.dir + "hsd-ledger"; + mainForm.CloneRepository(repositoryUrl, destinationPath); + + Notifyinstall.CloseNotification(); + Notifyinstall.Dispose(); + } + catch (Exception ex) + { + NotifyForm notifyError = new NotifyForm("Error installing hsd-ledger\n" + ex.Message); + mainForm.AddLog(ex.Message); + notifyError.ShowDialog(); + notifyError.Dispose(); + return; + } + } + + // Import HSD Wallet + groupBoxNew.Show(); + groupBoxNew.Text = "Import Ledger"; + buttonNext.Show(); + page = 4; } private void textBoxNewName_TextChanged(object sender, EventArgs e) @@ -136,7 +179,7 @@ namespace FireWallet // Create new wallet buttonNext.Enabled = false; string path = "wallet/" + textBoxNewName.Text; - string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text +"\"}"; + string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text + "\"}"; string response = await APIPut(path, true, content); if (response == "Error") { @@ -152,6 +195,40 @@ namespace FireWallet notify2.Dispose(); this.Close(); } + else if (page == 4) + { + // Import Ledger + buttonNext.Enabled = false; + + + var proc = new Process(); + proc.StartInfo.CreateNoWindow = true; + proc.StartInfo.RedirectStandardInput = true; + proc.StartInfo.RedirectStandardOutput = true; + proc.StartInfo.UseShellExecute = false; + proc.StartInfo.RedirectStandardError = true; + proc.StartInfo.FileName = "node.exe"; + proc.StartInfo.Arguments = mainForm.dir + "hsd-ledger/bin/hsd-ledger createwallet " + textBoxNewPass1.Text + " --api-key " + mainForm.nodeSettings["Key"]; + var outputBuilder = new StringBuilder(); + + // Event handler for capturing output data + proc.OutputDataReceived += (sender, args) => + { + if (!string.IsNullOrEmpty(args.Data)) + { + outputBuilder.AppendLine(args.Data); + } + }; + + proc.Start(); + proc.BeginOutputReadLine(); + proc.WaitForExit(); + + mainForm.AddLog(outputBuilder.ToString()); + + } + + } HttpClient httpClient = new HttpClient();