10 Commits
v2.0 ... v2.2

6 changed files with 267 additions and 48 deletions

View File

@@ -1,5 +1,6 @@
using System.Data; using System.Data;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Net; using System.Net;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security.Principal; using System.Security.Principal;
@@ -484,9 +485,23 @@ namespace FireWallet
{ {
AddLog("Error: "); AddLog("Error: ");
AddLog(jObject["error"].ToString()); AddLog(jObject["error"].ToString());
if (jObject["error"].ToString().Contains("Batch output addresses would exceed lookahead"))
{
NotifyForm notifyForm = new NotifyForm("Error: \nBatch output addresses would exceed lookahead\nYour batch might have too many TXs.");
notifyForm.ShowDialog();
notifyForm.Dispose();
} else if (jObject["error"].ToString().Contains("Name is not registered"))
{
NotifyForm notifyForm = new NotifyForm("Error: \nName is not registered\nRemember you can't renew domains in transfer");
notifyForm.ShowDialog();
notifyForm.Dispose();
}
else
{
NotifyForm notifyForm = new NotifyForm("Error: \n" + jObject["error"].ToString()); NotifyForm notifyForm = new NotifyForm("Error: \n" + jObject["error"].ToString());
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
}
return; return;
} }
@@ -621,7 +636,7 @@ namespace FireWallet
private void buttonImport_Click(object sender, EventArgs e) private void buttonImport_Click(object sender, EventArgs e)
{ {
OpenFileDialog openFileDialog = new OpenFileDialog(); OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "CSV File|*.csv|TXT File|*.txt"; openFileDialog.Filter = "All Files|*.*";
openFileDialog.Title = "Open Batch"; openFileDialog.Title = "Open Batch";
if (openFileDialog.ShowDialog() == DialogResult.OK) if (openFileDialog.ShowDialog() == DialogResult.OK)
{ {

View File

@@ -771,9 +771,6 @@ namespace FireWallet
} }
else if (state == "REVEAL") else if (state == "REVEAL")
{ {
decimal bid = Convert.ToDecimal(textBoxBid.Text);
decimal blind = Convert.ToDecimal(textBoxBlind.Text);
decimal lockup = bid + blind;
string content = "{\"method\": \"sendreveal\", \"params\": [\"" + domain + "\"]}"; string content = "{\"method\": \"sendreveal\", \"params\": [\"" + domain + "\"]}";
string response = await APIPost("", true, content); string response = await APIPost("", true, content);

View File

@@ -59,6 +59,8 @@ namespace FireWallet
buttonNavSend = new Button(); buttonNavSend = new Button();
buttonNavPortfolio = new Button(); buttonNavPortfolio = new Button();
panelPortfolio = new Panel(); panelPortfolio = new Panel();
buttonRenewAll = new Button();
buttonRevealAll = new Button();
groupBoxTransactions = new GroupBox(); groupBoxTransactions = new GroupBox();
groupBoxinfo = new GroupBox(); groupBoxinfo = new GroupBox();
labelPendingCount = new Label(); labelPendingCount = new Label();
@@ -87,6 +89,7 @@ namespace FireWallet
textBoxReceiveAddress = new TextBox(); textBoxReceiveAddress = new TextBox();
labelReceive1 = new Label(); labelReceive1 = new Label();
panelDomains = new Panel(); panelDomains = new Panel();
buttonExportDomains = new Button();
groupBoxDomains = new GroupBox(); groupBoxDomains = new GroupBox();
panelDomainList = new Panel(); panelDomainList = new Panel();
labelDomainSearch = new Label(); labelDomainSearch = new Label();
@@ -174,6 +177,7 @@ namespace FireWallet
toolStripStatusLabelLedger.Name = "toolStripStatusLabelLedger"; toolStripStatusLabelLedger.Name = "toolStripStatusLabelLedger";
toolStripStatusLabelLedger.Size = new Size(71, 17); toolStripStatusLabelLedger.Size = new Size(71, 17);
toolStripStatusLabelLedger.Text = "Cold Wallet:"; toolStripStatusLabelLedger.Text = "Cold Wallet:";
toolStripStatusLabelLedger.Visible = false;
// //
// toolStripSplitButtonlogout // toolStripSplitButtonlogout
// //
@@ -386,15 +390,40 @@ namespace FireWallet
// //
// panelPortfolio // panelPortfolio
// //
panelPortfolio.Controls.Add(buttonRevealAll);
panelPortfolio.Controls.Add(groupBoxTransactions); panelPortfolio.Controls.Add(groupBoxTransactions);
panelPortfolio.Controls.Add(groupBoxinfo); panelPortfolio.Controls.Add(groupBoxinfo);
panelPortfolio.Controls.Add(groupBoxbalance); panelPortfolio.Controls.Add(groupBoxbalance);
panelPortfolio.Location = new Point(1085, 47); panelPortfolio.Location = new Point(1065, 80);
panelPortfolio.Name = "panelPortfolio"; panelPortfolio.Name = "panelPortfolio";
panelPortfolio.Size = new Size(956, 538); panelPortfolio.Size = new Size(956, 538);
panelPortfolio.TabIndex = 7; panelPortfolio.TabIndex = 7;
panelPortfolio.Visible = false; panelPortfolio.Visible = false;
// //
// buttonRenewAll
//
buttonRenewAll.FlatStyle = FlatStyle.Flat;
buttonRenewAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonRenewAll.Location = new Point(813, 9);
buttonRenewAll.Name = "buttonRenewAll";
buttonRenewAll.Size = new Size(89, 32);
buttonRenewAll.TabIndex = 10;
buttonRenewAll.Text = "Renew All";
buttonRenewAll.UseVisualStyleBackColor = true;
buttonRenewAll.Click += buttonRenewAll_Click;
//
// buttonRevealAll
//
buttonRevealAll.FlatStyle = FlatStyle.Flat;
buttonRevealAll.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonRevealAll.Location = new Point(537, 12);
buttonRevealAll.Name = "buttonRevealAll";
buttonRevealAll.Size = new Size(89, 44);
buttonRevealAll.TabIndex = 9;
buttonRevealAll.Text = "Reveal All";
buttonRevealAll.UseVisualStyleBackColor = true;
buttonRevealAll.Click += buttonRevealAll_Click;
//
// groupBoxTransactions // groupBoxTransactions
// //
groupBoxTransactions.Dock = DockStyle.Bottom; groupBoxTransactions.Dock = DockStyle.Bottom;
@@ -632,7 +661,7 @@ namespace FireWallet
panelRecieve.Controls.Add(labelReceive2); panelRecieve.Controls.Add(labelReceive2);
panelRecieve.Controls.Add(textBoxReceiveAddress); panelRecieve.Controls.Add(textBoxReceiveAddress);
panelRecieve.Controls.Add(labelReceive1); panelRecieve.Controls.Add(labelReceive1);
panelRecieve.Location = new Point(117, 34); panelRecieve.Location = new Point(1140, 24);
panelRecieve.Name = "panelRecieve"; panelRecieve.Name = "panelRecieve";
panelRecieve.Size = new Size(995, 523); panelRecieve.Size = new Size(995, 523);
panelRecieve.TabIndex = 17; panelRecieve.TabIndex = 17;
@@ -692,15 +721,29 @@ namespace FireWallet
// //
// panelDomains // panelDomains
// //
panelDomains.Controls.Add(buttonRenewAll);
panelDomains.Controls.Add(buttonExportDomains);
panelDomains.Controls.Add(groupBoxDomains); panelDomains.Controls.Add(groupBoxDomains);
panelDomains.Controls.Add(labelDomainSearch); panelDomains.Controls.Add(labelDomainSearch);
panelDomains.Controls.Add(textBoxDomainSearch); panelDomains.Controls.Add(textBoxDomainSearch);
panelDomains.Location = new Point(1129, 22); panelDomains.Location = new Point(120, 48);
panelDomains.Name = "panelDomains"; panelDomains.Name = "panelDomains";
panelDomains.Size = new Size(920, 536); panelDomains.Size = new Size(920, 536);
panelDomains.TabIndex = 18; panelDomains.TabIndex = 18;
panelDomains.Visible = false; panelDomains.Visible = false;
// //
// buttonExportDomains
//
buttonExportDomains.FlatStyle = FlatStyle.Flat;
buttonExportDomains.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonExportDomains.Location = new Point(351, 9);
buttonExportDomains.Name = "buttonExportDomains";
buttonExportDomains.Size = new Size(102, 32);
buttonExportDomains.TabIndex = 3;
buttonExportDomains.Text = "Export";
buttonExportDomains.UseVisualStyleBackColor = true;
buttonExportDomains.Click += export_Click;
//
// groupBoxDomains // groupBoxDomains
// //
groupBoxDomains.Controls.Add(panelDomainList); groupBoxDomains.Controls.Add(panelDomainList);
@@ -749,7 +792,7 @@ namespace FireWallet
panelSettings.Controls.Add(buttonSettingsSave); panelSettings.Controls.Add(buttonSettingsSave);
panelSettings.Controls.Add(groupBoxSettingsExplorer); panelSettings.Controls.Add(groupBoxSettingsExplorer);
panelSettings.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point); panelSettings.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
panelSettings.Location = new Point(121, 21); panelSettings.Location = new Point(1065, 211);
panelSettings.Name = "panelSettings"; panelSettings.Name = "panelSettings";
panelSettings.Size = new Size(930, 550); panelSettings.Size = new Size(930, 550);
panelSettings.TabIndex = 19; panelSettings.TabIndex = 19;
@@ -965,13 +1008,13 @@ namespace FireWallet
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1152, 575); ClientSize = new Size(1152, 575);
Controls.Add(panelaccount); Controls.Add(panelaccount);
Controls.Add(panelPortfolio);
Controls.Add(panelRecieve); Controls.Add(panelRecieve);
Controls.Add(panelSettings);
Controls.Add(panelDomains); Controls.Add(panelDomains);
Controls.Add(panelSend); Controls.Add(panelSend);
Controls.Add(panelPortfolio);
Controls.Add(panelNav); Controls.Add(panelNav);
Controls.Add(statusStripmain); Controls.Add(statusStripmain);
Controls.Add(panelSettings);
Icon = (Icon)resources.GetObject("$this.Icon"); Icon = (Icon)resources.GetObject("$this.Icon");
Name = "MainForm"; Name = "MainForm";
Opacity = 0D; Opacity = 0D;
@@ -1091,5 +1134,8 @@ namespace FireWallet
private Button buttonSettingsRescan; private Button buttonSettingsRescan;
private ToolStripStatusLabel toolStripStatusLabelLedger; private ToolStripStatusLabel toolStripStatusLabelLedger;
private Button buttonAddressVerify; private Button buttonAddressVerify;
private Button buttonRevealAll;
private Button buttonExportDomains;
private Button buttonRenewAll;
} }
} }

