Compare commits

..

No commits in common. "master" and "feature/signMessage" have entirely different histories.

13 changed files with 1643 additions and 2405 deletions

View File

@ -3,9 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.6.33815.320 VisualStudioVersion = 17.6.33815.320
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FireWalletLite", "FireWalletLite\FireWalletLite.csproj", "{A375882A-CB5E-4268-A6CC-106B270EE200}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FireWalletLite", "FireWalletLite\FireWalletLite.csproj", "{A375882A-CB5E-4268-A6CC-106B270EE200}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Installer", "Installer\Installer.vdproj", "{6D6023A9-C523-4DC2-9529-13B03B16A116}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -17,8 +15,6 @@ Global
{A375882A-CB5E-4268-A6CC-106B270EE200}.Debug|Any CPU.Build.0 = Debug|Any CPU {A375882A-CB5E-4268-A6CC-106B270EE200}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A375882A-CB5E-4268-A6CC-106B270EE200}.Release|Any CPU.ActiveCfg = Release|Any CPU {A375882A-CB5E-4268-A6CC-106B270EE200}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A375882A-CB5E-4268-A6CC-106B270EE200}.Release|Any CPU.Build.0 = Release|Any CPU {A375882A-CB5E-4268-A6CC-106B270EE200}.Release|Any CPU.Build.0 = Release|Any CPU
{6D6023A9-C523-4DC2-9529-13B03B16A116}.Debug|Any CPU.ActiveCfg = Debug
{6D6023A9-C523-4DC2-9529-13B03B16A116}.Release|Any CPU.ActiveCfg = Release
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -2,29 +2,31 @@
using FireWallet; using FireWallet;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace FireWalletLite; namespace FireWalletLite
public partial class DomainForm : Form
{ {
private readonly string Domain; public partial class DomainForm : Form
private readonly MainForm Main; {
private MainForm Main;
private string Domain;
public DomainForm(MainForm main, string domain) public DomainForm(MainForm main, string domain)
{ {
InitializeComponent(); InitializeComponent();
Main = main; this.Main = main;
Domain = domain; this.Domain = domain;
Text = domain + "/"; Text = domain + "/";
// Theme form // Theme form
BackColor = ColorTranslator.FromHtml(main.Theme["background"]); BackColor = ColorTranslator.FromHtml(main.Theme["background"]);
ForeColor = ColorTranslator.FromHtml(main.Theme["foreground"]); ForeColor = ColorTranslator.FromHtml(main.Theme["foreground"]);
foreach (Control control in Controls) main.ThemeControl(control); foreach (Control control in Controls)
{
main.ThemeControl(control);
}
labelName.Text = domain + "/"; labelName.Text = domain + "/";
} }
private void buttonExplorer_Click(object sender, EventArgs e) private void buttonExplorer_Click(object sender, EventArgs e)
{ {
var psi = new ProcessStartInfo ProcessStartInfo psi = new ProcessStartInfo
{ {
FileName = Main.DomainExplorer + Domain, FileName = Main.DomainExplorer + Domain,
UseShellExecute = true UseShellExecute = true
@ -36,10 +38,13 @@ public partial class DomainForm : Form
{ {
if (!File.Exists(Main.dir + "domains.json")) return; if (!File.Exists(Main.dir + "domains.json")) return;
var domains = JArray.Parse(File.ReadAllText(Main.dir + "domains.json")); JArray domains = JArray.Parse(File.ReadAllText(Main.dir + "domains.json"));
foreach (JObject domain in domains) foreach (JObject domain in domains)
{
if (domain["name"].ToString() == Domain) if (domain["name"].ToString() == Domain)
{
if (domain.ContainsKey("status")) if (domain.ContainsKey("status"))
{
switch (domain["status"].ToString()) switch (domain["status"].ToString())
{ {
case "transferring": case "transferring":
@ -54,136 +59,139 @@ public partial class DomainForm : Form
break; break;
} }
} }
}
}
}
private async void buttonRenew_Click(object sender, EventArgs e) private async void buttonRenew_Click(object sender, EventArgs e)
{ {
var path = "wallet/" + Main.Account + "/renewal"; string content = "{\"method\": \"renew\", \"params\": [\"" + Domain + "\"]}";
var content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + string response = await Main.APIPost("", true, content);
"\", \"broadcast\": true, \"sign\": true}";
var response = await Main.APIPost(path, true, content);
if (response == "Error") if (response == "Error")
{ {
var notify = new NotifyForm("Error renewing domain"); NotifyForm notify = new NotifyForm("Error renewing domain");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
JObject jObject = JObject.Parse(response);
var jObject = JObject.Parse(response); if (jObject.ContainsKey("result"))
if (jObject.ContainsKey("hash"))
{ {
var txid = jObject["hash"].ToString(); Main.AddLog(jObject["result"].ToString());
var notify = new NotifyForm("Renew sent", "Explorer", Main.TXExplorer + txid); JObject result = (JObject)jObject["result"];
if (result.ContainsKey("txid"))
{
string txid = result["txid"].ToString();
NotifyForm notify = new NotifyForm("Renewed domain", "Explorer", Main.TXExplorer + txid);
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
AddDomainInfo("closed");
} }
else else
{ {
var notify = new NotifyForm("Error renewing domain"); NotifyForm notify = new NotifyForm("Error renewing domain");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
} }
} }
else
{
NotifyForm notify = new NotifyForm("Error renewing domain");
notify.ShowDialog();
notify.Dispose();
Main.AddLog(jObject.ToString());
}
}
private async void buttonTransfer_Click(object sender, EventArgs e) private async void buttonTransfer_Click(object sender, EventArgs e)
{ {
var address = textBoxTransferAddress.Text; string address = textBoxTransferAddress.Text;
var valid = await Main.ValidAddress(address); bool valid = await Main.ValidAddress(address);
if (!valid) if (!valid)
{ {
var notify = new NotifyForm("Invalid address"); NotifyForm notify = new NotifyForm("Invalid address");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
string path = "wallet/" + Main.Account + "/transfer";
var path = "wallet/" + Main.Account + "/transfer"; string content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + "\", \"broadcast\": true, \"sign\": true, \"address\": \"" + address + "\"}";
var content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + string response = await Main.APIPost(path, true, content);
"\", \"broadcast\": true, \"sign\": true, \"address\": \"" + address + "\"}";
var response = await Main.APIPost(path, true, content);
if (response == "Error") if (response == "Error")
{ {
var notify = new NotifyForm("Error transferring domain"); NotifyForm notify = new NotifyForm("Error transferring domain");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
JObject jObject = JObject.Parse(response);
var jObject = JObject.Parse(response);
if (jObject.ContainsKey("hash")) if (jObject.ContainsKey("hash"))
{ {
var txid = jObject["hash"].ToString(); string txid = jObject["hash"].ToString();
var notify = new NotifyForm("Transferred domain", "Explorer", Main.TXExplorer + txid); NotifyForm notify = new NotifyForm("Transferred domain", "Explorer", Main.TXExplorer + txid);
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
AddDomainInfo("transferring"); AddDomainInfo("transferring");
} }
else else
{ {
var notify = new NotifyForm("Error transferring domain"); NotifyForm notify = new NotifyForm("Error transferring domain");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
} }
} }
private async void buttonFinalize_Click(object sender, EventArgs e) private void buttonFinalize_Click(object sender, EventArgs e)
{ {
var path = "wallet/" + Main.Account + "/finalize"; string path = "wallet/" + Main.Account + "/finalize";
var content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + string content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + "\", \"broadcast\": true, \"sign\": true}";
"\", \"broadcast\": true, \"sign\": true}"; string response = Main.APIPost(path, true, content).Result;
var response = await Main.APIPost(path, true, content);
if (response == "Error") if (response == "Error")
{ {
var notify = new NotifyForm("Error finalizing transfer"); NotifyForm notify = new NotifyForm("Error finalizing transfer");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
JObject jObject = JObject.Parse(response);
var jObject = JObject.Parse(response);
if (jObject.ContainsKey("hash")) if (jObject.ContainsKey("hash"))
{ {
var txid = jObject["hash"].ToString(); string txid = jObject["hash"].ToString();
var notify = new NotifyForm("Finalized domain", "Explorer", Main.TXExplorer + txid); NotifyForm notify = new NotifyForm("Finalized domain", "Explorer", Main.TXExplorer + txid);
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
AddDomainInfo("closed"); AddDomainInfo("closed");
} }
else else
{ {
var notify = new NotifyForm("Error finalizing domain"); NotifyForm notify = new NotifyForm("Error finalizing domain");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
} }
} }
private void buttonCancel_Click(object sender, EventArgs e)
private async void buttonCancel_Click(object sender, EventArgs e)
{ {
var path = "wallet/" + Main.Account + "/cancel"; string path = "wallet/" + Main.Account + "/cancel";
var content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + string content = "{\"passphrase\": \"" + Main.Password + "\", \"name\": \"" + Domain + "\", \"broadcast\": true, \"sign\": true}";
"\", \"broadcast\": true, \"sign\": true}"; string response = Main.APIPost(path, true, content).Result;
var response = await Main.APIPost(path, true, content);
if (response == "Error") if (response == "Error")
{ {
var notify = new NotifyForm("Error cancelling transfer"); NotifyForm notify = new NotifyForm("Error cancelling transfer");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
JObject jObject = JObject.Parse(response);
var jObject = JObject.Parse(response);
if (jObject.ContainsKey("hash")) if (jObject.ContainsKey("hash"))
{ {
var txid = jObject["hash"].ToString(); string txid = jObject["hash"].ToString();
var notify = new NotifyForm("Canceled transfer", "Explorer", Main.TXExplorer + txid); NotifyForm notify = new NotifyForm("Canceled transfer", "Explorer", Main.TXExplorer + txid);
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
AddDomainInfo("closed"); AddDomainInfo("closed");
} }
else else
{ {
var notify = new NotifyForm("Error cancelling transfer"); NotifyForm notify = new NotifyForm("Error cancelling transfer");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
} }
@ -193,32 +201,37 @@ public partial class DomainForm : Form
{ {
if (File.Exists(Main.dir + "domains.json")) if (File.Exists(Main.dir + "domains.json"))
{ {
var found = false; bool found = false;
var domains = JArray.Parse(File.ReadAllText(Main.dir + "domains.json")); JArray domains = JArray.Parse(File.ReadAllText(Main.dir + "domains.json"));
foreach (JObject domain in domains) foreach (JObject domain in domains)
{
if (domain["name"].ToString() == Domain) if (domain["name"].ToString() == Domain)
{ {
found = true; found = true;
if (domain.ContainsKey("status")) if (domain.ContainsKey("status"))
{
domain["status"] = status; domain["status"] = status;
}
else else
{
domain.Add("status", status); domain.Add("status", status);
} }
}
}
if (!found) if (!found)
{ {
var domain = new JObject(); JObject domain = new JObject();
domain["name"] = Domain; domain["name"] = Domain;
domain["status"] = status; domain["status"] = status;
domains.Add(domain); domains.Add(domain);
} }
File.WriteAllText(Main.dir + "domains.json", domains.ToString()); File.WriteAllText(Main.dir + "domains.json", domains.ToString());
} }
else else
{ {
var domains = new JArray(); JArray domains = new JArray();
var domain = new JObject(); JObject domain = new JObject();
domain["name"] = Domain; domain["name"] = Domain;
domain["status"] = status; domain["status"] = status;
domains.Add(domain); domains.Add(domain);
@ -230,12 +243,12 @@ public partial class DomainForm : Form
{ {
if (buttonSign.Text == "Save") if (buttonSign.Text == "Save")
{ {
var saveFileDialog = new SaveFileDialog(); SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Text File|*.txt"; saveFileDialog.Filter = "Text File|*.txt";
saveFileDialog.Title = "Save Signature"; saveFileDialog.Title = "Save Signature";
if (saveFileDialog.ShowDialog() == DialogResult.OK) if (saveFileDialog.ShowDialog() == DialogResult.OK)
{ {
var signature = new JObject(); JObject signature = new JObject();
signature["domain"] = Domain; signature["domain"] = Domain;
signature["message"] = textBoxSignMessage.Text; signature["message"] = textBoxSignMessage.Text;
signature["signature"] = textBoxSignature.Text; signature["signature"] = textBoxSignature.Text;
@ -245,27 +258,23 @@ public partial class DomainForm : Form
return; return;
} }
if (textBoxSignMessage.Text == "") if (textBoxSignMessage.Text == "")
{ {
var notify = new NotifyForm("Enter a message to sign"); NotifyForm notify = new NotifyForm("Enter a message to sign");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
string content = "{\"method\": \"signmessagewithname\", \"params\": [\"" + Domain + "\", \"" + textBoxSignMessage.Text + "\"]}";
var content = "{\"method\": \"signmessagewithname\", \"params\": [\"" + Domain + "\", \"" + string response = await Main.APIPost("", true, content);
textBoxSignMessage.Text + "\"]}";
var response = await Main.APIPost("", true, content);
if (response == "Error") if (response == "Error")
{ {
var notify = new NotifyForm("Error signing message"); NotifyForm notify = new NotifyForm("Error signing message");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
JObject jObject = JObject.Parse(response);
var jObject = JObject.Parse(response);
if (jObject.ContainsKey("result")) if (jObject.ContainsKey("result"))
{ {
textBoxSignature.Text = jObject["result"].ToString(); textBoxSignature.Text = jObject["result"].ToString();
@ -274,7 +283,7 @@ public partial class DomainForm : Form
else else
{ {
Main.AddLog(response); Main.AddLog(response);
var notify = new NotifyForm("Error signing message"); NotifyForm notify = new NotifyForm("Error signing message");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
} }
@ -284,4 +293,5 @@ public partial class DomainForm : Form
{ {
buttonSign.Text = "Sign"; buttonSign.Text = "Sign";
} }
}
} }

View File

@ -1,22 +1,24 @@
using FireWallet; using FireWallet;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace FireWalletLite; namespace FireWalletLite
public partial class FirstLoginForm : Form
{ {
private readonly MainForm main; public partial class FirstLoginForm : Form
private string seedPhrase; {
String seedPhrase;
MainForm main;
public FirstLoginForm(string seedPhrase, MainForm mainForm) public FirstLoginForm(string seedPhrase, MainForm mainForm)
{ {
InitializeComponent(); InitializeComponent();
this.seedPhrase = seedPhrase; this.seedPhrase = seedPhrase;
main = mainForm; this.main = mainForm;
// Theme form // Theme form
BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]); this.BackColor = ColorTranslator.FromHtml(mainForm.Theme["background"]);
ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]); this.ForeColor = ColorTranslator.FromHtml(mainForm.Theme["foreground"]);
foreach (Control control in Controls) mainForm.ThemeControl(control); foreach (Control control in Controls)
{
mainForm.ThemeControl(control);
}
textBoxSeed.Text = seedPhrase; textBoxSeed.Text = seedPhrase;
} }
@ -24,33 +26,34 @@ public partial class FirstLoginForm : Form
{ {
if (textBoxPassword.Text.Length < 8) if (textBoxPassword.Text.Length < 8)
{ {
var notifyForm = new NotifyForm("Please choose a longer password!"); NotifyForm notifyForm = new NotifyForm("Please choose a longer password!");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
return; return;
} }
if (textBoxPassword.Text != textBoxPassword2.Text) if (textBoxPassword.Text != textBoxPassword2.Text)
{ {
var notifyForm = new NotifyForm("Passwords do not match!"); NotifyForm notifyForm = new NotifyForm("Passwords do not match!");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
return; return;
} }
// Encrypt wallet // Encrypt wallet
var content = "{\"method\":\"encryptwallet\",\"params\":[\"" + textBoxPassword.Text + "\"]}"; string content = "{\"method\":\"encryptwallet\",\"params\":[\"" + textBoxPassword.Text + "\"]}";
var response = await main.APIPost("", true, content); string response = await main.APIPost("",true,content);
main.AddLog("Encrypt wallet: " + response); main.AddLog("Encrypt wallet: " + response);
var jObject = JObject.Parse(response); JObject jObject = JObject.Parse(response);
if (jObject["error"].ToString() != "") if (jObject["error"].ToString() != "")
{ {
var notifyForm = new NotifyForm("Error encrypting wallet: " + jObject["error"]); NotifyForm notifyForm = new NotifyForm("Error encrypting wallet: " + jObject["error"].ToString());
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
return; return;
} else
{
this.Close();
}
} }
Close();
} }
} }

View File

@ -2,37 +2,35 @@ using System.Diagnostics;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using FireWallet; using FireWallet;
namespace FireWalletLite; namespace FireWalletLite
public partial class Loader : Form
{ {
public partial class Loader : Form
{
#region Constants #region Constants
MainForm mainForm = new MainForm();
private readonly MainForm mainForm = new(); bool hideScreen = false;
private readonly bool hideScreen = true; // Hide screen or not (for debug) Process HSDProcess;
private readonly Process HSDProcess;
#endregion #endregion
public Loader() public Loader()
{ {
InitializeComponent(); InitializeComponent();
var splashScreen = new SplashScreen(false); SplashScreen splashScreen = new SplashScreen(false);
splashScreen.Show(); splashScreen.Show();
Application.DoEvents(); Application.DoEvents();
var start = DateTime.Now; DateTime start = DateTime.Now;
// Install and load node // Install and load node
var dir = mainForm.dir; string dir = mainForm.dir;
HSDProcess = new Process(); HSDProcess = new Process();
if (!Directory.Exists(dir)) Environment.Exit(1); if (!Directory.Exists(dir)) Environment.Exit(1);
var hsdPath = dir + "hsd\\bin\\hsd.exe"; string hsdPath = dir + "hsd\\bin\\hsd.exe";
if (!Directory.Exists(dir + "hsd")) if (!Directory.Exists(dir + "hsd"))
{ {
var repositoryUrl = "https://github.com/handshake-org/hsd.git"; string repositoryUrl = "https://github.com/handshake-org/hsd.git";
var destinationPath = dir + "hsd"; string destinationPath = dir + "hsd";
CloneRepository(repositoryUrl, destinationPath); CloneRepository(repositoryUrl, destinationPath);
} }
// Start HSD // Start HSD
HSDProcess.StartInfo.RedirectStandardInput = true; HSDProcess.StartInfo.RedirectStandardInput = true;
HSDProcess.StartInfo.RedirectStandardOutput = false; HSDProcess.StartInfo.RedirectStandardOutput = false;
@ -50,47 +48,41 @@ public partial class Loader : Form
{ {
HSDProcess.StartInfo.RedirectStandardError = false; HSDProcess.StartInfo.RedirectStandardError = false;
} }
HSDProcess.Start(); HSDProcess.Start();
while ((DateTime.Now - start).TotalSeconds < 5) while ((DateTime.Now - start).TotalSeconds < 5)
{ {
Thread.Sleep(10); Thread.Sleep(10);
Application.DoEvents(); Application.DoEvents();
} }
splashScreen.CloseSplash(); splashScreen.CloseSplash();
while (!splashScreen.IsClosed) while (!splashScreen.IsClosed)
{ {
Thread.Sleep(10); Thread.Sleep(10);
Application.DoEvents(); Application.DoEvents();
} }
splashScreen.Dispose(); splashScreen.Dispose();
mainForm.Show(); mainForm.Show();
} }
#region Git #region Git
public void CloneRepository(string repositoryUrl, string destinationPath) public void CloneRepository(string repositoryUrl, string destinationPath)
{ {
try try
{ {
// Check if git is installed // Check if git is installed
var testInstalled = new Process(); Process testInstalled = new Process();
testInstalled.StartInfo.FileName = "git"; testInstalled.StartInfo.FileName = "git";
testInstalled.StartInfo.Arguments = "-v"; testInstalled.StartInfo.Arguments = "-v";
testInstalled.StartInfo.RedirectStandardOutput = true; testInstalled.StartInfo.RedirectStandardOutput = true;
testInstalled.StartInfo.UseShellExecute = false; testInstalled.StartInfo.UseShellExecute = false;
testInstalled.StartInfo.CreateNoWindow = true; testInstalled.StartInfo.CreateNoWindow = true;
testInstalled.Start(); testInstalled.Start();
var outputInstalled = testInstalled.StandardOutput.ReadToEnd(); string outputInstalled = testInstalled.StandardOutput.ReadToEnd();
testInstalled.WaitForExit(); testInstalled.WaitForExit();
if (!outputInstalled.Contains("git version")) if (!outputInstalled.Contains("git version"))
{ {
mainForm.AddLog("Git is not installed"); mainForm.AddLog("Git is not installed");
var notifyForm = new NotifyForm("Git is not installed\nPlease install it to install HSD dependencies", NotifyForm notifyForm = new NotifyForm("Git is not installed\nPlease install it to install HSD dependencies", "Install", "https://git-scm.com/download/win");
"Install", "https://git-scm.com/download/win");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
Environment.Exit(21); Environment.Exit(21);
@ -111,8 +103,7 @@ public partial class Loader : Form
if (!outputInstalled.Contains("v")) if (!outputInstalled.Contains("v"))
{ {
mainForm.AddLog("Node is not installed"); mainForm.AddLog("Node is not installed");
var notifyForm = new NotifyForm("Node is not installed\nPlease install it to install HSD dependencies", NotifyForm notifyForm = new NotifyForm("Node is not installed\nPlease install it to install HSD dependencies", "Install", "https://nodejs.org/en/download");
"Install", "https://nodejs.org/en/download");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
Environment.Exit(22); Environment.Exit(22);
@ -137,8 +128,7 @@ public partial class Loader : Form
{ {
mainForm.AddLog("NPM is not installed"); mainForm.AddLog("NPM is not installed");
mainForm.AddLog(outputInstalled); mainForm.AddLog(outputInstalled);
var notifyForm = new NotifyForm("NPM is not installed\nPlease install it to install HSD dependencies", NotifyForm notifyForm = new NotifyForm("NPM is not installed\nPlease install it to install HSD dependencies", "Install", "https://docs.npmjs.com/downloading-and-installing-node-js-and-npm");
"Install", "https://docs.npmjs.com/downloading-and-installing-node-js-and-npm");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
Environment.Exit(23); Environment.Exit(23);
@ -147,25 +137,30 @@ public partial class Loader : Form
mainForm.AddLog("Prerequisites installed"); mainForm.AddLog("Prerequisites installed");
var startInfo = new ProcessStartInfo(); ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "git"; startInfo.FileName = "git";
startInfo.Arguments = $"clone {repositoryUrl} {destinationPath}"; startInfo.Arguments = $"clone {repositoryUrl} {destinationPath}";
if (repositoryUrl == "https://github.com/handshake-org/hsd.git") if (repositoryUrl == "https://github.com/handshake-org/hsd.git")
{
startInfo.Arguments = $"clone --depth 1 --branch latest {repositoryUrl} {destinationPath}"; startInfo.Arguments = $"clone --depth 1 --branch latest {repositoryUrl} {destinationPath}";
}
startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false; startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = hideScreen; startInfo.CreateNoWindow = hideScreen;
var process = new Process(); Process process = new Process();
process.StartInfo = startInfo; process.StartInfo = startInfo;
process.Start(); process.Start();
var output = process.StandardOutput.ReadToEnd(); string output = process.StandardOutput.ReadToEnd();
process.WaitForExit(); process.WaitForExit();
while (!process.HasExited) output += process.StandardOutput.ReadToEnd(); while (!process.HasExited)
{
output += process.StandardOutput.ReadToEnd();
}
var psiNpmRunDist = new ProcessStartInfo var psiNpmRunDist = new ProcessStartInfo
{ {
FileName = "cmd", FileName = "cmd",
@ -183,45 +178,38 @@ public partial class Loader : Form
mainForm.AddLog(ex.Message); mainForm.AddLog(ex.Message);
if (ex.Message.Contains("to start process 'git'")) if (ex.Message.Contains("to start process 'git'"))
{ {
var notifyForm = new NotifyForm("Git is not installed\nPlease install it to install HSD dependencies", NotifyForm notifyForm = new NotifyForm("Git needs to be installed\nCheck logs for more details");
"Install", "https://git-scm.com/download/win");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
Environment.Exit(21);
} }
else if (ex.Message.Contains("to start process 'node'")) else if (ex.Message.Contains("to start process 'node'"))
{ {
var notifyForm = new NotifyForm("Node is not installed\nPlease install it to install HSD dependencies", NotifyForm notifyForm = new NotifyForm("Node needs to be installed\nCheck logs for more details");
"Install", "https://nodejs.org/en/download");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
Environment.Exit(22);
} }
else if (ex.Message.Contains("to start process 'npm'")) else if (ex.Message.Contains("to start process 'npm'"))
{ {
var notifyForm = new NotifyForm("NPM is not installed\nPlease install it to install HSD dependencies", NotifyForm notifyForm = new NotifyForm("NPM needs to be installed\nCheck logs for more details");
"Install", "https://docs.npmjs.com/downloading-and-installing-node-js-and-npm");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
Environment.Exit(23);
} }
else else
{ {
var notifyForm = new NotifyForm("Git/NPM Install FAILED\nCheck logs for more details");
NotifyForm notifyForm = new NotifyForm("Git/NPM Install FAILED\nCheck logs for more details");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
}
Environment.Exit(24); Environment.Exit(24);
} }
} }
}
public bool CheckNodeInstalled() public bool CheckNodeInstalled()
{ {
try try
{ {
// Create a new process to execute the 'node' command // Create a new process to execute the 'node' command
var process = new Process(); Process process = new Process();
process.StartInfo.FileName = "node"; process.StartInfo.FileName = "node";
process.StartInfo.Arguments = "--version"; process.StartInfo.Arguments = "--version";
process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardOutput = true;
@ -230,7 +218,7 @@ public partial class Loader : Form
// Start the process and read the output // Start the process and read the output
process.Start(); process.Start();
var output = process.StandardOutput.ReadToEnd(); string output = process.StandardOutput.ReadToEnd();
// Wait for the process to exit // Wait for the process to exit
process.WaitForExit(); process.WaitForExit();
@ -244,6 +232,7 @@ public partial class Loader : Form
return false; return false;
} }
} }
#endregion #endregion
}
} }

View File

@ -44,6 +44,7 @@
LoginButton = new Button(); LoginButton = new Button();
panelPortfolio = new Panel(); panelPortfolio = new Panel();
groupBoxHistory = new GroupBox(); groupBoxHistory = new GroupBox();
panelHistory = new Panel();
buttonRenew = new Button(); buttonRenew = new Button();
groupBoxDomains = new GroupBox(); groupBoxDomains = new GroupBox();
panelDomainList = new Panel(); panelDomainList = new Panel();
@ -58,6 +59,7 @@
((System.ComponentModel.ISupportInitialize)pictureBoxLogo).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxLogo).BeginInit();
groupBoxLogin.SuspendLayout(); groupBoxLogin.SuspendLayout();
panelPortfolio.SuspendLayout(); panelPortfolio.SuspendLayout();
groupBoxHistory.SuspendLayout();
groupBoxDomains.SuspendLayout(); groupBoxDomains.SuspendLayout();
panelNav.SuspendLayout(); panelNav.SuspendLayout();
groupBoxAccount.SuspendLayout(); groupBoxAccount.SuspendLayout();
@ -193,6 +195,7 @@
// //
// groupBoxHistory // groupBoxHistory
// //
groupBoxHistory.Controls.Add(panelHistory);
groupBoxHistory.Location = new Point(102, 226); groupBoxHistory.Location = new Point(102, 226);
groupBoxHistory.Name = "groupBoxHistory"; groupBoxHistory.Name = "groupBoxHistory";
groupBoxHistory.Size = new Size(299, 293); groupBoxHistory.Size = new Size(299, 293);
@ -200,6 +203,14 @@
groupBoxHistory.TabStop = false; groupBoxHistory.TabStop = false;
groupBoxHistory.Text = "History"; groupBoxHistory.Text = "History";
// //
// panelHistory
//
panelHistory.Dock = DockStyle.Fill;
panelHistory.Location = new Point(3, 19);
panelHistory.Name = "panelHistory";
panelHistory.Size = new Size(293, 271);
panelHistory.TabIndex = 0;
//
// buttonRenew // buttonRenew
// //
buttonRenew.Enabled = false; buttonRenew.Enabled = false;
@ -320,6 +331,7 @@
groupBoxLogin.ResumeLayout(false); groupBoxLogin.ResumeLayout(false);
groupBoxLogin.PerformLayout(); groupBoxLogin.PerformLayout();
panelPortfolio.ResumeLayout(false); panelPortfolio.ResumeLayout(false);
groupBoxHistory.ResumeLayout(false);
groupBoxDomains.ResumeLayout(false); groupBoxDomains.ResumeLayout(false);
panelNav.ResumeLayout(false); panelNav.ResumeLayout(false);
groupBoxAccount.ResumeLayout(false); groupBoxAccount.ResumeLayout(false);
@ -353,5 +365,6 @@
private ToolStripStatusLabel LabelSyncWarning; private ToolStripStatusLabel LabelSyncWarning;
private ToolStripDropDownButton DropDownHelp; private ToolStripDropDownButton DropDownHelp;
private GroupBox groupBoxHistory; private GroupBox groupBoxHistory;
private Panel panelHistory;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +1,25 @@
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace FireWallet; namespace FireWallet
public partial class NotifyForm : Form
{ {
private bool allowClose = true; public partial class NotifyForm : Form
private readonly string altLink;
private readonly bool Linkcopy;
public Dictionary<string, string> Theme { get; set; } = new()
{ {
{ "background", "#000000" }, string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\FireWallet\\";
{ "foreground", "#8e05c2"}, Dictionary<string, string> theme;
{ "background-alt", "#3e065f"}, string altLink;
{ "foreground-alt", "#ffffff"} bool Linkcopy;
}; bool allowClose = true;
public NotifyForm(string Message) public NotifyForm(string Message)
{ {
InitializeComponent(); InitializeComponent();
labelmessage.Text = Message; labelmessage.Text = Message;
altLink = ""; altLink = "";
} }
public void CloseNotification()
{
this.Close();
}
public NotifyForm(string Message, string altText, string altLink) public NotifyForm(string Message, string altText, string altLink)
{ {
InitializeComponent(); InitializeComponent();
@ -34,7 +30,6 @@ public partial class NotifyForm : Form
buttonOK.Focus(); buttonOK.Focus();
Linkcopy = false; Linkcopy = false;
} }
public NotifyForm(string Message, bool allowClose) public NotifyForm(string Message, bool allowClose)
{ {
InitializeComponent(); InitializeComponent();
@ -56,15 +51,185 @@ public partial class NotifyForm : Form
this.Linkcopy = Linkcopy; this.Linkcopy = Linkcopy;
if (Linkcopy) if (Linkcopy)
{
// Small font to fix more data // Small font to fix more data
labelmessage.Font = new Font(labelmessage.Font.FontFamily, 10); labelmessage.Font = new Font(labelmessage.Font.FontFamily, 10);
} }
public void CloseNotification()
{
Close();
} }
#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<string, string>();
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<string, string> 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 NotifyForm_Load(object sender, EventArgs e) private void NotifyForm_Load(object sender, EventArgs e)
{ {
UpdateTheme(); UpdateTheme();
@ -73,7 +238,7 @@ public partial class NotifyForm : Form
private void OK_Click(object sender, EventArgs e) private void OK_Click(object sender, EventArgs e)
{ {
allowClose = true; allowClose = true;
Close(); this.Close();
} }
private void buttonALT_Click(object sender, EventArgs e) private void buttonALT_Click(object sender, EventArgs e)
@ -84,9 +249,8 @@ public partial class NotifyForm : Form
Clipboard.SetText(altLink); Clipboard.SetText(altLink);
return; return;
} }
// Open link // Open link
var psi = new ProcessStartInfo ProcessStartInfo psi = new ProcessStartInfo
{ {
FileName = altLink, FileName = altLink,
UseShellExecute = true UseShellExecute = true
@ -98,39 +262,5 @@ public partial class NotifyForm : Form
{ {
if (!allowClose) e.Cancel = true; if (!allowClose) e.Cancel = true;
} }
#region Theming
private void UpdateTheme()
{
if (!Theme.ContainsKey("background") || !Theme.ContainsKey("background-alt") ||
!Theme.ContainsKey("foreground") || !Theme.ContainsKey("foreground-alt")) return;
// Apply Theme
BackColor = ColorTranslator.FromHtml(Theme["background"]);
// Foreground
ForeColor = ColorTranslator.FromHtml(Theme["foreground"]);
// Need to specify this for each groupbox to override the black text
foreach (Control c in Controls) ThemeControl(c);
} }
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"]);
}
}
#endregion
} }

View File

@ -1,16 +1,17 @@
namespace FireWalletLite; namespace FireWalletLite
internal static class Program
{ {
internal static class Program
{
/// <summary> /// <summary>
/// The main entry point for the application. /// The main entry point for the application.
/// </summary> /// </summary>
[STAThread] [STAThread]
private static void Main() static void Main()
{ {
// To customize application configuration such as set high DPI settings or default font, // To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration. // see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize(); ApplicationConfiguration.Initialize();
Application.Run(new Loader()); Application.Run(new Loader());
} }
}
} }

View File

@ -1,39 +1,42 @@
using QRCoder; using QRCoder;
namespace FireWalletLite; namespace FireWalletLite
public partial class ReceiveForm : Form
{ {
private readonly string address; public partial class ReceiveForm : Form
private MainForm main; {
string address;
MainForm main;
public ReceiveForm(string address, MainForm main) public ReceiveForm(string address, MainForm main)
{ {
InitializeComponent(); InitializeComponent();
this.address = address; this.address = address;
this.main = main; this.main = main;
// Theme form // Theme form
BackColor = ColorTranslator.FromHtml(main.Theme["background"]); this.BackColor = ColorTranslator.FromHtml(main.Theme["background"]);
ForeColor = ColorTranslator.FromHtml(main.Theme["foreground"]); this.ForeColor = ColorTranslator.FromHtml(main.Theme["foreground"]);
foreach (Control control in Controls) main.ThemeControl(control); foreach (Control control in Controls)
{
main.ThemeControl(control);
}
textBoxReceive.Text = address; textBoxReceive.Text = address;
textBoxReceive.Left = (ClientSize.Width - textBoxReceive.Width) / 2; textBoxReceive.Left = (this.ClientSize.Width - textBoxReceive.Width) / 2;
label1.Left = (ClientSize.Width - label1.Width) / 2; label1.Left = (this.ClientSize.Width - label1.Width) / 2;
buttonCopy.Left = (ClientSize.Width - buttonCopy.Width) / 2; buttonCopy.Left = (this.ClientSize.Width - buttonCopy.Width) / 2;
var qrcode = new QRCodeGenerator();
var qrData = qrcode.CreateQrCode(address, QRCodeGenerator.ECCLevel.Q); QRCodeGenerator qrcode = new QRCodeGenerator();
var qrCode = new QRCode(qrData); QRCodeData qrData = qrcode.CreateQrCode(address, QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrData);
pictureBoxReceiveQR.Image = qrCode.GetGraphic(20, main.Theme["foreground"], main.Theme["background"]); pictureBoxReceiveQR.Image = qrCode.GetGraphic(20, main.Theme["foreground"], main.Theme["background"]);
pictureBoxReceiveQR.SizeMode = PictureBoxSizeMode.Zoom; pictureBoxReceiveQR.SizeMode = PictureBoxSizeMode.Zoom;
pictureBoxReceiveQR.Width = ClientSize.Width / 2; pictureBoxReceiveQR.Width = this.ClientSize.Width / 2;
pictureBoxReceiveQR.Height = ClientSize.Width / 2; pictureBoxReceiveQR.Height = this.ClientSize.Width / 2;
pictureBoxReceiveQR.Left = (ClientSize.Width - pictureBoxReceiveQR.Width) / 2; pictureBoxReceiveQR.Left = (this.ClientSize.Width - pictureBoxReceiveQR.Width) / 2;
} }
private void buttonCopy_Click(object sender, EventArgs e) private void buttonCopy_Click(object sender, EventArgs e)
{ {
Clipboard.SetText(address); Clipboard.SetText(address);
} }
}
} }

View File

@ -1,56 +1,61 @@
using FireWallet; using FireWallet;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace FireWalletLite; namespace FireWalletLite
public partial class SendForm : Form
{ {
private readonly int fee = 1; public partial class SendForm : Form
private readonly MainForm main; {
private readonly decimal unlockedbalance; int fee = 1;
decimal unlockedbalance;
MainForm main;
public SendForm(decimal Unlockedbalance, MainForm main) public SendForm(decimal Unlockedbalance, MainForm main)
{ {
InitializeComponent(); InitializeComponent();
this.main = main; this.main = main;
unlockedbalance = Unlockedbalance; this.unlockedbalance = Unlockedbalance;
// Theme form // Theme form
BackColor = ColorTranslator.FromHtml(main.Theme["background"]); this.BackColor = ColorTranslator.FromHtml(main.Theme["background"]);
ForeColor = ColorTranslator.FromHtml(main.Theme["foreground"]); this.ForeColor = ColorTranslator.FromHtml(main.Theme["foreground"]);
foreach (Control control in Controls) main.ThemeControl(control); foreach (Control control in Controls)
{
main.ThemeControl(control);
}
labelMax.Text = "Max: " + (unlockedbalance - fee) + " HNS"; labelMax.Text = "Max: " + (unlockedbalance - fee).ToString() + " HNS";
if (unlockedbalance < fee) labelMax.Text = "Max: 0 HNS"; if (unlockedbalance < fee)
{
labelMax.Text = "Max: 0 HNS";
//buttonSend.Enabled = false; //buttonSend.Enabled = false;
}
// Allign controls // Allign controls
labelAddress.Left = (ClientSize.Width - labelAddress.Width) / 2; labelAddress.Left = (this.ClientSize.Width - labelAddress.Width) / 2;
labelAmount.Left = (ClientSize.Width - labelAmount.Width) / 2; labelAmount.Left = (this.ClientSize.Width - labelAmount.Width) / 2;
textBoxAddress.Left = (ClientSize.Width - textBoxAddress.Width) / 2; textBoxAddress.Left = (this.ClientSize.Width - textBoxAddress.Width) / 2;
labelMax.Left = (ClientSize.Width - labelMax.Width) / 2; labelMax.Left = (this.ClientSize.Width - labelMax.Width) / 2;
textBoxAmount.Left = (ClientSize.Width - textBoxAmount.Width - labelHNSToken.Width - 10) / 2; textBoxAmount.Left = (this.ClientSize.Width - textBoxAmount.Width - labelHNSToken.Width - 10) / 2;
labelHNSToken.Left = textBoxAmount.Left + textBoxAmount.Width + 10; labelHNSToken.Left = textBoxAmount.Left + textBoxAmount.Width + 10;
buttonSend.Left = (ClientSize.Width - buttonSend.Width) / 2; buttonSend.Left = (this.ClientSize.Width - buttonSend.Width) / 2;
} }
private async void buttonSend_Click(object sender, EventArgs e) private async void buttonSend_Click(object sender, EventArgs e)
{ {
buttonSend.Enabled = false; buttonSend.Enabled = false;
var address = textBoxAddress.Text; string address = textBoxAddress.Text;
if (textBoxAddress.Text.Substring(0, 1) == "@") if (textBoxAddress.Text.Substring(0,1) == "@")
{ {
// HIP-02 not supported yet // HIP-02 not supported yet
var notify = new NotifyForm("HIP-02 not supported yet"); NotifyForm notify = new NotifyForm("HIP-02 not supported yet");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
buttonSend.Enabled = true; buttonSend.Enabled = true;
return; return;
} }
bool valid = await main.ValidAddress(address);
var valid = await main.ValidAddress(address);
if (!valid) if (!valid)
{ {
var notify = new NotifyForm("Invalid address"); NotifyForm notify = new NotifyForm("Invalid address");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
buttonSend.Enabled = true; buttonSend.Enabled = true;
@ -60,43 +65,42 @@ public partial class SendForm : Form
decimal amount = 0; decimal amount = 0;
if (!decimal.TryParse(textBoxAmount.Text, out amount)) if (!decimal.TryParse(textBoxAmount.Text, out amount))
{ {
var notify = new NotifyForm("Invalid amount"); NotifyForm notify = new NotifyForm("Invalid amount");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
if (amount > unlockedbalance - fee) if (amount > unlockedbalance - fee)
{ {
var notify = new NotifyForm("Insufficient balance"); NotifyForm notify = new NotifyForm("Insufficient balance");
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
var content = "{\"method\": \"sendtoaddress\",\"params\": [ \"" + address + "\", " + string content = "{\"method\": \"sendtoaddress\",\"params\": [ \"" + address + "\", " +
amount + "]}"; amount.ToString() + "]}";
var output = await main.APIPost("", true, content); string output = await main.APIPost("", true, content);
var APIresp = JObject.Parse(output); JObject APIresp = JObject.Parse(output);
if (APIresp["error"].ToString() != "") if (APIresp["error"].ToString() != "")
{ {
main.AddLog("Failed:"); main.AddLog("Failed:");
main.AddLog(APIresp.ToString()); main.AddLog(APIresp.ToString());
var error = JObject.Parse(APIresp["error"].ToString()); JObject error = JObject.Parse(APIresp["error"].ToString());
var ErrorMessage = error["message"].ToString(); string ErrorMessage = error["message"].ToString();
var notify = new NotifyForm("Error Transaction Failed\n" + ErrorMessage); NotifyForm notify = new NotifyForm("Error Transaction Failed\n" + ErrorMessage);
notify.ShowDialog(); notify.ShowDialog();
notify.Dispose(); notify.Dispose();
return; return;
} }
string hash = APIresp["result"].ToString();
var hash = APIresp["result"].ToString(); string link = main.TXExplorer + hash;
var link = main.TXExplorer + hash; NotifyForm notifySuccess = new NotifyForm("Transaction Sent\nThis transaction could take up to 20 minutes to mine",
var notifySuccess = new NotifyForm("Transaction Sent\nThis transaction could take up to 20 minutes to mine",
"Explorer", link); "Explorer", link);
notifySuccess.ShowDialog(); notifySuccess.ShowDialog();
notifySuccess.Dispose(); notifySuccess.Dispose();
Close(); this.Close();
}
} }
} }

View File

@ -1,28 +1,27 @@
using System.Diagnostics; using System.Diagnostics;
using System.Drawing.Imaging; using System.Drawing.Imaging;
namespace FireWallet;
public partial class SplashScreen : Form namespace FireWallet
{ {
private bool close; public partial class SplashScreen : Form
private float opacity; {
private Bitmap splash;
public SplashScreen(bool timer) public SplashScreen(bool timer)
{ {
InitializeComponent(); InitializeComponent();
close = false; close = false;
IsClosed = false; IsClosed = false;
} }
bool close;
public bool IsClosed { get; set; } float opacity = 0.0f;
private void SplashScreen_FormClosing(object sender, FormClosingEventArgs e) private void SplashScreen_FormClosing(object sender, FormClosingEventArgs e)
{ {
if (!close) e.Cancel = true; if (!close)
{
e.Cancel = true;
} }
}
public bool IsClosed { get; set; }
public void CloseSplash() public void CloseSplash()
{ {
close = true; close = true;
@ -31,41 +30,37 @@ public partial class SplashScreen : Form
timerIn.Stop(); timerIn.Stop();
timerOut.Start(); timerOut.Start();
} }
private void label2_Click(object sender, EventArgs e) private void label2_Click(object sender, EventArgs e)
{ {
var psi = new ProcessStartInfo ProcessStartInfo psi = new ProcessStartInfo
{ {
FileName = "https://nathan.woodburn.au", FileName = "https://nathan.woodburn.au",
UseShellExecute = true UseShellExecute = true
}; };
Process.Start(psi); Process.Start(psi);
} }
Bitmap splash;
//new Bitmap(Properties.Resources.FWSplash); //new Bitmap(Properties.Resources.FWSplash);
private void SplashScreen_Load(object sender, EventArgs e) private void SplashScreen_Load(object sender, EventArgs e)
{ {
splash = pictureBoxNew.Image as Bitmap; splash = pictureBoxNew.Image as Bitmap;
pictureBoxNew.Visible = true; pictureBoxNew.Visible = true;
TransparencyKey = Color.FromArgb(0, 0, 0); this.TransparencyKey = Color.FromArgb(0, 0, 0);
pictureBoxNew.Invalidate(); pictureBoxNew.Invalidate();
} }
public Image SetImageOpacity(Image image, float opacity) public Image SetImageOpacity(Image image, float opacity)
{ {
try try
{ {
var bmp = new Bitmap(image.Width, image.Height); Bitmap bmp = new Bitmap(image.Width, image.Height);
using (var gfx = Graphics.FromImage(bmp)) using (Graphics gfx = Graphics.FromImage(bmp))
{ {
var matrix = new ColorMatrix(); ColorMatrix matrix = new ColorMatrix();
matrix.Matrix33 = opacity; matrix.Matrix33 = opacity;
var attributes = new ImageAttributes(); ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
GraphicsUnit.Pixel, attributes);
} }
return bmp; return bmp;
} }
catch catch
@ -73,7 +68,6 @@ public partial class SplashScreen : Form
return null; return null;
} }
} }
private void timerIn_Tick(object sender, EventArgs e) private void timerIn_Tick(object sender, EventArgs e)
{ {
if (opacity >= 1) if (opacity >= 1)
@ -81,24 +75,22 @@ public partial class SplashScreen : Form
timerIn.Stop(); timerIn.Stop();
return; return;
} }
opacity += 0.05f; opacity += 0.05f;
pictureBoxNew.Image = SetImageOpacity(splash, opacity); pictureBoxNew.Image = SetImageOpacity(splash, opacity);
pictureBoxNew.Invalidate(); pictureBoxNew.Invalidate();
} }
private void timerOut_Tick(object sender, EventArgs e) private void timerOut_Tick(object sender, EventArgs e)
{ {
if (opacity <= 0) if (opacity <= 0)
{ {
timerOut.Stop(); timerOut.Stop();
IsClosed = true; IsClosed = true;
Close(); this.Close();
return; return;
} }
opacity -= 0.05f; opacity -= 0.05f;
pictureBoxNew.Image = SetImageOpacity(splash, opacity); pictureBoxNew.Image = SetImageOpacity(splash, opacity);
pictureBoxNew.Invalidate(); pictureBoxNew.Invalidate();
} }
}
} }

View File

@ -1,744 +0,0 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:Installer"
"LanguageId" = "3:1033"
"CodePage" = "3:1252"
"UILanguageId" = "3:1033"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_AE21837395E3477BAB0C9E460C5F9E1E"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Debug"
{
"DisplayName" = "8:Debug"
"IsDebugOnly" = "11:TRUE"
"IsReleaseOnly" = "11:FALSE"
"OutputFilename" = "8:Debug\\Installer.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.NetCore.DesktopRuntime.6.0.x64"
{
"Name" = "8:.NET Desktop Runtime 6.0.18 (x64)"
"ProductCode" = "8:Microsoft.NetCore.DesktopRuntime.6.0.x64"
}
}
}
}
"Release"
{
"DisplayName" = "8:Release"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:Release\\Installer.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
}
}
}
}
"Deployable"
{
"CustomAction"
{
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_5AF7E79AA90B41AAA29786DC3C4C7096"
{
"Name" = "8:.NET Core"
"Message" = "8:[VSDNETCOREMSG]"
"AllowLaterVersions" = "11:FALSE"
"InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]"
"IsNETCore" = "11:TRUE"
"Architecture" = "2:0"
"Runtime" = "2:0"
}
}
}
"File"
{
}
"FileType"
{
}
"Folder"
{
"{1525181F-901A-416C-8A58-119130FE478E}:_C5178F6D7FA7478084860195A2F5CE00"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_E1E43FB13F0B48DA98F52FC87B46388F"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_F2E4B39C8E3B4447A5FD1EDBBBF6F36B"
{
"DefaultLocation" = "8:[ProgramFilesFolder][ProductName]"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1033"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:FireWalletLite"
"ProductCode" = "8:{23670E44-E1CD-40B5-881D-40657BD30860}"
"PackageCode" = "8:{2CCCD1E4-40D9-4E58-8D3A-2039BD1CD215}"
"UpgradeCode" = "8:{6966FD44-6B8C-43C0-981A-E36449BF2DA8}"
"AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.0.0"
"Manufacturer" = "8:Nathan.Woodburn/"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:FireWalletLite"
"Subject" = "8:"
"ARPCONTACT" = "8:Nathan.Woodburn/"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:"
"ARPURLINFOABOUT" = "8:"
"ARPPRODUCTICON" = "8:"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:0"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4CAE988EEDBA48869A26B28C6C1F4BB9"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_65A687F33E58477296CAA0595729195C"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCU"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B60CD5397F694FCAB905C352E6CA07AD"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8E9CCF202A2145E3ABF1FDC18F205A7A"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_41DBEDCE7AA04AA6A5749C1CCDA9E389"
{
"Name" = "8:FireWalletLite"
"Arguments" = "8:"
"Description" = "8:"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_AE21837395E3477BAB0C9E460C5F9E1E"
"Folder" = "8:_C5178F6D7FA7478084860195A2F5CE00"
"WorkingFolder" = "8:_F2E4B39C8E3B4447A5FD1EDBBBF6F36B"
"Icon" = "8:"
"Feature" = "8:"
}
}
"UserInterface"
{
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0CF0510293554C2990129671DA802C05"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_44CD2A6A59354DF795C3211010308027"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0D16658A610C430198D6F91FD4D732D3"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C94DF693C5A64464ACBAEB0A1075C332"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_558486BDD95E40A5BB80770F8EAA4E67"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9853F04696E14F45BF9E2726A1EBE60C"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_5C124147EC93487E8B9C96FBA33DC342"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5DAC4010477747D88BC32C17B23E50E3"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_042F4FCF249B41F784926BA13CFC5792"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_257C47CAADC54FC38173EC802533721C"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F32ECFCDB25A4F72A49C5ABE18380725"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_A40A9D5E6C814841890F5B9F459823E5"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F6A7465009F84A3C8C006B2BEE5EF5BD"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_89C1E3A6235947C086DBA8A50608ADDE"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_FF3128B8043E4FA9817936D20B319546"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1D1CA2281D284F5A88862C7DCAA62F16"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4F94CBA97362442D91A8822131530A8C"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CA81350D69B4450C846CB4A31EE35251"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_AE21837395E3477BAB0C9E460C5F9E1E"
{
"SourcePath" = "8:..\\FireWalletLite\\obj\\Debug\\net6.0-windows\\apphost.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_F2E4B39C8E3B4447A5FD1EDBBBF6F36B"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
"ProjectOutputGroupRegister" = "3:1"
"OutputConfiguration" = "8:"
"OutputGroupCanonicalName" = "8:PublishItems"
"OutputProjectGuid" = "8:{A375882A-CB5E-4268-A6CC-106B270EE200}"
"ShowKeyOutput" = "11:TRUE"
"ExcludeFilters"
{
}
}
}
}
}

View File

@ -1,9 +1,6 @@
# FireWalletLite # FireWalletLite
A lite wallet for Handshake. A lite wallet for Handshake.
This is aimed to be mainly used for holding HNS and domains without sending anything. This is aimed to be mainly used for holding HNS and domains without sending anything.
For example if you want to gift a domain to someone, you can have them use this wallet to store the wallet.
You will still need to renew the domains at least every 2 years.
## Features ## Features
First run flow: First run flow:
@ -15,27 +12,20 @@ First run flow:
Login only requires password as this wallet is made to only use the `primary` wallet. Login only requires password as this wallet is made to only use the `primary` wallet.
This wallet supports Main Page includes
- Displaying balance - Balance
- Domain list and expiration date - Domain Count
- Domain List
- Renew expiring domains button - Renew expiring domains button
- Displaying receiving address - Recieve HNS button (opens a window with address, copy button, and QR code)
- Sending HNS - Send HNS button (opens a window with address, amount, and send button)
- Sign message
This wallet does not (and will never) support This wallet does not (and will never) support
- Creating new wallets - Creating new wallets
- Auctions (bidding, revealing, etc) - Auctions (bidding, revealing, etc)
- Multisig wallets - Multisig wallets
- Hardware wallets - Hardware wallets
- DNS management - DNS management (a simple DNS managment page might be added in the future)
If you want to use a wallet with more features, please use [Fire Wallet](https://firewallet.au) or [Bob Wallet](https://bobwallet.io) instead. If you want to use a wallet with more features, please use [Fire Wallet](https://firewallet.au) or [Bob Wallet](https://bobwallet.io) instead.
## Install
FireWalletLite is available for Windows only.
You can download the latest prebuilt release from [here](https://git.woodburn.au/nathanwoodburn/FireWalletLite/releases).
You should download the `FireWalletLite.zip` file and extract it to a folder then run the `setup.exe` file as this file will install the .net runtime if it is not already installed.
**You can also build it yourself by cloning this repo and building it in Visual Studio.**