From cefd2d18c70686e41c121803a44c00ab4d310fb6 Mon Sep 17 00:00:00 2001 From: Nathan Woodburn Date: Mon, 26 Jun 2023 14:31:15 +1000 Subject: [PATCH] main: Added multisig detect --- FireWallet/MainForm.Designer.cs | 42 +++++--- FireWallet/MainForm.cs | 40 +++++-- FireWallet/NewAccountForm.Designer.cs | 82 +++++++++++++++ FireWallet/NewAccountForm.cs | 143 ++++++++++++++++++-------- 4 files changed, 243 insertions(+), 64 deletions(-) diff --git a/FireWallet/MainForm.Designer.cs b/FireWallet/MainForm.Designer.cs index cf2a87a..c376f3c 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(); + toolStripStatusLabelMultisig = new ToolStripStatusLabel(); toolStripStatusLabelLedger = new ToolStripStatusLabel(); toolStripSplitButtonlogout = new ToolStripSplitButton(); toolStripDropDownButtonHelp = new ToolStripDropDownButton(); @@ -65,6 +66,7 @@ namespace FireWallet buttonNavSend = new Button(); buttonNavPortfolio = new Button(); panelPortfolio = new Panel(); + buttonSendAll = new Button(); buttonRedeemAll = new Button(); buttonRevealAll = new Button(); groupBoxTransactions = new GroupBox(); @@ -127,7 +129,6 @@ namespace FireWallet textBoxExAddr = new TextBox(); labelSettings4 = new Label(); textBoxExTX = new TextBox(); - buttonSendAll = new Button(); statusStripmain.SuspendLayout(); panelaccount.SuspendLayout(); groupBoxaccount.SuspendLayout(); @@ -151,7 +152,7 @@ namespace FireWallet // statusStripmain // statusStripmain.Dock = DockStyle.Top; - statusStripmain.Items.AddRange(new ToolStripItem[] { toolStripStatusLabelNetwork, toolStripStatusLabelstatus, toolStripStatusLabelaccount, toolStripStatusLabelLedger, toolStripSplitButtonlogout, toolStripDropDownButtonHelp }); + statusStripmain.Items.AddRange(new ToolStripItem[] { toolStripStatusLabelNetwork, toolStripStatusLabelstatus, toolStripStatusLabelaccount, toolStripStatusLabelMultisig, toolStripStatusLabelLedger, toolStripSplitButtonlogout, toolStripDropDownButtonHelp }); statusStripmain.Location = new Point(0, 0); statusStripmain.Name = "statusStripmain"; statusStripmain.Size = new Size(1152, 22); @@ -183,12 +184,20 @@ namespace FireWallet toolStripStatusLabelaccount.Size = new Size(55, 17); toolStripStatusLabelaccount.Text = "Account:"; // + // toolStripStatusLabelMultisig + // + toolStripStatusLabelMultisig.Margin = new Padding(50, 3, 50, 2); + toolStripStatusLabelMultisig.Name = "toolStripStatusLabelMultisig"; + toolStripStatusLabelMultisig.Size = new Size(50, 17); + toolStripStatusLabelMultisig.Text = "Multisig"; + toolStripStatusLabelMultisig.Visible = false; + // // toolStripStatusLabelLedger // toolStripStatusLabelLedger.Margin = new Padding(50, 3, 50, 2); toolStripStatusLabelLedger.Name = "toolStripStatusLabelLedger"; - toolStripStatusLabelLedger.Size = new Size(71, 17); - toolStripStatusLabelLedger.Text = "Cold Wallet:"; + toolStripStatusLabelLedger.Size = new Size(68, 17); + toolStripStatusLabelLedger.Text = "Cold Wallet"; toolStripStatusLabelLedger.Visible = false; // // toolStripSplitButtonlogout @@ -459,6 +468,18 @@ namespace FireWallet panelPortfolio.TabIndex = 7; panelPortfolio.Visible = false; // + // buttonSendAll + // + buttonSendAll.FlatStyle = FlatStyle.Flat; + buttonSendAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); + buttonSendAll.Location = new Point(761, 12); + buttonSendAll.Name = "buttonSendAll"; + buttonSendAll.Size = new Size(106, 44); + buttonSendAll.TabIndex = 9; + buttonSendAll.Text = "Send All TXs"; + buttonSendAll.UseVisualStyleBackColor = true; + buttonSendAll.Click += buttonSendAll_Click; + // // buttonRedeemAll // buttonRedeemAll.FlatStyle = FlatStyle.Flat; @@ -1121,18 +1142,6 @@ namespace FireWallet textBoxExTX.Size = new Size(307, 29); textBoxExTX.TabIndex = 1; // - // buttonSendAll - // - buttonSendAll.FlatStyle = FlatStyle.Flat; - buttonSendAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); - buttonSendAll.Location = new Point(761, 12); - buttonSendAll.Name = "buttonSendAll"; - buttonSendAll.Size = new Size(106, 44); - buttonSendAll.TabIndex = 9; - buttonSendAll.Text = "Send All TXs"; - buttonSendAll.UseVisualStyleBackColor = true; - buttonSendAll.Click += buttonSendAll_Click; - // // MainForm // AutoScaleDimensions = new SizeF(7F, 15F); @@ -1281,5 +1290,6 @@ namespace FireWallet private ToolStripMenuItem otherProjectsToolStripMenuItem; private Button buttonRedeemAll; private Button buttonSendAll; + private ToolStripStatusLabel toolStripStatusLabelMultisig; } } \ No newline at end of file diff --git a/FireWallet/MainForm.cs b/FireWallet/MainForm.cs index e0b4def..cf23640 100644 --- a/FireWallet/MainForm.cs +++ b/FireWallet/MainForm.cs @@ -37,6 +37,7 @@ namespace FireWallet // Batching variables public bool BatchMode { get; set; } public BatchForm BatchForm { get; set; } + public bool multiSig { get; set; } #endregion #region Application public MainForm() @@ -767,11 +768,11 @@ namespace FireWallet if (jObject["watchOnly"].ToString() == "True") { WatchOnly = true; - toolStripStatusLabelLedger.Text = "Cold Wallet"; toolStripStatusLabelLedger.Visible = true; buttonRevealAll.Visible = false; buttonRedeemAll.Visible = false; buttonSendAll.Visible = false; + buttonAddressVerify.Visible = true; } else { @@ -780,15 +781,38 @@ namespace FireWallet buttonRevealAll.Visible = true; buttonRedeemAll.Visible = true; buttonSendAll.Visible = true; + buttonAddressVerify.Visible = false; } - if (WatchOnly) + + path = "wallet/" + Account + "/account/default"; + APIresponse = await APIGet(path, true); + if (APIresponse.Contains("Error")) { - buttonAddressVerify.Visible = true; + AddLog("Error getting default account"); + multiSig = false; } else { - buttonAddressVerify.Visible = false; + jObject = JObject.Parse(APIresponse); + if (jObject["n"].ToString() == "1") + { + multiSig = false; + } + else + { + multiSig = true; + } } + + if (multiSig) + { + toolStripStatusLabelMultisig.Visible = true; + } + else + { + toolStripStatusLabelMultisig.Visible = false; + } + return true; } @@ -1763,7 +1787,8 @@ namespace FireWallet { labelSendingError.Show(); labelSendingError.Text = "HIP-02 lookup failed"; - } else + } + else { labelSendingHIPAddress.Text = address; labelSendingHIPAddress.Show(); @@ -1897,7 +1922,10 @@ namespace FireWallet { AddLog("Failed:"); AddLog(APIresp.ToString()); - NotifyForm notify = new NotifyForm("Error Transaction Failed"); + JObject error = JObject.Parse(APIresp["error"].ToString()); + string ErrorMessage = error["message"].ToString(); + + NotifyForm notify = new NotifyForm("Error Transaction Failed\n" + ErrorMessage); notify.ShowDialog(); return; } diff --git a/FireWallet/NewAccountForm.Designer.cs b/FireWallet/NewAccountForm.Designer.cs index b661948..6e4089b 100644 --- a/FireWallet/NewAccountForm.Designer.cs +++ b/FireWallet/NewAccountForm.Designer.cs @@ -46,9 +46,18 @@ label2 = new Label(); groupBoxSeed = new GroupBox(); textBoxSeedPhrase = new TextBox(); + groupBoxMulti = new GroupBox(); + numericUpDownM = new NumericUpDown(); + numericUpDownN = new NumericUpDown(); + label7 = new Label(); + label6 = new Label(); + checkBoxMulti = new CheckBox(); groupBoxMode.SuspendLayout(); groupBoxNew.SuspendLayout(); groupBoxSeed.SuspendLayout(); + groupBoxMulti.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)numericUpDownM).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownN).BeginInit(); SuspendLayout(); // // buttonNext @@ -241,11 +250,74 @@ textBoxSeedPhrase.Size = new Size(438, 288); textBoxSeedPhrase.TabIndex = 0; // + // groupBoxMulti + // + groupBoxMulti.Controls.Add(numericUpDownM); + groupBoxMulti.Controls.Add(numericUpDownN); + groupBoxMulti.Controls.Add(label7); + groupBoxMulti.Controls.Add(label6); + groupBoxMulti.Controls.Add(checkBoxMulti); + groupBoxMulti.Location = new Point(125, 22); + groupBoxMulti.Name = "groupBoxMulti"; + groupBoxMulti.Size = new Size(450, 319); + groupBoxMulti.TabIndex = 6; + groupBoxMulti.TabStop = false; + groupBoxMulti.Text = "Multisig"; + // + // numericUpDownM + // + numericUpDownM.Location = new Point(223, 91); + numericUpDownM.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); + numericUpDownM.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownM.Name = "numericUpDownM"; + numericUpDownM.Size = new Size(120, 23); + numericUpDownM.TabIndex = 2; + numericUpDownM.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // numericUpDownN + // + numericUpDownN.Location = new Point(223, 55); + numericUpDownN.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); + numericUpDownN.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownN.Name = "numericUpDownN"; + numericUpDownN.Size = new Size(120, 23); + numericUpDownN.TabIndex = 2; + numericUpDownN.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // label7 + // + label7.AutoSize = true; + label7.Location = new Point(6, 93); + label7.Name = "label7"; + label7.Size = new Size(211, 15); + label7.TabIndex = 1; + label7.Text = "Required Signers to send a transaction:"; + // + // label6 + // + label6.AutoSize = true; + label6.Location = new Point(141, 61); + label6.Name = "label6"; + label6.Size = new Size(76, 15); + label6.TabIndex = 1; + label6.Text = "Total Signers:"; + // + // checkBoxMulti + // + checkBoxMulti.AutoSize = true; + checkBoxMulti.Location = new Point(6, 23); + checkBoxMulti.Name = "checkBoxMulti"; + checkBoxMulti.Size = new Size(115, 19); + checkBoxMulti.TabIndex = 0; + checkBoxMulti.Text = "Create a multisig"; + checkBoxMulti.UseVisualStyleBackColor = true; + // // NewAccountForm // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(680, 430); + Controls.Add(groupBoxMulti); Controls.Add(groupBoxSeed); Controls.Add(buttonCancel); Controls.Add(buttonNext); @@ -263,6 +335,10 @@ groupBoxNew.PerformLayout(); groupBoxSeed.ResumeLayout(false); groupBoxSeed.PerformLayout(); + groupBoxMulti.ResumeLayout(false); + groupBoxMulti.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)numericUpDownM).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownN).EndInit(); ResumeLayout(false); } @@ -285,5 +361,11 @@ private Label label5; private GroupBox groupBoxSeed; private TextBox textBoxSeedPhrase; + private GroupBox groupBoxMulti; + private CheckBox checkBoxMulti; + private NumericUpDown numericUpDownM; + private NumericUpDown numericUpDownN; + private Label label7; + private Label label6; } } \ No newline at end of file diff --git a/FireWallet/NewAccountForm.cs b/FireWallet/NewAccountForm.cs index a0ea6a4..3b73886 100644 --- a/FireWallet/NewAccountForm.cs +++ b/FireWallet/NewAccountForm.cs @@ -148,53 +148,111 @@ namespace FireWallet if (page == 1) { - // Create new wallet - buttonNext.Enabled = false; - string path = "wallet/" + textBoxNewName.Text; - string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\"}"; - string response = await APIPut(path, true, content); - if (response == "Error") - { - NotifyForm notify = new NotifyForm("Error creating wallet"); - notify.ShowDialog(); - notify.Dispose(); - buttonNext.Enabled = true; - return; - } - mainForm.AddLog("Created wallet: " + textBoxNewName.Text); - NotifyForm notify2 = new NotifyForm("Created wallet: " + textBoxNewName.Text); - notify2.ShowDialog(); - notify2.Dispose(); - this.Close(); + groupBoxMulti.Show(); + page = 6; } else if (page == 2) { groupBoxSeed.Show(); - buttonNext.Text = "Import"; page = 3; } else if (page == 3) { - // Create new wallet - buttonNext.Enabled = false; - string path = "wallet/" + textBoxNewName.Text; - string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text + "\"}"; - string response = await APIPut(path, true, content); - if (response == "Error") - { - NotifyForm notify = new NotifyForm("Error creating wallet"); - notify.ShowDialog(); - notify.Dispose(); - buttonNext.Enabled = true; - return; - } - mainForm.AddLog("Created wallet: " + textBoxNewName.Text); - NotifyForm notify2 = new NotifyForm("Imported wallet: " + textBoxNewName.Text); - notify2.ShowDialog(); - notify2.Dispose(); - this.Close(); + page = 5; + groupBoxMulti.Show(); + buttonNext.Text = "Import"; } + else if (page == 5) + { + if (!checkBoxMulti.Checked) + { + // Import wallet from seed + buttonNext.Enabled = false; + string path = "wallet/" + textBoxNewName.Text; + string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text + "\"}"; + string response = await APIPut(path, true, content); + if (response == "Error") + { + NotifyForm notify = new NotifyForm("Error creating wallet"); + notify.ShowDialog(); + notify.Dispose(); + buttonNext.Enabled = true; + return; + } + mainForm.AddLog("Created wallet: " + textBoxNewName.Text); + NotifyForm notify2 = new NotifyForm("Imported wallet: " + textBoxNewName.Text); + notify2.ShowDialog(); + notify2.Dispose(); + this.Close(); + } + else + { + // Import wallet from seed and create multisig + buttonNext.Enabled = false; + string path = "wallet/" + textBoxNewName.Text; + string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\",\"mnemonic\":\"" + textBoxSeedPhrase.Text + "\", \"type\":\"multisig\",\"m\":"+numericUpDownM.Value.ToString()+ ",\"n\":" +numericUpDownN.Value.ToString() + "}"; + string response = await APIPut(path, true, content); + if (response == "Error") + { + NotifyForm notify = new NotifyForm("Error creating wallet"); + notify.ShowDialog(); + notify.Dispose(); + buttonNext.Enabled = true; + return; + } + mainForm.AddLog("Created wallet: " + textBoxNewName.Text); + NotifyForm notify2 = new NotifyForm("Imported wallet: " + textBoxNewName.Text); + notify2.ShowDialog(); + notify2.Dispose(); + this.Close(); + } + } + else if (page == 6) + { + if (!checkBoxMulti.Checked) + { + // Create new wallet + buttonNext.Enabled = false; + string path = "wallet/" + textBoxNewName.Text; + string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\"}"; + string response = await APIPut(path, true, content); + if (response == "Error") + { + NotifyForm notify = new NotifyForm("Error creating wallet"); + notify.ShowDialog(); + notify.Dispose(); + buttonNext.Enabled = true; + return; + } + mainForm.AddLog("Created wallet: " + textBoxNewName.Text); + NotifyForm notify2 = new NotifyForm("Created wallet: " + textBoxNewName.Text); + notify2.ShowDialog(); + notify2.Dispose(); + this.Close(); + } else + { + // Create new wallet + buttonNext.Enabled = false; + string path = "wallet/" + textBoxNewName.Text; + string content = "{\"passphrase\":\"" + textBoxNewPass1.Text + "\", \"type\":\"multisig\",\"m\":"+numericUpDownM.Value.ToString()+ ",\"n\":" +numericUpDownN.Value.ToString() + "}"; + string response = await APIPut(path, true, content); + if (response == "Error") + { + NotifyForm notify = new NotifyForm("Error creating wallet"); + notify.ShowDialog(); + notify.Dispose(); + buttonNext.Enabled = true; + return; + } + mainForm.AddLog("Created wallet: " + textBoxNewName.Text); + NotifyForm notify2 = new NotifyForm("Created wallet: " + textBoxNewName.Text); + notify2.ShowDialog(); + notify2.Dispose(); + this.Close(); + } + } + else if (page == 4) { try @@ -228,7 +286,7 @@ namespace FireWallet } catch (Exception ex) { - mainForm.AddLog(ex.Message); + mainForm.AddLog(ex.Message); NotifyForm notify = new NotifyForm("Error importing wallet\n" + ex.Message); notify.ShowDialog(); notify.Dispose(); @@ -256,16 +314,17 @@ namespace FireWallet HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Put, "http://" + ip + ":" + port + "/" + path); req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("x:" + key))); req.Content = new StringContent(content); - + try { // Send request HttpResponseMessage resp = await httpClient.SendAsync(req); - + if (resp.IsSuccessStatusCode) { return await resp.Content.ReadAsStringAsync(); - } else + } + else { mainForm.AddLog("Put Error: " + await resp.Content.ReadAsStringAsync()); return "Error"; @@ -277,7 +336,7 @@ namespace FireWallet return "Error"; } - + } } }