View File

@@ -160,10 +160,10 @@ namespace FireWallet
toolStripStatusLabelNetwork.Text = "Network: Mainnet"; toolStripStatusLabelNetwork.Text = "Network: Mainnet";
break; break;
case 1: case 1:
toolStripStatusLabelNetwork.Text = "Network: Regtest"; toolStripStatusLabelNetwork.Text = "Network: Regtest (Not Fully Tested)";
break; break;
case 2: case 2:
toolStripStatusLabelNetwork.Text = "Network: Testnet"; toolStripStatusLabelNetwork.Text = "Network: Testnet (Not Implemented)";
break; break;
} }
@@ -218,7 +218,8 @@ namespace FireWallet
hsdProcess.Start(); hsdProcess.Start();
// Wait for HSD to start // Wait for HSD to start
await Task.Delay(2000); await Task.Delay(2000);
} catch (Exception ex) }
catch (Exception ex)
{ {
AddLog("HSD Failed to start"); AddLog("HSD Failed to start");
AddLog(ex.Message); AddLog(ex.Message);
@@ -556,9 +557,18 @@ namespace FireWallet
path = "wallet/" + account + ""; path = "wallet/" + account + "";
APIresponse = await APIGet(path, true); APIresponse = await APIGet(path, true);
JObject jObject = JObject.Parse(APIresponse); JObject jObject = JObject.Parse(APIresponse);
if (jObject["watchOnly"].ToString() == "True") watchOnly = true; if (jObject["watchOnly"].ToString() == "True")
else watchOnly = false; {
toolStripStatusLabelLedger.Text = "Cold Wallet: " + watchOnly.ToString(); watchOnly = true;
toolStripStatusLabelLedger.Text = "Cold Wallet";
toolStripStatusLabelLedger.Visible = true;
}
else
{
watchOnly = false;
toolStripStatusLabelLedger.Visible = false;
}
if (watchOnly) if (watchOnly)
{ {
@@ -573,6 +583,17 @@ namespace FireWallet
private async void LoginClick(object sender, EventArgs e) private async void LoginClick(object sender, EventArgs e)
{ {
// If the node isn't connected show a message
try
{
if (await APIGet("", false) == "Error")
{
NotifyForm notifyForm = new NotifyForm("Node not connected");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
account = comboBoxaccount.Text; account = comboBoxaccount.Text;
password = textBoxaccountpassword.Text; password = textBoxaccountpassword.Text;
bool loggedin = await Login(); bool loggedin = await Login();
@@ -586,6 +607,14 @@ namespace FireWallet
buttonNavPortfolio.PerformClick(); buttonNavPortfolio.PerformClick();
} }
} }
catch (Exception ex)
{
NotifyForm notifyForm = new NotifyForm("Node not connected\n" + ex.Message);
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
}
private void PasswordEntered(object sender, KeyEventArgs e) private void PasswordEntered(object sender, KeyEventArgs e)
{ {
@@ -604,6 +633,7 @@ namespace FireWallet
{ {
password = ""; // Clear password from memory as soon as possible password = ""; // Clear password from memory as soon as possible
toolStripSplitButtonlogout.Visible = false; toolStripSplitButtonlogout.Visible = false;
toolStripStatusLabelLedger.Visible = false;
string path = "wallet/" + account + "/lock"; string path = "wallet/" + account + "/lock";
string content = ""; string content = "";
string APIresponse = await APIPost(path, true, content); string APIresponse = await APIPost(path, true, content);
@@ -675,6 +705,11 @@ namespace FireWallet
/// <returns></returns> /// <returns></returns>
public async Task<string> APIPost(string path, bool wallet, string content) public async Task<string> APIPost(string path, bool wallet, string content)
{ {
if (content == "{\"passphrase\": \"\" ,\"timeout\": 60}")
{
// For some reason, the API doesn't like an empty password, so we'll just use a default one
content = "{\"passphrase\": \"password\" ,\"timeout\": 60}";
}
string key = nodeSettings["Key"]; string key = nodeSettings["Key"];
string ip = nodeSettings["IP"]; string ip = nodeSettings["IP"];
string port = "1203"; string port = "1203";
@@ -767,7 +802,11 @@ namespace FireWallet
decimal progress = Convert.ToDecimal(chain["progress"].ToString()); decimal progress = Convert.ToDecimal(chain["progress"].ToString());
labelSyncPercent.Text = "Sync: " + decimal.Round(progress * 100, 2) + "%"; labelSyncPercent.Text = "Sync: " + decimal.Round(progress * 100, 2) + "%";
// Exit if set to 0 TXs
if (userSettings.ContainsKey("portfolio-tx"))
{
if (userSettings["portfolio-tx"] == "0") return;
}
// Get Unconfirmed TX // Get Unconfirmed TX
@@ -923,7 +962,7 @@ namespace FireWallet
await UpdateBalance(); await UpdateBalance();
GetTXHistory(); GetTXHistory();
labelBalance.Text = "Available: " + balance.ToString() + " HNS"; labelBalance.Text = "Available: " + balance.ToString() + " HNS";
labelLocked.Text = "Locked: " + balanceLocked.ToString() + " HNS"; labelLocked.Text = "Locked: " + balanceLocked.ToString() + " HNS*";
labelBalanceTotal.Text = "Total: " + (balance + balanceLocked).ToString() + " HNS"; labelBalanceTotal.Text = "Total: " + (balance + balanceLocked).ToString() + " HNS";
if (theme.ContainsKey("selected-bg") && theme.ContainsKey("selected-fg")) if (theme.ContainsKey("selected-bg") && theme.ContainsKey("selected-fg"))
{ {
@@ -1415,12 +1454,15 @@ namespace FireWallet
#endregion #endregion
#region Domains #region Domains
public string[] Domains { get; set; } public string[] Domains { get; set; }
public string[] DomainsRenewable { get; set; }
private async void UpdateDomains() private async void UpdateDomains()
{ {
string response = await APIGet("wallet/" + account + "/name?own=true", true); string response = await APIGet("wallet/" + account + "/name?own=true", true);
JArray names = JArray.Parse(response); JArray names = JArray.Parse(response);
Domains = new string[names.Count]; Domains = new string[names.Count];
DomainsRenewable = new string[names.Count];
int i = 0; int i = 0;
int renewable = 0;
panelDomainList.Controls.Clear(); panelDomainList.Controls.Clear();
foreach (JObject name in names) foreach (JObject name in names)
{ {
@@ -1445,21 +1487,77 @@ namespace FireWallet
domainName.Left = 5; domainName.Left = 5;
domainName.AutoSize = true; domainName.AutoSize = true;
JObject stats = JObject.Parse(name["stats"].ToString());
domainTMP.Controls.Add(domainName);
if (!name.ContainsKey("stats")) {
AddLog("Domain " + Domains[i] + " does not have stats");
continue;
}
Label expiry = new Label(); Label expiry = new Label();
JObject stats = JObject.Parse(name["stats"].ToString());
if (stats.ContainsKey("daysUntilExpire"))
{
expiry.Text = "Expires: " + stats["daysUntilExpire"].ToString() + " days"; expiry.Text = "Expires: " + stats["daysUntilExpire"].ToString() + " days";
expiry.Top = 5; expiry.Top = 5;
expiry.AutoSize = true; expiry.AutoSize = true;
expiry.Left = domainTMP.Width - expiry.Width - 100; expiry.Left = domainTMP.Width - expiry.Width - 100;
domainTMP.Controls.Add(domainName);
domainTMP.Controls.Add(expiry); domainTMP.Controls.Add(expiry);
// Add to domains renewable
DomainsRenewable[renewable] = Domains[i];
renewable++;
}
else
{
expiry.Text = "Expires: Not Registered yet";
expiry.Top = 5;
expiry.AutoSize = true;
expiry.Left = domainTMP.Width - expiry.Width - 100;
domainTMP.Controls.Add(expiry);
}
panelDomainList.Controls.Add(domainTMP); panelDomainList.Controls.Add(domainTMP);
i++; i++;
} }
} }
private async void buttonRevealAll_Click(object sender, EventArgs e)
{
string content = "{\"method\": \"sendreveal\"}";
string response = await APIPost("", true, content);
AddLog(response);
if (response == "Error")
{
AddLog("Error sending reveal");
NotifyForm notifyForm = new NotifyForm("Error sending reveal");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
JObject resp = JObject.Parse(response);
if (resp["error"] != null)
{
AddLog("Error sending reveal");
AddLog(resp["error"].ToString());
JObject error = JObject.Parse(resp["error"].ToString());
NotifyForm notifyForm = new NotifyForm("Error sending reveal\n" + error["message"].ToString());
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
if (resp.ContainsKey("result"))
{
JObject result = JObject.Parse(resp["result"].ToString());
string hash = result["hash"].ToString();
NotifyForm notifyForm = new NotifyForm("Reveal sent\n" + hash, "Explorer", userSettings["explorer-tx"] + hash);
notifyForm.ShowDialog();
notifyForm.Dispose();
}
}
private void textBoxDomainSearch_KeyDown(object sender, KeyEventArgs e) private void textBoxDomainSearch_KeyDown(object sender, KeyEventArgs e)
{ {
if (e.KeyValue == 13) if (e.KeyValue == 13)
@@ -1625,11 +1723,37 @@ namespace FireWallet
} }
#endregion #endregion
private void export_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "CSV file (*.csv)|*.csv";
saveFileDialog.Title = "Export";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog.FileName);
foreach (string domain in DomainsRenewable)
{
if (domain == null) break;
sw.WriteLine(domain);
}
sw.Dispose();
}
}
private void buttonRenewAll_Click(object sender, EventArgs e)
{
if (DomainsRenewable == null)
{
NotifyForm notifyForm = new NotifyForm("No renewable domains found");
notifyForm.ShowDialog();
notifyForm.Dispose();
return;
}
foreach (string domain in DomainsRenewable)
{
if (domain == null) break;
AddBatch(domain, "RENEW");
}
}
} }
} }

View File

@@ -49,6 +49,22 @@
"PrivateKeyFile" = "8:" "PrivateKeyFile" = "8:"
"TimeStampServer" = "8:" "TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2" "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"
}
}
}
} }
"Release" "Release"
{ {
@@ -65,6 +81,22 @@
"PrivateKeyFile" = "8:" "PrivateKeyFile" = "8:"
"TimeStampServer" = "8:" "TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2" "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" "Deployable"
@@ -192,15 +224,15 @@
{ {
"Name" = "8:Microsoft Visual Studio" "Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:FireWallet" "ProductName" = "8:FireWallet"
"ProductCode" = "8:{F0940C69-189F-4613-8D7C-C3C6EA9CDDA4}" "ProductCode" = "8:{EEABCF5F-54F1-4C71-A82F-FA131D9CC8C1}"
"PackageCode" = "8:{B433A157-C12E-41BA-B25E-D42F91F186DC}" "PackageCode" = "8:{7B12D25F-C460-4627-B920-932CD9ACCF9E}"
"UpgradeCode" = "8:{0C86F725-6B01-4173-AA05-3F0EDF481362}" "UpgradeCode" = "8:{0C86F725-6B01-4173-AA05-3F0EDF481362}"
"AspNetVersion" = "8:" "AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE" "RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE" "RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE" "InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:2.0" "ProductVersion" = "8:2.2"
"Manufacturer" = "8:Nathan.Woodburn/" "Manufacturer" = "8:Nathan.Woodburn/"
"ARPHELPTELEPHONE" = "8:" "ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:https://l.woodburn.au/discord" "ARPHELPLINK" = "8:https://l.woodburn.au/discord"

View File

@@ -4,6 +4,11 @@ Experimental wallet for Handshake chain
## Installation ## Installation
### From Releases ### From Releases
You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/). You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/).
Here are some videos showing how to install and use FireWallet:
Install with a running Bob wallet: https://cloud.woodburn.au/s/pS8e2oQDidrMJWx
Install with internal HSD: https://cloud.woodburn.au/s/trwd8TyxbDfqaxF (You NEED to have Node, NPM, and git installed to use internal HSD)
### Build from source ### Build from source
You can build from source by cloning this repo. You can build from source by cloning this repo.
You will need Visual Studio (recommend a recent version) and .net desktop development tools installed. You will need Visual Studio (recommend a recent version) and .net desktop development tools installed.