using System.Diagnostics; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using Microsoft.VisualBasic; using Newtonsoft.Json.Linq; namespace FireWallet { public partial class DomainForm : Form { string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\FireWallet\\"; Dictionary theme; Dictionary nodeSettings; string domain; int network; int height; bool own; string state; string explorerTX; string explorerName; int TransferEnd; private MainForm mainForm; public DomainForm(MainForm mainForm, string domain, string explorerTX, string explorerName) { InitializeComponent(); this.Text = domain + "/ | FireWallet"; labelTitle.Text = domain + "/"; this.domain = domain; this.explorerTX = explorerTX; this.explorerName = explorerName; this.mainForm = mainForm; } #region Theming private void UpdateTheme() { // Check if file exists if (!Directory.Exists(dir)) { CreateConfig(dir); } if (!File.Exists(dir + "theme.txt")) { CreateConfig(dir); } // Read file StreamReader sr = new StreamReader(dir + "theme.txt"); theme = new Dictionary(); while (!sr.EndOfStream) { string line = sr.ReadLine(); string[] split = line.Split(':'); theme.Add(split[0].Trim(), split[1].Trim()); } sr.Dispose(); if (!theme.ContainsKey("background") || !theme.ContainsKey("background-alt") || !theme.ContainsKey("foreground") || !theme.ContainsKey("foreground-alt")) { return; } // Apply theme this.BackColor = ColorTranslator.FromHtml(theme["background"]); // Foreground this.ForeColor = ColorTranslator.FromHtml(theme["foreground"]); // Need to specify this for each groupbox to override the black text foreach (Control c in Controls) { ThemeControl(c); } // Transparancy applyTransparency(theme); } private void ThemeControl(Control c) { if (c.GetType() == typeof(GroupBox) || c.GetType() == typeof(Panel)) { c.ForeColor = ColorTranslator.FromHtml(theme["foreground"]); foreach (Control sub in c.Controls) { ThemeControl(sub); } } if (c.GetType() == typeof(TextBox) || c.GetType() == typeof(Button) || c.GetType() == typeof(ComboBox) || c.GetType() == typeof(StatusStrip)) { c.ForeColor = ColorTranslator.FromHtml(theme["foreground-alt"]); c.BackColor = ColorTranslator.FromHtml(theme["background-alt"]); } } private void applyTransparency(Dictionary theme) { if (theme.ContainsKey("transparent-mode")) { switch (theme["transparent-mode"]) { case "mica": var accent = new AccentPolicy { AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND }; var accentStructSize = Marshal.SizeOf(accent); var accentPtr = Marshal.AllocHGlobal(accentStructSize); Marshal.StructureToPtr(accent, accentPtr, false); var data = new WindowCompositionAttributeData { Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY, SizeOfData = accentStructSize, Data = accentPtr }; User32.SetWindowCompositionAttribute(Handle, ref data); Marshal.FreeHGlobal(accentPtr); break; case "key": if (theme.ContainsKey("transparency-key")) { switch (theme["transparency-key"]) { case "alt": this.TransparencyKey = ColorTranslator.FromHtml(theme["background-alt"]); break; case "main": this.TransparencyKey = ColorTranslator.FromHtml(theme["background"]); break; default: this.TransparencyKey = ColorTranslator.FromHtml(theme["transparency-key"]); break; } } break; case "percent": if (theme.ContainsKey("transparency-percent")) { Opacity = Convert.ToDouble(theme["transparency-percent"]) / 100; } break; } } } private void CreateConfig(string dir) { if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } StreamWriter sw = new StreamWriter(dir + "theme.txt"); sw.WriteLine("background: #000000"); sw.WriteLine("foreground: #8e05c2"); sw.WriteLine("background-alt: #3e065f"); sw.WriteLine("foreground-alt: #ffffff"); sw.WriteLine("transparent-mode: off"); sw.WriteLine("transparency-key: main"); sw.WriteLine("transparency-percent: 90"); sw.Dispose(); } // Required for mica effect internal enum AccentState { ACCENT_DISABLED = 0, ACCENT_ENABLE_GRADIENT = 1, ACCENT_ENABLE_TRANSPARENTGRADIENT = 2, ACCENT_ENABLE_BLURBEHIND = 3, ACCENT_INVALID_STATE = 4 } internal enum WindowCompositionAttribute { WCA_ACCENT_POLICY = 19 } [StructLayout(LayoutKind.Sequential)] internal struct AccentPolicy { public AccentState AccentState; public int AccentFlags; public int GradientColor; public int AnimationId; } [StructLayout(LayoutKind.Sequential)] internal struct WindowCompositionAttributeData { public WindowCompositionAttribute Attribute; public IntPtr Data; public int SizeOfData; } internal static class User32 { [DllImport("user32.dll")] internal static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data); } #endregion private void DomainForm_Load(object sender, EventArgs e) { UpdateTheme(); own = false; StreamReader sr = new StreamReader(dir + "node.txt"); nodeSettings = new Dictionary(); while (!sr.EndOfStream) { string line = sr.ReadLine(); string[] split = line.Split(':'); nodeSettings.Add(split[0].Trim(), split[1].Trim()); } sr.Dispose(); if (!nodeSettings.ContainsKey("Network") || !nodeSettings.ContainsKey("Key") || !nodeSettings.ContainsKey("IP")) { this.Close(); return; } network = Convert.ToInt32(nodeSettings["Network"]); GetName(); if (mainForm.watchOnly) { buttonActionMain.Enabled = false; // Only allow sending in batches for ledger } } #region API private async void GetName() { try { string content = "{\"method\": \"getnameinfo\", \"params\": [\"" + domain + "\"]}"; string response = await APIPost("", false, content); JObject jObject = JObject.Parse(response); // Get block height string Nodeinfo = await APIGet("", false); JObject jObjectInfo = JObject.Parse(Nodeinfo); JObject chain = (JObject)jObjectInfo["chain"]; height = Convert.ToInt32(chain["height"]); if (jObject.ContainsKey("result")) { JObject result = (JObject)jObject["result"]; JObject start = (JObject)result["start"]; labelStatusReserved.Text = start["reserved"].ToString(); if (result.ContainsKey("info")) { try { JObject info = (JObject)result["info"]; string state = info["state"].ToString(); labelStatusMain.Text = state; labelStatusHighest.Text = convertHNS(info["highest"].ToString()) + " HNS"; labelStatusPaid.Text = convertHNS(info["value"].ToString()) + " HNS"; JObject stats = (JObject)info["stats"]; if (info["transfer"].ToString() == "0") { labelStatusTransferring.Text = "No"; TransferEnd = 0; } else { labelStatusTransferring.Text = "Yes"; TransferEnd = Convert.ToInt32(stats["transferLockupEnd"].ToString()); } if (state == "CLOSED") { string expires = stats["blocksUntilExpire"].ToString() + " Blocks (~" + stats["daysUntilExpire"].ToString() + " days)"; labelStatusTimeToNext.Text = expires; } else if (state == "BIDDING") { string bidding = stats["blocksUntilReveal"].ToString() + " Blocks (~" + stats["hoursUntilReveal"].ToString() + " hrs)"; labelStatusTimeToNext.Text = bidding; labelStatusNextState.Text = "Reveal in:"; } else if (state == "REVEAL") { string reveal = stats["blocksUntilClose"].ToString() + " Blocks (~" + stats["hoursUntilClose"].ToString() + " hrs)"; labelStatusTimeToNext.Text = reveal; labelStatusNextState.Text = "Closing in:"; } else if (state == "OPENING") { labelStatusNextState.Text = "Bidding in:"; string expires = stats["blocksUntilBidding"].ToString() + " Blocks (~" + stats["hoursUntilBidding"].ToString() + " hrs)"; labelStatusTimeToNext.Text = expires; } else { AddLog("State not added yet: " + state); AddLog(stats.ToString()); } // Get DNS if the domain isn't in auction if (state == "CLOSED") GetDNS(); else if (state == "BIDDING" || state == "REVEAL") GetBids(state); else groupBoxDNS.Visible = false; //Setup action box ActionSetupAsync(state); } catch (Exception ex) { // No info -> Domain not yet auctioned labelStatusMain.Text = "Available"; ActionSetupAsync("AVAILABLE"); } } } else { labelStatusMain.Text = "Error"; } } catch (Exception ex) { AddLog(ex.Message); } } private async void GetDNS() { // Get DNS records string contentDNS = "{\"method\": \"getnameresource\", \"params\": [\"" + domain + "\"]}"; string responseDNS = await APIPost("", false, contentDNS); JObject jObjectDNS = JObject.Parse(responseDNS); JObject result = (JObject)jObjectDNS["result"]; JArray records = (JArray)result["records"]; // For each record int i = 0; foreach (JObject record in records) { Panel DNSPanel = new Panel(); // Count for scroll width DNSPanel.Width = panelDNS.Width - SystemInformation.VerticalScrollBarWidth - 2; DNSPanel.Height = 60; DNSPanel.BorderStyle = BorderStyle.FixedSingle; DNSPanel.Top = 62 * i; Label DNSType = new Label(); DNSType.Text = record["type"].ToString(); DNSType.Location = new System.Drawing.Point(10, 10); DNSType.AutoSize = true; DNSType.Font = new Font(DNSType.Font.FontFamily, 11.0f, FontStyle.Bold); DNSPanel.Controls.Add(DNSType); switch (DNSType.Text) { case "NS": Label DNSNS = new Label(); DNSNS.Text = record["ns"].ToString(); DNSNS.Location = new System.Drawing.Point(10, 30); DNSNS.AutoSize = true; DNSPanel.Controls.Add(DNSNS); break; case "GLUE4": case "GLUE6": Label DNSNS1 = new Label(); DNSNS1.Text = record["ns"].ToString(); DNSNS1.Location = new System.Drawing.Point(10, 30); DNSNS1.AutoSize = true; DNSPanel.Controls.Add(DNSNS1); Label address = new Label(); address.Text = record["address"].ToString(); address.Location = new System.Drawing.Point(DNSNS1.Left + DNSNS1.Width + 20, 30); address.AutoSize = true; DNSPanel.Controls.Add(address); break; case "DS": Label keyTag = new Label(); keyTag.Text = record["keyTag"].ToString(); keyTag.Location = new System.Drawing.Point(10, 30); keyTag.AutoSize = true; DNSPanel.Controls.Add(keyTag); Label algorithm = new Label(); algorithm.Text = record["algorithm"].ToString(); algorithm.Location = new System.Drawing.Point(keyTag.Left + keyTag.Width + 10, 30); algorithm.AutoSize = true; DNSPanel.Controls.Add(algorithm); Label digestType = new Label(); digestType.Text = record["digestType"].ToString(); digestType.Location = new System.Drawing.Point(algorithm.Left + algorithm.Width + 10, 30); digestType.AutoSize = true; DNSPanel.Controls.Add(digestType); Label digest = new Label(); digest.Text = record["digest"].ToString(); digest.Location = new System.Drawing.Point(digestType.Left + digestType.Width + 10, 30); digest.AutoSize = true; DNSPanel.Controls.Add(digest); break; case "TXT": JArray txts = (JArray)record["txt"]; int j = 0; foreach (string txt in txts) { Label DNSTXT = new Label(); DNSTXT.Text = txt; DNSTXT.Location = new System.Drawing.Point(10, 30 + (j * 20)); DNSTXT.AutoSize = true; DNSPanel.Controls.Add(DNSTXT); DNSPanel.Height = 60 + (j * 20); j++; } break; } panelDNS.Controls.Add(DNSPanel); i++; } panelDNS.AutoScroll = true; } private async void GetBids(string state) { groupBoxBids.Visible = true; panelBids.AutoScroll = true; // Get Bids string contentBids = "{\"method\": \"getauctioninfo\", \"params\": [\"" + domain + "\"]}"; string response = await APIPost("", true, contentBids); if (!response.Contains("\"error\":null")) { AddLog("Syncing Domain"); Label syncingLabel = new Label(); syncingLabel.Text = "Syncing Bids..."; syncingLabel.Location = new System.Drawing.Point(10, 10); syncingLabel.AutoSize = true; panelBids.Controls.Add(syncingLabel); // Error // Try scanning for auction contentBids = "{\"method\": \"importname\", \"params\": [\"" + domain + "\", " + (height - 2000) + "]}"; await APIPost("", true, contentBids); contentBids = "{\"method\": \"getauctioninfo\", \"params\": [\"" + domain + "\"]}"; response = await APIPost("", true, contentBids); panelBids.Controls.Clear(); } if (state == "BIDDING") { JObject resp = JObject.Parse(response); JObject result = (JObject)resp["result"]; JArray bids = (JArray)result["bids"]; int i = 1; foreach (JObject bid in bids) { Panel bidPanel = new Panel(); // Count for scroll width bidPanel.Width = panelBids.Width - SystemInformation.VerticalScrollBarWidth - 2; bidPanel.Height = 60; bidPanel.BorderStyle = BorderStyle.FixedSingle; bidPanel.Top = (62 * i) - 60; Label bidNumber = new Label(); bidNumber.Text = i.ToString(); bidNumber.Location = new System.Drawing.Point(10, 10); bidNumber.AutoSize = true; bidNumber.Font = new Font(bidNumber.Font.FontFamily, 11.0f, FontStyle.Bold); bidPanel.Controls.Add(bidNumber); Label bidAmount = new Label(); bidAmount.Text = convertHNS(bid["lockup"].ToString()) + " HNS"; bidAmount.Location = new System.Drawing.Point(10, 30); bidAmount.AutoSize = true; bidPanel.Controls.Add(bidAmount); if (bid["own"].ToString() == "True") { Label ownBid = new Label(); ownBid.Text = "Own Bid"; ownBid.Location = new System.Drawing.Point(bidAmount.Left + bidAmount.Width + 10, 30); ownBid.AutoSize = true; bidPanel.Controls.Add(ownBid); } panelBids.Controls.Add(bidPanel); i++; } } else if (state == "REVEAL") { //! TODO Add reveal info JObject resp = JObject.Parse(response); JObject result = (JObject)resp["result"]; JArray bids = (JArray)result["bids"]; JArray reveals = (JArray)result["reveals"]; int i = 1; foreach (JObject bid in bids) { Panel bidPanel = new Panel(); // Count for scroll width bidPanel.Width = panelBids.Width - SystemInformation.VerticalScrollBarWidth - 2; bidPanel.Height = 60; bidPanel.BorderStyle = BorderStyle.FixedSingle; bidPanel.Top = (62 * i) - 60; Label bidNumber = new Label(); bidNumber.Text = i.ToString(); bidNumber.Location = new System.Drawing.Point(10, 10); bidNumber.AutoSize = true; bidNumber.Font = new Font(bidNumber.Font.FontFamily, 11.0f, FontStyle.Bold); bidPanel.Controls.Add(bidNumber); Label bidAmount = new Label(); bidAmount.Text = convertHNS(bid["lockup"].ToString()) + " HNS"; bidAmount.Location = new System.Drawing.Point(10, 30); bidAmount.AutoSize = true; bidPanel.Controls.Add(bidAmount); if (bid["own"].ToString() == "true") { Label ownBid = new Label(); ownBid.Text = "Own Bid"; ownBid.Location = new System.Drawing.Point(bidAmount.Left + bidAmount.Width + 10, 30); ownBid.AutoSize = true; bidPanel.Controls.Add(ownBid); } panelBids.Controls.Add(bidPanel); i++; } } } private string convertHNS(string dollarydoos) { decimal hns = Convert.ToDecimal(dollarydoos); hns = hns / 1000000; return decimal.Round(hns, 2).ToString(); } HttpClient httpClient = new HttpClient(); /// /// Post to HSD API /// /// Path to post to /// Whether to use port 12039 /// Content to post /// private async Task APIPost(string path, bool wallet, string content) { string key = nodeSettings["Key"]; string ip = nodeSettings["IP"]; string port = "1203"; if (network == 1) { port = "1303"; } if (wallet) port = port + "9"; else port = port + "7"; HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, "http://" + ip + ":" + port + "/" + path); req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("x:" + key))); req.Content = new StringContent(content); // Send request HttpResponseMessage resp = await httpClient.SendAsync(req); try { resp.EnsureSuccessStatusCode(); } catch (Exception ex) { AddLog("Post Error: " + ex.Message); AddLog("Post Error: " + await resp.Content.ReadAsStringAsync()); return "Error"; } return await resp.Content.ReadAsStringAsync(); } /// /// Get from HSD API /// /// Path to get /// Whether to use port 12039 /// private async Task APIGet(string path, bool wallet) { string key = nodeSettings["Key"]; string ip = nodeSettings["IP"]; string port = "1203"; if (network == 1) { port = "1303"; } if (wallet) port = port + "9"; else port = port + "7"; try { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://" + ip + ":" + port + "/" + path); // Add API key to header request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("x:" + key))); // Send request and log response HttpResponseMessage response = await httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } // Log errors to log textbox catch (Exception ex) { AddLog("Get Error: " + ex.Message); return "Error"; } } private void AddLog(string message) { StreamWriter sw = new StreamWriter(dir + "log.txt", true); sw.WriteLine(DateTime.Now.ToString() + ": " + message); sw.Dispose(); } #endregion private bool DomainOwned() { foreach (string d in mainForm.Domains) { if (d == domain) { return true; } } return false; } private void ActionSetupAsync(string state) { own = DomainOwned(); this.state = state; switch (state) { case "AVAILABLE": groupBoxAction.Show(); groupBoxAction.Text = "Open Auction"; buttonActionMain.Text = "Send Open"; buttonActionAlt.Text = "Open in Batch"; break; case "BIDDING": groupBoxAction.Show(); labelBid.Show(); textBoxBid.Show(); labelBlind.Show(); textBoxBlind.Show(); break; case "REVEAL": groupBoxAction.Show(); groupBoxAction.Text = "Reveal Bid"; buttonActionMain.Text = "Send Reveal"; buttonActionAlt.Text = "Reveal in Batch"; break; case "CLOSED": if (own) { if (labelStatusTransferring.Text == "Yes") { groupBoxAction.Show(); groupBoxAction.Text = "Finalize"; // Check if can finalize if (height >= TransferEnd) { buttonActionMain.Text = "Send Finalize"; buttonActionAlt.Text = "Finalize in Batch"; } else { labelBid.Text = "Finalize transfer in " + (TransferEnd - height).ToString() + " blocks"; labelBid.Show(); buttonActionMain.Text = "Cancel Transfer"; buttonActionAlt.Text = "Cancel in Batch"; } } else { groupBoxAction.Show(); groupBoxAction.Text = "Edit"; buttonActionMain.Text = "Edit DNS"; buttonActionAlt.Text = "Edit in Batch"; buttonRenew.Show(); buttonTransfer.Show(); } } break; } } private void BidBlind_TextChanged(object sender, EventArgs e) { string cleanedText = Regex.Replace(textBoxBid.Text, "[^0-9.]", ""); textBoxBid.Text = cleanedText; cleanedText = Regex.Replace(textBoxBlind.Text, "[^0-9.]", ""); textBoxBlind.Text = cleanedText; } private async void buttonActionMain_Click(object sender, EventArgs e) { if (state == "BIDDING") { int count = textBoxBid.Text.Count(c => c == '.'); int count2 = textBoxBlind.Text.Count(c => c == '.'); if (count > 1 || count2 > 1) { NotifyForm notifyForm = new NotifyForm("Invalid bid amount"); notifyForm.ShowDialog(); notifyForm.Dispose(); return; } if (textBoxBid.Text == "" || textBoxBid.Text == ".") { textBoxBid.Text = "0"; } if (textBoxBlind.Text == "" || textBoxBlind.Text == ".") { textBoxBlind.Text = "0"; } decimal bid = Convert.ToDecimal(textBoxBid.Text); decimal blind = Convert.ToDecimal(textBoxBlind.Text); decimal lockup = bid + blind; string content = "{\"method\": \"sendbid\", \"params\": [\"" + domain + "\", " + bid.ToString() + ", " + lockup.ToString() + "]}"; string response = await APIPost("", true, content); if (response == "Error") { NotifyForm notifyForm = new NotifyForm("Error sending bid"); notifyForm.ShowDialog(); notifyForm.Dispose(); } else { JObject jObject = JObject.Parse(response); if (jObject["result"].ToString() == "") { JObject error = (JObject)jObject["error"]; string message = (string)error["message"]; NotifyForm notifyForm2 = new NotifyForm("Error sending bid: \n" + message); notifyForm2.ShowDialog(); notifyForm2.Dispose(); return; } JObject result = (JObject)jObject["result"]; string hash = (string)result["hash"]; NotifyForm notifyForm = new NotifyForm("Bid sent: " + hash, "Explorer", explorerTX + hash); notifyForm.ShowDialog(); notifyForm.Dispose(); } } else if (state == "REVEAL") { string content = "{\"method\": \"sendreveal\", \"params\": [\"" + domain + "\"]}"; string response = await APIPost("", true, content); if (response == "Error") { NotifyForm notifyForm = new NotifyForm("Error sending reveal"); notifyForm.ShowDialog(); notifyForm.Dispose(); } else { JObject jObject = JObject.Parse(response); if (jObject["result"].ToString() == "") { JObject error = (JObject)jObject["error"]; string message = (string)error["message"]; NotifyForm notifyForm2 = new NotifyForm("Error sending reveal: \n" + message); notifyForm2.ShowDialog(); notifyForm2.Dispose(); return; } JObject result = (JObject)jObject["result"]; string hash = (string)result["hash"]; NotifyForm notifyForm = new NotifyForm("Reveal sent: " + hash, "Explorer", explorerTX + hash); notifyForm.ShowDialog(); notifyForm.Dispose(); } } else if (state == "AVAILABLE") { string content = "{\"method\": \"sendopen\", \"params\": [\"" + domain + "\"]}"; string response = await APIPost("", true, content); if (response == "Error") { NotifyForm notifyForm = new NotifyForm("Error sending open"); notifyForm.ShowDialog(); notifyForm.Dispose(); } else { JObject jObject = JObject.Parse(response); if (jObject["result"].ToString() == "") { JObject error = (JObject)jObject["error"]; string message = (string)error["message"]; NotifyForm notifyForm2 = new NotifyForm("Error sending open: \n" + message); notifyForm2.ShowDialog(); notifyForm2.Dispose(); return; } JObject result = (JObject)jObject["result"]; string hash = (string)result["hash"]; NotifyForm notifyForm = new NotifyForm("Open sent: " + hash, "Explorer", explorerTX + hash); notifyForm.ShowDialog(); notifyForm.Dispose(); } } else if (state == "CLOSED") { if (labelStatusTransferring.Text == "Yes") { string content = "{\"method\": \"sendfinalize\", \"params\": [\"" + domain + "\"]}"; if (height < TransferEnd) { content = "{\"method\": \"sendcancel\", \"params\": [\"" + domain + "\"]}"; } string response = await APIPost("", true, content); if (response == "Error") { NotifyForm notifyForm = new NotifyForm("Error sending finalize"); notifyForm.ShowDialog(); notifyForm.Dispose(); } else { JObject jObject = JObject.Parse(response); if (jObject["result"].ToString() == "") { JObject error = (JObject)jObject["error"]; string message = (string)error["message"]; NotifyForm notifyForm2 = new NotifyForm("Error sending finalize: \n" + message); notifyForm2.ShowDialog(); notifyForm2.Dispose(); return; } JObject result = (JObject)jObject["result"]; string hash = (string)result["hash"]; NotifyForm notifyForm = new NotifyForm("Finalize sent: " + hash, "Explorer", explorerTX + hash); notifyForm.ShowDialog(); notifyForm.Dispose(); } } else { DNSForm DNSEdit = new DNSForm(mainForm, domain); DNSEdit.ShowDialog(); if (!DNSEdit.cancel) { string records = string.Join(", ", DNSEdit.DNSrecords.Select(record => record.ToString())); string content = "{\"method\": \"sendupdate\", \"params\": [\"" + domain + "\", {\"records\": [" + records + "]}]}"; string response = await APIPost("", true, content); if (response == "Error") { NotifyForm notifyForm = new NotifyForm("Error sending update"); notifyForm.ShowDialog(); notifyForm.Dispose(); } else { JObject jObject = JObject.Parse(response); if (jObject["result"].ToString() == "") { JObject error = (JObject)jObject["error"]; string message = (string)error["message"]; NotifyForm notifyForm2 = new NotifyForm("Error sending update: \n" + message); notifyForm2.ShowDialog(); notifyForm2.Dispose(); return; } JObject result = (JObject)jObject["result"]; string hash = (string)result["hash"]; NotifyForm notifyForm = new NotifyForm("Update sent: " + hash, "Explorer", explorerTX + hash); notifyForm.ShowDialog(); notifyForm.Dispose(); } } DNSEdit.Dispose(); } } } private void Explorer_Click(object sender, EventArgs e) { ProcessStartInfo psi = new ProcessStartInfo { FileName = explorerName + domain, UseShellExecute = true }; Process.Start(psi); } private void buttonActionAlt_Click(object sender, EventArgs e) { if (state == "BIDDING") { int count = textBoxBid.Text.Count(c => c == '.'); int count2 = textBoxBlind.Text.Count(c => c == '.'); if (count > 1 || count2 > 1) { NotifyForm notifyForm = new NotifyForm("Invalid bid amount"); notifyForm.ShowDialog(); notifyForm.Dispose(); return; } if (textBoxBid.Text == "" || textBoxBid.Text == ".") { textBoxBid.Text = "0"; } if (textBoxBlind.Text == "" || textBoxBlind.Text == ".") { textBoxBlind.Text = "0"; } decimal bid = Convert.ToDecimal(textBoxBid.Text); decimal blind = Convert.ToDecimal(textBoxBlind.Text); decimal lockup = bid + blind; mainForm.AddBatch(domain, "BID", bid, lockup); this.Close(); } else if (state == "CLOSED") { if (labelStatusTransferring.Text == "Yes") { if (height >= TransferEnd) { mainForm.AddBatch(domain, "FINALIZE"); this.Close(); } else { mainForm.AddBatch(domain, "CANCEL"); this.Close(); } } else { DNSForm dnsEdit = new DNSForm(mainForm, domain); dnsEdit.ShowDialog(); if (!dnsEdit.cancel) { mainForm.AddBatch(domain, "UPDATE", dnsEdit.DNSrecords); this.Close(); } dnsEdit.Dispose(); } } else { switch (state) { case "REVEAL": mainForm.AddBatch(domain, "REVEAL"); this.Close(); break; case "AVAILABLE": mainForm.AddBatch(domain, "OPEN"); this.Close(); break; } } } private void buttonRenew_Click(object sender, EventArgs e) { mainForm.AddBatch(domain, "RENEW"); } private void buttonTransfer_Click(object sender, EventArgs e) { // Transfer TransferForm transferForm = new TransferForm(mainForm, domain); transferForm.Show(); this.Close(); } } }