mirror of
https://github.com/Nathanwoodburn/FireWallet.git
synced 2025-12-06 08:33:00 +11:00
Compare commits
31 Commits
v2.6
...
seedphrase
| Author | SHA1 | Date | |
|---|---|---|---|
|
f371f3da49
|
|||
|
a024ce7afc
|
|||
|
88ee50f4a6
|
|||
|
23cbace1ea
|
|||
|
6894e9c079
|
|||
|
95d0498672
|
|||
|
88c6b5afe0
|
|||
|
f06bc5b711
|
|||
|
42536e47bb
|
|||
|
404a47ec79
|
|||
|
c3abd0b4de
|
|||
|
41a38e2af1
|
|||
|
699b1051d4
|
|||
|
14cb5453dc
|
|||
|
5323a8ff0d
|
|||
|
2572b17898
|
|||
|
a8f425434e
|
|||
|
07c9618837
|
|||
|
eccc584b2c
|
|||
|
cf2f68f2b3
|
|||
|
5eb80bcd06
|
|||
|
7c38bfc755
|
|||
|
d4620af384
|
|||
|
15cb4efaf1
|
|||
|
18607358bf
|
|||
|
6db6d02e9e
|
|||
|
3eda3d7419
|
|||
|
3f6c2bdded
|
|||
|
2bfca908a9
|
|||
|
531d41a413
|
|||
|
960af0b169
|
@@ -539,13 +539,7 @@ namespace FireWallet
|
||||
return;
|
||||
}
|
||||
|
||||
StreamWriter sw = new StreamWriter(dir + "hsd-ledger/bin/names.txt");
|
||||
string domainslist = string.Join(",", batches.Select(batch => batch.domain));
|
||||
sw.Write(domainslist);
|
||||
sw.Dispose();
|
||||
StreamWriter sw2 = new StreamWriter(dir + "hsd-ledger/bin/batch.json");
|
||||
sw2.Write(response);
|
||||
sw2.Dispose();
|
||||
string domainslist = string.Join(",", batches.Select(batch => "\\\"" + batch.domain + "\\\""));
|
||||
|
||||
NotifyForm notify = new NotifyForm("Please confirm the transaction on your Ledger device", false);
|
||||
notify.Show();
|
||||
@@ -558,7 +552,9 @@ namespace FireWallet
|
||||
proc.StartInfo.RedirectStandardError = true;
|
||||
proc.StartInfo.FileName = "node.exe";
|
||||
proc.StartInfo.WorkingDirectory = dir + "hsd-ledger/bin/";
|
||||
proc.StartInfo.Arguments = dir + "hsd-ledger/bin/hsd-ledger sendraw batch.json names.txt --api-key " + mainForm.nodeSettings["Key"] + " -w " + mainForm.account;
|
||||
string args = "hsd-ledger/bin/hsd-ledger sendraw \"\"" + response.Replace("\"","\\\"") + "\"\" [" + domainslist + "] --api-key " + mainForm.nodeSettings["Key"] + " -w " + mainForm.account;
|
||||
|
||||
proc.StartInfo.Arguments = dir + args;
|
||||
var outputBuilder = new StringBuilder();
|
||||
|
||||
// Event handler for capturing output data
|
||||
@@ -590,6 +586,8 @@ namespace FireWallet
|
||||
}
|
||||
else
|
||||
{
|
||||
AddLog(args);
|
||||
AddLog(proc.StandardError.ReadToEnd());
|
||||
NotifyForm notifyError = new NotifyForm("Error Transaction Failed\nCheck logs for more details");
|
||||
notifyError.ShowDialog();
|
||||
notifyError.Dispose();
|
||||
@@ -640,17 +638,45 @@ namespace FireWallet
|
||||
openFileDialog.Title = "Open Batch";
|
||||
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
StreamReader sr = new StreamReader(openFileDialog.FileName);
|
||||
string line;
|
||||
string[] domains = new string[0];
|
||||
while ((line = sr.ReadLine()) != null)
|
||||
try
|
||||
{
|
||||
string[] split = line.Split(',');
|
||||
try
|
||||
StreamReader sr = new StreamReader(openFileDialog.FileName);
|
||||
string line;
|
||||
string[] domains = new string[0];
|
||||
while ((line = sr.ReadLine()) != null)
|
||||
{
|
||||
if (split.Length > 2)
|
||||
string[] split = line.Split(',');
|
||||
try
|
||||
{
|
||||
if (split[1] == "UPDATE")
|
||||
if (split.Length > 2)
|
||||
{
|
||||
if (split[1] == "UPDATE")
|
||||
{
|
||||
// Select operation and import domains
|
||||
string[] newDomains = new string[domains.Length + 1];
|
||||
for (int i = 0; i < domains.Length; i++)
|
||||
{
|
||||
newDomains[i] = domains[i];
|
||||
}
|
||||
newDomains[domains.Length] = split[0];
|
||||
domains = newDomains;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (split.Length == 2)
|
||||
{
|
||||
AddBatch(split[0], split[1]);
|
||||
}
|
||||
else if (split.Length == 3)
|
||||
{
|
||||
AddBatch(split[0], split[1], split[2]);
|
||||
}
|
||||
else if (split.Length == 4)
|
||||
{
|
||||
AddBatch(split[0], split[1], Convert.ToDecimal(split[2]), Convert.ToDecimal(split[3]));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Select operation and import domains
|
||||
string[] newDomains = new string[domains.Length + 1];
|
||||
@@ -658,68 +684,49 @@ namespace FireWallet
|
||||
{
|
||||
newDomains[i] = domains[i];
|
||||
}
|
||||
newDomains[domains.Length] = split[0];
|
||||
newDomains[domains.Length] = line.Trim();
|
||||
domains = newDomains;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (split.Length == 2)
|
||||
catch (Exception ex)
|
||||
{
|
||||
AddBatch(split[0], split[1]);
|
||||
}
|
||||
else if (split.Length == 3)
|
||||
{
|
||||
AddBatch(split[0], split[1], split[2]);
|
||||
}
|
||||
else if (split.Length == 4)
|
||||
{
|
||||
AddBatch(split[0], split[1], Convert.ToDecimal(split[2]), Convert.ToDecimal(split[3]));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Select operation and import domains
|
||||
string[] newDomains = new string[domains.Length + 1];
|
||||
for (int i = 0; i < domains.Length; i++)
|
||||
{
|
||||
newDomains[i] = domains[i];
|
||||
}
|
||||
newDomains[domains.Length] = line.Trim();
|
||||
domains = newDomains;
|
||||
AddLog("Error importing batch: " + ex.Message);
|
||||
NotifyForm notifyForm = new NotifyForm("Error importing batch");
|
||||
notifyForm.ShowDialog();
|
||||
notifyForm.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
if (domains.Length > 0)
|
||||
{
|
||||
AddLog("Error importing batch: " + ex.Message);
|
||||
NotifyForm notifyForm = new NotifyForm("Error importing batch");
|
||||
notifyForm.ShowDialog();
|
||||
notifyForm.Dispose();
|
||||
BatchImportForm batchImportForm = new BatchImportForm(domains);
|
||||
batchImportForm.ShowDialog();
|
||||
if (batchImportForm.batches != null)
|
||||
{
|
||||
foreach (Batch b in batchImportForm.batches)
|
||||
{
|
||||
if (b.method == "BID")
|
||||
{
|
||||
AddBatch(b.domain, b.method, b.bid, b.lockup);
|
||||
}
|
||||
else if (b.method == "TRANSFER")
|
||||
{
|
||||
AddBatch(b.domain, b.method, b.toAddress);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddBatch(b.domain, b.method);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (domains.Length > 0)
|
||||
sr.Dispose();
|
||||
} catch (Exception ex)
|
||||
{
|
||||
BatchImportForm batchImportForm = new BatchImportForm(domains);
|
||||
batchImportForm.ShowDialog();
|
||||
if (batchImportForm.batches != null)
|
||||
{
|
||||
foreach (Batch b in batchImportForm.batches)
|
||||
{
|
||||
if (b.method == "BID")
|
||||
{
|
||||
AddBatch(b.domain, b.method, b.bid, b.lockup);
|
||||
}
|
||||
else if (b.method == "TRANSFER")
|
||||
{
|
||||
AddBatch(b.domain, b.method, b.toAddress);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddBatch(b.domain, b.method);
|
||||
}
|
||||
}
|
||||
}
|
||||
AddLog("Error importing batch: " + ex.Message);
|
||||
NotifyForm notifyForm = new NotifyForm("Error importing batch\nMake sure the file is in not in use");
|
||||
notifyForm.ShowDialog();
|
||||
notifyForm.Dispose();
|
||||
}
|
||||
sr.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -264,8 +264,6 @@ namespace FireWallet
|
||||
buttonActionAlt.Hide();
|
||||
buttonActionMain.Hide();
|
||||
groupBoxAction.Text = "Reserved";
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<PackageIcon>HSDBatcher.png</PackageIcon>
|
||||
<RepositoryUrl>https://github.com/Nathanwoodburn/FireWallet</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<Version>2.6</Version>
|
||||
<Version>3.1</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -27,6 +27,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DnsClient" Version="1.7.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="QRCoder" Version="1.4.3" />
|
||||
</ItemGroup>
|
||||
|
||||
141
FireWallet/MainForm.Designer.cs
generated
141
FireWallet/MainForm.Designer.cs
generated
@@ -41,6 +41,10 @@ namespace FireWallet
|
||||
toolStripStatusLabelaccount = new ToolStripStatusLabel();
|
||||
toolStripStatusLabelLedger = new ToolStripStatusLabel();
|
||||
toolStripSplitButtonlogout = new ToolStripSplitButton();
|
||||
toolStripDropDownButtonHelp = new ToolStripDropDownButton();
|
||||
githubToolStripMenuItem = new ToolStripMenuItem();
|
||||
websiteToolStripMenuItem = new ToolStripMenuItem();
|
||||
supportDiscordServerToolStripMenuItem = new ToolStripMenuItem();
|
||||
timerNodeStatus = new System.Windows.Forms.Timer(components);
|
||||
panelaccount = new Panel();
|
||||
groupBoxaccount = new GroupBox();
|
||||
@@ -59,7 +63,6 @@ namespace FireWallet
|
||||
buttonNavSend = new Button();
|
||||
buttonNavPortfolio = new Button();
|
||||
panelPortfolio = new Panel();
|
||||
buttonRenewAll = new Button();
|
||||
buttonRevealAll = new Button();
|
||||
groupBoxTransactions = new GroupBox();
|
||||
groupBoxinfo = new GroupBox();
|
||||
@@ -70,7 +73,9 @@ namespace FireWallet
|
||||
labelBalanceTotal = new Label();
|
||||
labelLocked = new Label();
|
||||
labelBalance = new Label();
|
||||
buttonRenewAll = new Button();
|
||||
panelSend = new Panel();
|
||||
labelSendingHIPAddress = new Label();
|
||||
checkBoxSendSubFee = new CheckBox();
|
||||
buttonSendMax = new Button();
|
||||
buttonSendHNS = new Button();
|
||||
@@ -82,6 +87,7 @@ namespace FireWallet
|
||||
labelSendingAmount = new Label();
|
||||
labelSendingTo = new Label();
|
||||
labelSendPrompt = new Label();
|
||||
labelHIPArrow = new Label();
|
||||
panelRecieve = new Panel();
|
||||
buttonAddressVerify = new Button();
|
||||
pictureBoxReceiveQR = new PictureBox();
|
||||
@@ -89,6 +95,7 @@ namespace FireWallet
|
||||
textBoxReceiveAddress = new TextBox();
|
||||
labelReceive1 = new Label();
|
||||
panelDomains = new Panel();
|
||||
comboBoxDomainSort = new ComboBox();
|
||||
buttonExportDomains = new Button();
|
||||
groupBoxDomains = new GroupBox();
|
||||
panelDomainList = new Panel();
|
||||
@@ -116,6 +123,7 @@ namespace FireWallet
|
||||
textBoxExAddr = new TextBox();
|
||||
labelSettings4 = new Label();
|
||||
textBoxExTX = new TextBox();
|
||||
labelDomainSort = new Label();
|
||||
statusStripmain.SuspendLayout();
|
||||
panelaccount.SuspendLayout();
|
||||
groupBoxaccount.SuspendLayout();
|
||||
@@ -139,7 +147,7 @@ namespace FireWallet
|
||||
// statusStripmain
|
||||
//
|
||||
statusStripmain.Dock = DockStyle.Top;
|
||||
statusStripmain.Items.AddRange(new ToolStripItem[] { toolStripStatusLabelNetwork, toolStripStatusLabelstatus, toolStripStatusLabelaccount, toolStripStatusLabelLedger, toolStripSplitButtonlogout });
|
||||
statusStripmain.Items.AddRange(new ToolStripItem[] { toolStripStatusLabelNetwork, toolStripStatusLabelstatus, toolStripStatusLabelaccount, toolStripStatusLabelLedger, toolStripSplitButtonlogout, toolStripDropDownButtonHelp });
|
||||
statusStripmain.Location = new Point(0, 0);
|
||||
statusStripmain.Name = "statusStripmain";
|
||||
statusStripmain.Size = new Size(1152, 22);
|
||||
@@ -190,6 +198,39 @@ namespace FireWallet
|
||||
toolStripSplitButtonlogout.Visible = false;
|
||||
toolStripSplitButtonlogout.ButtonClick += Logout;
|
||||
//
|
||||
// toolStripDropDownButtonHelp
|
||||
//
|
||||
toolStripDropDownButtonHelp.DisplayStyle = ToolStripItemDisplayStyle.Text;
|
||||
toolStripDropDownButtonHelp.DropDownItems.AddRange(new ToolStripItem[] { githubToolStripMenuItem, websiteToolStripMenuItem, supportDiscordServerToolStripMenuItem });
|
||||
toolStripDropDownButtonHelp.Image = (Image)resources.GetObject("toolStripDropDownButtonHelp.Image");
|
||||
toolStripDropDownButtonHelp.ImageTransparentColor = Color.Magenta;
|
||||
toolStripDropDownButtonHelp.Margin = new Padding(20, 2, 0, 0);
|
||||
toolStripDropDownButtonHelp.Name = "toolStripDropDownButtonHelp";
|
||||
toolStripDropDownButtonHelp.Size = new Size(45, 20);
|
||||
toolStripDropDownButtonHelp.Text = "Help";
|
||||
toolStripDropDownButtonHelp.ToolTipText = "Help";
|
||||
//
|
||||
// githubToolStripMenuItem
|
||||
//
|
||||
githubToolStripMenuItem.Name = "githubToolStripMenuItem";
|
||||
githubToolStripMenuItem.Size = new Size(194, 22);
|
||||
githubToolStripMenuItem.Text = "Github";
|
||||
githubToolStripMenuItem.Click += githubToolStripMenuItem_Click;
|
||||
//
|
||||
// websiteToolStripMenuItem
|
||||
//
|
||||
websiteToolStripMenuItem.Name = "websiteToolStripMenuItem";
|
||||
websiteToolStripMenuItem.Size = new Size(194, 22);
|
||||
websiteToolStripMenuItem.Text = "Website";
|
||||
websiteToolStripMenuItem.Click += websiteToolStripMenuItem_Click;
|
||||
//
|
||||
// supportDiscordServerToolStripMenuItem
|
||||
//
|
||||
supportDiscordServerToolStripMenuItem.Name = "supportDiscordServerToolStripMenuItem";
|
||||
supportDiscordServerToolStripMenuItem.Size = new Size(194, 22);
|
||||
supportDiscordServerToolStripMenuItem.Text = "Support Discord Server";
|
||||
supportDiscordServerToolStripMenuItem.Click += supportDiscordServerToolStripMenuItem_Click;
|
||||
//
|
||||
// timerNodeStatus
|
||||
//
|
||||
timerNodeStatus.Enabled = true;
|
||||
@@ -400,18 +441,6 @@ namespace FireWallet
|
||||
panelPortfolio.TabIndex = 7;
|
||||
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;
|
||||
@@ -518,8 +547,21 @@ namespace FireWallet
|
||||
labelBalance.TabIndex = 0;
|
||||
labelBalance.Text = "labelBalance";
|
||||
//
|
||||
// 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;
|
||||
//
|
||||
// panelSend
|
||||
//
|
||||
panelSend.Controls.Add(labelSendingHIPAddress);
|
||||
panelSend.Controls.Add(checkBoxSendSubFee);
|
||||
panelSend.Controls.Add(buttonSendMax);
|
||||
panelSend.Controls.Add(buttonSendHNS);
|
||||
@@ -531,12 +573,23 @@ namespace FireWallet
|
||||
panelSend.Controls.Add(labelSendingAmount);
|
||||
panelSend.Controls.Add(labelSendingTo);
|
||||
panelSend.Controls.Add(labelSendPrompt);
|
||||
panelSend.Location = new Point(1113, 42);
|
||||
panelSend.Controls.Add(labelHIPArrow);
|
||||
panelSend.Location = new Point(138, 33);
|
||||
panelSend.Name = "panelSend";
|
||||
panelSend.Size = new Size(974, 521);
|
||||
panelSend.TabIndex = 2;
|
||||
panelSend.Visible = false;
|
||||
//
|
||||
// labelSendingHIPAddress
|
||||
//
|
||||
labelSendingHIPAddress.AutoSize = true;
|
||||
labelSendingHIPAddress.Location = new Point(375, 130);
|
||||
labelSendingHIPAddress.Name = "labelSendingHIPAddress";
|
||||
labelSendingHIPAddress.Size = new Size(64, 15);
|
||||
labelSendingHIPAddress.TabIndex = 17;
|
||||
labelSendingHIPAddress.Text = "To Address";
|
||||
labelSendingHIPAddress.Visible = false;
|
||||
//
|
||||
// checkBoxSendSubFee
|
||||
//
|
||||
checkBoxSendSubFee.AutoSize = true;
|
||||
@@ -579,11 +632,11 @@ namespace FireWallet
|
||||
//
|
||||
labelSendingError.AutoSize = true;
|
||||
labelSendingError.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
labelSendingError.Location = new Point(615, 131);
|
||||
labelSendingError.Location = new Point(679, 130);
|
||||
labelSendingError.Name = "labelSendingError";
|
||||
labelSendingError.Size = new Size(52, 21);
|
||||
labelSendingError.Size = new Size(78, 21);
|
||||
labelSendingError.TabIndex = 13;
|
||||
labelSendingError.Text = "label1";
|
||||
labelSendingError.Text = "labelError";
|
||||
labelSendingError.Visible = false;
|
||||
//
|
||||
// labelSendingFee
|
||||
@@ -654,6 +707,17 @@ namespace FireWallet
|
||||
labelSendPrompt.TabIndex = 0;
|
||||
labelSendPrompt.Text = "Send HNS";
|
||||
//
|
||||
// labelHIPArrow
|
||||
//
|
||||
labelHIPArrow.AutoSize = true;
|
||||
labelHIPArrow.Font = new Font("Segoe UI", 18F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelHIPArrow.Location = new Point(346, 119);
|
||||
labelHIPArrow.Name = "labelHIPArrow";
|
||||
labelHIPArrow.Size = new Size(32, 32);
|
||||
labelHIPArrow.TabIndex = 18;
|
||||
labelHIPArrow.Text = "⮡ ";
|
||||
labelHIPArrow.Visible = false;
|
||||
//
|
||||
// panelRecieve
|
||||
//
|
||||
panelRecieve.Controls.Add(buttonAddressVerify);
|
||||
@@ -721,6 +785,8 @@ namespace FireWallet
|
||||
//
|
||||
// panelDomains
|
||||
//
|
||||
panelDomains.Controls.Add(labelDomainSort);
|
||||
panelDomains.Controls.Add(comboBoxDomainSort);
|
||||
panelDomains.Controls.Add(buttonRenewAll);
|
||||
panelDomains.Controls.Add(buttonExportDomains);
|
||||
panelDomains.Controls.Add(groupBoxDomains);
|
||||
@@ -732,6 +798,19 @@ namespace FireWallet
|
||||
panelDomains.TabIndex = 18;
|
||||
panelDomains.Visible = false;
|
||||
//
|
||||
// comboBoxDomainSort
|
||||
//
|
||||
comboBoxDomainSort.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboBoxDomainSort.FlatStyle = FlatStyle.Flat;
|
||||
comboBoxDomainSort.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
comboBoxDomainSort.FormattingEnabled = true;
|
||||
comboBoxDomainSort.Items.AddRange(new object[] { "Default", "Alphabetical", "Expiring", "Value" });
|
||||
comboBoxDomainSort.Location = new Point(686, 12);
|
||||
comboBoxDomainSort.Name = "comboBoxDomainSort";
|
||||
comboBoxDomainSort.Size = new Size(121, 29);
|
||||
comboBoxDomainSort.TabIndex = 11;
|
||||
comboBoxDomainSort.DropDownClosed += comboBoxDomainSort_DropDownClosed;
|
||||
//
|
||||
// buttonExportDomains
|
||||
//
|
||||
buttonExportDomains.FlatStyle = FlatStyle.Flat;
|
||||
@@ -792,7 +871,7 @@ namespace FireWallet
|
||||
panelSettings.Controls.Add(buttonSettingsSave);
|
||||
panelSettings.Controls.Add(groupBoxSettingsExplorer);
|
||||
panelSettings.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
panelSettings.Location = new Point(1065, 211);
|
||||
panelSettings.Location = new Point(1065, 51);
|
||||
panelSettings.Name = "panelSettings";
|
||||
panelSettings.Size = new Size(930, 550);
|
||||
panelSettings.TabIndex = 19;
|
||||
@@ -1002,19 +1081,29 @@ namespace FireWallet
|
||||
textBoxExTX.Size = new Size(307, 29);
|
||||
textBoxExTX.TabIndex = 1;
|
||||
//
|
||||
// labelDomainSort
|
||||
//
|
||||
labelDomainSort.AutoSize = true;
|
||||
labelDomainSort.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
labelDomainSort.Location = new Point(638, 15);
|
||||
labelDomainSort.Name = "labelDomainSort";
|
||||
labelDomainSort.Size = new Size(42, 21);
|
||||
labelDomainSort.TabIndex = 12;
|
||||
labelDomainSort.Text = "Sort:";
|
||||
//
|
||||
// MainForm
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(1152, 575);
|
||||
Controls.Add(panelDomains);
|
||||
Controls.Add(panelSend);
|
||||
Controls.Add(panelSettings);
|
||||
Controls.Add(panelaccount);
|
||||
Controls.Add(panelPortfolio);
|
||||
Controls.Add(panelRecieve);
|
||||
Controls.Add(panelDomains);
|
||||
Controls.Add(panelSend);
|
||||
Controls.Add(panelNav);
|
||||
Controls.Add(statusStripmain);
|
||||
Controls.Add(panelSettings);
|
||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||
Name = "MainForm";
|
||||
Opacity = 0D;
|
||||
@@ -1137,5 +1226,13 @@ namespace FireWallet
|
||||
private Button buttonRevealAll;
|
||||
private Button buttonExportDomains;
|
||||
private Button buttonRenewAll;
|
||||
private ToolStripDropDownButton toolStripDropDownButtonHelp;
|
||||
private ToolStripMenuItem githubToolStripMenuItem;
|
||||
private ToolStripMenuItem websiteToolStripMenuItem;
|
||||
private ToolStripMenuItem supportDiscordServerToolStripMenuItem;
|
||||
private Label labelHIPArrow;
|
||||
private Label labelSendingHIPAddress;
|
||||
private ComboBox comboBoxDomainSort;
|
||||
private Label labelDomainSort;
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,11 @@ using System.Text;
|
||||
using System.Security.Policy;
|
||||
using System.Windows.Forms;
|
||||
using System.Net;
|
||||
using DnsClient;
|
||||
using DnsClient.Protocol;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Net.Security;
|
||||
using System.Numerics;
|
||||
|
||||
namespace FireWallet
|
||||
{
|
||||
@@ -48,6 +53,14 @@ namespace FireWallet
|
||||
timerNodeStatus.Stop();
|
||||
LoadSettings();
|
||||
UpdateTheme();
|
||||
// Theme drop down
|
||||
foreach (ToolStripMenuItem c in toolStripDropDownButtonHelp.DropDownItems)
|
||||
{
|
||||
c.ForeColor = ColorTranslator.FromHtml(theme["foreground"]);
|
||||
c.BackColor = ColorTranslator.FromHtml(theme["background"]);
|
||||
}
|
||||
toolStripDropDownButtonHelp.DropDown.BackColor = ColorTranslator.FromHtml(theme["background"]);
|
||||
|
||||
if (await LoadNode() != true) this.Close();
|
||||
|
||||
|
||||
@@ -183,27 +196,58 @@ namespace FireWallet
|
||||
AddLog("Starting HSD");
|
||||
toolStripStatusLabelstatus.Text = "Status: HSD Starting";
|
||||
|
||||
if (!Directory.Exists(dir + "hsd"))
|
||||
string hsdPath = dir + "hsd\\bin\\hsd.exe";
|
||||
if (nodeSettings.ContainsKey("HSD-command"))
|
||||
{
|
||||
NotifyForm Notifyinstall = new NotifyForm("Installing hsd\nThis may take a few minutes\nDo not close FireWallet", false);
|
||||
Notifyinstall.Show();
|
||||
// Wait for the notification to show
|
||||
await Task.Delay(1000);
|
||||
if (nodeSettings["HSD-command"].Contains("{default-dir}"))
|
||||
{
|
||||
if (!Directory.Exists(dir + "hsd"))
|
||||
{
|
||||
NotifyForm Notifyinstall = new NotifyForm("Installing hsd\nThis may take a few minutes\nDo not close FireWallet", false);
|
||||
Notifyinstall.Show();
|
||||
// Wait for the notification to show
|
||||
await Task.Delay(1000);
|
||||
|
||||
string repositoryUrl = "https://github.com/handshake-org/hsd.git";
|
||||
string destinationPath = dir + "hsd";
|
||||
CloneRepository(repositoryUrl, destinationPath);
|
||||
string repositoryUrl = "https://github.com/handshake-org/hsd.git";
|
||||
string destinationPath = dir + "hsd";
|
||||
CloneRepository(repositoryUrl, destinationPath);
|
||||
|
||||
Notifyinstall.CloseNotification();
|
||||
Notifyinstall.Dispose();
|
||||
}
|
||||
if (!Directory.Exists(dir + "hsd\\node_modules"))
|
||||
Notifyinstall.CloseNotification();
|
||||
Notifyinstall.Dispose();
|
||||
}
|
||||
if (!Directory.Exists(dir + "hsd\\node_modules"))
|
||||
{
|
||||
AddLog("HSD install failed");
|
||||
this.Close();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
AddLog("HSD install failed");
|
||||
this.Close();
|
||||
return false;
|
||||
if (!Directory.Exists(dir + "hsd"))
|
||||
{
|
||||
NotifyForm Notifyinstall = new NotifyForm("Installing hsd\nThis may take a few minutes\nDo not close FireWallet", false);
|
||||
Notifyinstall.Show();
|
||||
// Wait for the notification to show
|
||||
await Task.Delay(1000);
|
||||
|
||||
string repositoryUrl = "https://github.com/handshake-org/hsd.git";
|
||||
string destinationPath = dir + "hsd";
|
||||
CloneRepository(repositoryUrl, destinationPath);
|
||||
|
||||
Notifyinstall.CloseNotification();
|
||||
Notifyinstall.Dispose();
|
||||
}
|
||||
if (!Directory.Exists(dir + "hsd\\node_modules"))
|
||||
{
|
||||
AddLog("HSD install failed");
|
||||
this.Close();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
hsdProcess = new Process();
|
||||
|
||||
bool hideScreen = true;
|
||||
@@ -221,7 +265,8 @@ namespace FireWallet
|
||||
if (hideScreen)
|
||||
{
|
||||
hsdProcess.StartInfo.RedirectStandardError = true;
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
hsdProcess.StartInfo.RedirectStandardError = false;
|
||||
}
|
||||
@@ -230,13 +275,41 @@ namespace FireWallet
|
||||
hsdProcess.StartInfo.RedirectStandardOutput = false;
|
||||
hsdProcess.StartInfo.UseShellExecute = false;
|
||||
hsdProcess.StartInfo.FileName = "node.exe";
|
||||
hsdProcess.StartInfo.Arguments = dir + "hsd/bin/hsd --agent=FireWallet --index-tx --index-address --api-key " + nodeSettings["Key"];
|
||||
|
||||
string bobPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Bob\\hsd_data";
|
||||
if (Directory.Exists(bobPath))
|
||||
if (nodeSettings.ContainsKey("HSD-command"))
|
||||
{
|
||||
hsdProcess.StartInfo.Arguments = hsdProcess.StartInfo.Arguments + " --prefix " + bobPath;
|
||||
AddLog("Using custom HSD command");
|
||||
string command = nodeSettings["HSD-command"];
|
||||
command = command.Replace("{default-dir}", dir + "hsd\\bin\\hsd");
|
||||
|
||||
string bobPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Bob\\hsd_data";
|
||||
if (Directory.Exists(bobPath))
|
||||
{
|
||||
command = command.Replace("{Bob}", bobPath);
|
||||
}
|
||||
else if (command.Contains("{Bob}"))
|
||||
{
|
||||
AddLog("Bob not found, using default HSD command");
|
||||
command = dir + "hsd\\bin\\hsd --agent=FireWallet --index-tx --index-address --api-key " + nodeSettings["Key"];
|
||||
}
|
||||
|
||||
command = command.Replace("{key}", nodeSettings["Key"]);
|
||||
hsdProcess.StartInfo.Arguments = command;
|
||||
}
|
||||
else
|
||||
{
|
||||
AddLog("Using default HSD command");
|
||||
hsdProcess.StartInfo.Arguments = dir + "hsd\\bin\\hsd --agent=FireWallet --index-tx --index-address --api-key " + nodeSettings["Key"];
|
||||
string bobPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Bob\\hsd_data";
|
||||
if (Directory.Exists(bobPath))
|
||||
{
|
||||
hsdProcess.StartInfo.Arguments = hsdProcess.StartInfo.Arguments + " --prefix " + bobPath;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
hsdProcess.Start();
|
||||
// Wait for HSD to start
|
||||
await Task.Delay(2000);
|
||||
@@ -307,6 +380,18 @@ namespace FireWallet
|
||||
public void AddLog(string message)
|
||||
{
|
||||
if (message.Contains("Get Error: No connection could be made because the target machine actively refused it")) return;
|
||||
|
||||
// If file size is over 1MB, rename it to old.log.txt
|
||||
if (File.Exists(dir + "log.txt"))
|
||||
{
|
||||
FileInfo fi = new FileInfo(dir + "log.txt");
|
||||
if (fi.Length > 1000000)
|
||||
{
|
||||
if (File.Exists(dir + "old.log.txt")) File.Delete(dir + "old.log.txt"); // Delete old log file as it is super old
|
||||
File.Move(dir + "log.txt", dir + "old.log.txt");
|
||||
}
|
||||
}
|
||||
|
||||
StreamWriter sw = new StreamWriter(dir + "log.txt", true);
|
||||
sw.WriteLine(DateTime.Now.ToString() + ": " + message);
|
||||
sw.Dispose();
|
||||
@@ -601,11 +686,17 @@ namespace FireWallet
|
||||
watchOnly = true;
|
||||
toolStripStatusLabelLedger.Text = "Cold Wallet";
|
||||
toolStripStatusLabelLedger.Visible = true;
|
||||
buttonRevealAll.Visible = false;
|
||||
buttonSeed.Enabled = false;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
watchOnly = false;
|
||||
toolStripStatusLabelLedger.Visible = false;
|
||||
buttonRevealAll.Visible = true;
|
||||
buttonSeed.Enabled = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -776,7 +867,6 @@ namespace FireWallet
|
||||
{
|
||||
AddLog("Post Error: " + ex.Message);
|
||||
AddLog(await resp.Content.ReadAsStringAsync());
|
||||
AddLog("Content: " + content);
|
||||
return "Error";
|
||||
}
|
||||
|
||||
@@ -866,7 +956,7 @@ namespace FireWallet
|
||||
|
||||
|
||||
// Check how many TX there are
|
||||
APIresponse = await APIGet("wallet/"+ account,true);
|
||||
APIresponse = await APIGet("wallet/" + account, true);
|
||||
JObject wallet = JObject.Parse(APIresponse);
|
||||
if (!wallet.ContainsKey("balance"))
|
||||
{
|
||||
@@ -883,7 +973,14 @@ namespace FireWallet
|
||||
int toSkip = TotalTX - toGet;
|
||||
|
||||
// GET TXs
|
||||
APIresponse = await APIPost("", true, "{\"method\": \"listtransactions\",\"params\": [\"default\"," +toGet+","+ toSkip+ "]}");
|
||||
if (watchOnly)
|
||||
{
|
||||
APIresponse = await APIPost("", true, "{\"method\": \"listtransactions\",\"params\": [\"default\"," + toGet + "," + toSkip + ", true]}");
|
||||
}
|
||||
else
|
||||
{
|
||||
APIresponse = await APIPost("", true, "{\"method\": \"listtransactions\",\"params\": [\"default\"," + toGet + "," + toSkip + "]}");
|
||||
}
|
||||
|
||||
if (APIresponse == "Error")
|
||||
{
|
||||
@@ -901,6 +998,7 @@ namespace FireWallet
|
||||
}
|
||||
|
||||
JArray txs = JArray.Parse(TXGET["result"].ToString());
|
||||
if (toGet > txs.Count) toGet = txs.Count; // In case there are less TXs than expected (usually happens when the get TX's fails)
|
||||
Control[] tmpControls = new Control[toGet];
|
||||
for (int i = 0; i < toGet; i++)
|
||||
{
|
||||
@@ -958,7 +1056,7 @@ namespace FireWallet
|
||||
int inputCount = inputs.Count;
|
||||
int outputCount = outputs.Count;
|
||||
|
||||
int costHNS = int.Parse(txs[toGet - i - 1]["amount"].ToString());
|
||||
decimal costHNS = decimal.Parse(txs[toGet - i - 1]["amount"].ToString());
|
||||
string cost = "";
|
||||
if (costHNS < 0)
|
||||
{
|
||||
@@ -1014,17 +1112,17 @@ namespace FireWallet
|
||||
{
|
||||
try
|
||||
{
|
||||
string response = await APIGet("fee", false);
|
||||
string response = await APIPost("", false, "{\"method\": \"estimatefee\",\"params\": [ 3 ]}");
|
||||
JObject resp = JObject.Parse(response);
|
||||
decimal fee = Convert.ToDecimal(resp["rate"].ToString());
|
||||
fee = fee / 1000000;
|
||||
if (fee < 0.0001m) fee = 1;
|
||||
string result = resp["result"].ToString();
|
||||
decimal fee = decimal.Parse(result);
|
||||
if (fee < 0.001m) fee = 1;
|
||||
|
||||
return fee.ToString();
|
||||
//return resp["rate"].ToString();
|
||||
}
|
||||
catch
|
||||
{
|
||||
AddLog("GetFee Error");
|
||||
return "1";
|
||||
}
|
||||
}
|
||||
@@ -1090,6 +1188,7 @@ namespace FireWallet
|
||||
labelSendingMax.Text = "Max: " + balance.ToString() + " HNS";
|
||||
textBoxSendingTo.Focus();
|
||||
string fee = await GetFee();
|
||||
|
||||
labelSendingFee.Text = "Est. Fee: " + fee + " HNS";
|
||||
labelSendingError.Hide();
|
||||
|
||||
@@ -1141,6 +1240,8 @@ namespace FireWallet
|
||||
groupBoxDomains.Width = panelDomains.Width - 20;
|
||||
groupBoxDomains.Left = 10;
|
||||
groupBoxDomains.Height = panelDomains.Height - groupBoxDomains.Top - 10;
|
||||
comboBoxDomainSort.SelectedIndex = 0;
|
||||
|
||||
UpdateDomains();
|
||||
|
||||
}
|
||||
@@ -1172,6 +1273,7 @@ namespace FireWallet
|
||||
}
|
||||
|
||||
panelSettings.Show();
|
||||
panelSettings.Dock = DockStyle.Fill;
|
||||
buttonSettingsSave.Top = panelSettings.Height - buttonSettingsSave.Height - 10;
|
||||
labelSettingsSaved.Top = buttonSettingsSave.Top + 10;
|
||||
textBoxExTX.Text = userSettings["explorer-tx"];
|
||||
@@ -1184,14 +1286,96 @@ namespace FireWallet
|
||||
}
|
||||
#endregion
|
||||
#region Send
|
||||
|
||||
// Store TLSA hash
|
||||
public string TLSA { get; set; }
|
||||
private async void textBoxSendingTo_Leave(object sender, EventArgs e)
|
||||
{
|
||||
labelSendingError.Hide();
|
||||
labelHIPArrow.Hide();
|
||||
labelSendingHIPAddress.Hide();
|
||||
if (textBoxSendingTo.Text == "") return;
|
||||
if (textBoxSendingTo.Text.Substring(0, 1) == "@")
|
||||
{
|
||||
labelSendingError.Show();
|
||||
labelSendingError.Text = "HIP-02 Not supported yet";
|
||||
return;
|
||||
string domain = textBoxSendingTo.Text.Substring(1);
|
||||
|
||||
try
|
||||
{
|
||||
IPAddress iPAddress = null;
|
||||
TLSA = "";
|
||||
|
||||
|
||||
// Create an instance of LookupClient using the custom options
|
||||
NameServer nameServer = new NameServer(IPAddress.Parse("127.0.0.1"), 5350);
|
||||
var options = new LookupClientOptions(nameServer);
|
||||
options.EnableAuditTrail = true;
|
||||
options.UseTcpOnly = true;
|
||||
options.Recursion = true;
|
||||
options.UseCache = false;
|
||||
options.RequestDnsSecRecords = true;
|
||||
options.Timeout = TimeSpan.FromSeconds(5);
|
||||
|
||||
|
||||
var client = new LookupClient(options);
|
||||
|
||||
|
||||
// Perform the DNS lookup for the specified domain using DNSSec
|
||||
|
||||
var result = client.Query(domain, QueryType.A);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Display the DNS lookup results
|
||||
foreach (var record in result.Answers.OfType<ARecord>())
|
||||
{
|
||||
iPAddress = record.Address;
|
||||
}
|
||||
|
||||
if (iPAddress == null)
|
||||
{
|
||||
labelSendingError.Show();
|
||||
labelSendingError.Text = "HIP-02 lookup failed";
|
||||
return;
|
||||
}
|
||||
|
||||
// Get TLSA record
|
||||
var resultTLSA = client.Query("_443._tcp." + domain, QueryType.TLSA);
|
||||
foreach (var record in resultTLSA.Answers.OfType<TlsaRecord>())
|
||||
{
|
||||
TLSA = record.CertificateAssociationDataAsString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
string url = "https://" + iPAddress.ToString() + "/.well-known/wallets/HNS";
|
||||
var handler = new HttpClientHandler();
|
||||
|
||||
handler.ServerCertificateCustomValidationCallback = ValidateServerCertificate;
|
||||
|
||||
// Create an instance of HttpClient with the custom handler
|
||||
using (var httpclient = new HttpClient(handler))
|
||||
{
|
||||
httpclient.DefaultRequestHeaders.Add("Host", domain);
|
||||
// Send a GET request to the specified URL
|
||||
HttpResponseMessage response = httpclient.GetAsync(url).Result;
|
||||
|
||||
// Response
|
||||
string address = response.Content.ReadAsStringAsync().Result;
|
||||
|
||||
labelSendingHIPAddress.Text = address;
|
||||
labelSendingHIPAddress.Show();
|
||||
labelHIPArrow.Show();
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AddLog(ex.Message);
|
||||
labelSendingError.Show();
|
||||
labelSendingError.Text = "HIP-02 lookup failed";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1216,6 +1400,46 @@ namespace FireWallet
|
||||
}
|
||||
}
|
||||
}
|
||||
public bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
||||
{
|
||||
// Customize the certificate validation logic here if needed
|
||||
|
||||
// Return true to accept the certificate or false to reject it
|
||||
X509Certificate2 cert2 = new X509Certificate2(certificate);
|
||||
|
||||
|
||||
var rsaPublicKey = (RSA)cert2.PublicKey.Key;
|
||||
|
||||
// Calculate the SHA-256 hash of the public key
|
||||
using (var sha256 = SHA256.Create())
|
||||
{
|
||||
byte[] publicKeyBytes = rsaPublicKey.ExportSubjectPublicKeyInfo();
|
||||
byte[] publicKeyHash = sha256.ComputeHash(publicKeyBytes);
|
||||
|
||||
// Convert the hash value to hexadecimal format
|
||||
string hexFingerprint = ByteArrayToHexString(publicKeyHash);
|
||||
|
||||
if (hexFingerprint == TLSA)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AddLog("TLSA mismatch");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
static string ByteArrayToHexString(byte[] bytes)
|
||||
{
|
||||
StringBuilder hex = new StringBuilder(bytes.Length * 2);
|
||||
foreach (byte b in bytes)
|
||||
{
|
||||
hex.AppendFormat("{0:X2}", b);
|
||||
}
|
||||
return hex.ToString();
|
||||
}
|
||||
|
||||
private void textBoxSendingAmount_Leave(object sender, EventArgs e)
|
||||
{
|
||||
decimal amount = 0;
|
||||
@@ -1243,6 +1467,10 @@ namespace FireWallet
|
||||
try
|
||||
{
|
||||
string address = textBoxSendingTo.Text;
|
||||
if (labelHIPArrow.Visible)
|
||||
{
|
||||
address = labelSendingHIPAddress.Text;
|
||||
}
|
||||
bool valid = await ValidAddress(address);
|
||||
if (!valid)
|
||||
{
|
||||
@@ -1424,7 +1652,7 @@ namespace FireWallet
|
||||
if (!outputInstalled.Contains("git version"))
|
||||
{
|
||||
AddLog("Git is not installed");
|
||||
NotifyForm 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");
|
||||
notifyForm.ShowDialog();
|
||||
notifyForm.Dispose();
|
||||
this.Close();
|
||||
@@ -1446,7 +1674,7 @@ namespace FireWallet
|
||||
if (!outputInstalled.Contains("v"))
|
||||
{
|
||||
AddLog("Node is not installed");
|
||||
NotifyForm 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");
|
||||
notifyForm.ShowDialog();
|
||||
notifyForm.Dispose();
|
||||
this.Close();
|
||||
@@ -1472,7 +1700,7 @@ namespace FireWallet
|
||||
{
|
||||
AddLog("NPM is not installed");
|
||||
AddLog(outputInstalled);
|
||||
NotifyForm 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");
|
||||
notifyForm.ShowDialog();
|
||||
notifyForm.Dispose();
|
||||
this.Close();
|
||||
@@ -1658,6 +1886,33 @@ namespace FireWallet
|
||||
int i = 0;
|
||||
int renewable = 0;
|
||||
panelDomainList.Controls.Clear();
|
||||
|
||||
// Sort the domains
|
||||
switch (comboBoxDomainSort.Text)
|
||||
{
|
||||
case "Default":
|
||||
break;
|
||||
case "Alphabetical":
|
||||
names = new JArray(names.OrderBy(obj => (string)obj["name"]));
|
||||
break;
|
||||
case "Expiring":
|
||||
names = new JArray(names.OrderBy(obj =>
|
||||
{
|
||||
JToken daysUntilExpireToken = obj["stats"]?["daysUntilExpire"];
|
||||
return (int)(daysUntilExpireToken ?? int.MaxValue);
|
||||
}));
|
||||
break;
|
||||
case "Value":
|
||||
// Sort by most valuable first
|
||||
names = new JArray(names.OrderByDescending(obj =>
|
||||
{
|
||||
JToken valueToken = obj?["value"];
|
||||
return (int)(valueToken ?? 0);
|
||||
}));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
foreach (JObject name in names)
|
||||
{
|
||||
Domains[i] = name["name"].ToString();
|
||||
@@ -1677,7 +1932,8 @@ namespace FireWallet
|
||||
|
||||
domainTMP.Controls.Add(domainName);
|
||||
|
||||
if (!name.ContainsKey("stats")) {
|
||||
if (!name.ContainsKey("stats"))
|
||||
{
|
||||
AddLog("Domain " + Domains[i] + " does not have stats");
|
||||
continue;
|
||||
}
|
||||
@@ -1716,8 +1972,8 @@ namespace FireWallet
|
||||
|
||||
foreach (Control c in domainTMP.Controls)
|
||||
{
|
||||
c.Click += new EventHandler((sender, e) =>
|
||||
{
|
||||
c.Click += new EventHandler((sender, e) =>
|
||||
{
|
||||
DomainForm domainForm = new DomainForm(this, name["name"].ToString(), userSettings["explorer-tx"], userSettings["explorer-domain"]);
|
||||
domainForm.Show();
|
||||
});
|
||||
@@ -1741,7 +1997,7 @@ namespace FireWallet
|
||||
return;
|
||||
}
|
||||
JObject resp = JObject.Parse(response);
|
||||
if (resp["error"] != null)
|
||||
if (resp["error"].ToString() != "")
|
||||
{
|
||||
AddLog("Error sending reveal");
|
||||
AddLog(resp["error"].ToString());
|
||||
@@ -1778,6 +2034,43 @@ namespace FireWallet
|
||||
domainSearch = Regex.Replace(textBoxDomainSearch.Text, "[^a-zA-Z0-9-_]", "");
|
||||
textBoxDomainSearch.Text = domainSearch;
|
||||
}
|
||||
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");
|
||||
}
|
||||
}
|
||||
private void comboBoxDomainSort_DropDownClosed(object sender, EventArgs e)
|
||||
{
|
||||
UpdateDomains();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
#region Batching
|
||||
@@ -1884,6 +2177,8 @@ namespace FireWallet
|
||||
|
||||
try
|
||||
{
|
||||
AddLog("Decrypting seed...");
|
||||
AddLog(resp.ToString());
|
||||
string iv = resp["iv"].ToString();
|
||||
string ciphertext = resp["ciphertext"].ToString();
|
||||
string tmpn = resp["n"].ToString();
|
||||
@@ -1892,9 +2187,26 @@ namespace FireWallet
|
||||
|
||||
int n = int.Parse(tmpn);
|
||||
int p = int.Parse(tmpp);
|
||||
int r = int.Parse(tmpr);
|
||||
|
||||
int iterations = n;
|
||||
|
||||
byte[] decripted = await Decrypt_Seed(algorithm, ciphertext, iv, n,r,p);
|
||||
|
||||
|
||||
// This is returning garbled text
|
||||
AddLog("Seed decrypted");
|
||||
string phrase = Encoding.UTF8.GetString(decripted);
|
||||
AddLog("Your seed phrase is:\n" + phrase);
|
||||
|
||||
phrase = Encoding.ASCII.GetString(decripted);
|
||||
AddLog("Your seed phrase is:\n" + phrase);
|
||||
|
||||
phrase = Encoding.Unicode.GetString(decripted);
|
||||
AddLog("Your seed phrase is:\n" + phrase);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1909,7 +2221,71 @@ namespace FireWallet
|
||||
|
||||
}
|
||||
}
|
||||
private async Task<byte[]> Decrypt_Seed(string algorithm, string ciphertext, string iv, int n,int r, int p)
|
||||
{
|
||||
byte[] salt = Encoding.ASCII.GetBytes("hsd");
|
||||
using (AesManaged aes = new AesManaged())
|
||||
{
|
||||
aes.Key = DeriveKey(algorithm, password, salt, n, r, p);
|
||||
aes.IV = HexStringToByteArray(iv);
|
||||
aes.Mode = CipherMode.CBC;
|
||||
aes.Padding = PaddingMode.None;
|
||||
byte[] cipher = HexStringToByteArray(ciphertext);
|
||||
|
||||
if (cipher.Length % 16 != 0)
|
||||
{
|
||||
AddLog("Invalid cipher length");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
using (ICryptoTransform decryptor = aes.CreateDecryptor())
|
||||
{
|
||||
byte[] decrypted = decryptor.TransformFinalBlock(cipher, 0, cipher.Length);
|
||||
return decrypted;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
static byte[] HexStringToByteArray(string hex)
|
||||
{
|
||||
int numberChars = hex.Length / 2;
|
||||
byte[] bytes = new byte[numberChars];
|
||||
for (int i = 0; i < numberChars; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
byte[] DeriveKey(string algorithm, string passphrase, byte[] salt, int n, int r, int p)
|
||||
{
|
||||
byte[] passwordBytes = Encoding.UTF8.GetBytes(passphrase);
|
||||
|
||||
switch (algorithm)
|
||||
{
|
||||
case "pbkdf2":
|
||||
return Pbkdf2DeriveKey(passwordBytes, salt, n, 32);
|
||||
case "scrypt":
|
||||
return ScryptDeriveKey(passwordBytes, salt, n, r, p, 32);
|
||||
default:
|
||||
throw new Exception($"Unknown algorithm: {algorithm}.");
|
||||
}
|
||||
}
|
||||
static byte[] Pbkdf2DeriveKey(byte[] password, byte[] salt, int iterations, int derivedKeyLength)
|
||||
{
|
||||
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations))
|
||||
{
|
||||
return pbkdf2.GetBytes(derivedKeyLength);
|
||||
}
|
||||
}
|
||||
static byte[] ScryptDeriveKey(byte[] password, byte[] salt, int costParameterN, int costParameterR, int costParameterP, int derivedKeyLength)
|
||||
{
|
||||
using (var rfc2898 = new Rfc2898DeriveBytes(password, salt, costParameterN, HashAlgorithmName.SHA256))
|
||||
{
|
||||
return rfc2898.GetBytes(derivedKeyLength);
|
||||
}
|
||||
}
|
||||
private async void Rescan_Click(object sender, EventArgs e)
|
||||
{
|
||||
string content = "{\"height\": 0}";
|
||||
@@ -1925,37 +2301,37 @@ namespace FireWallet
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void export_Click(object sender, EventArgs e)
|
||||
#region Help Menu
|
||||
private void githubToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
SaveFileDialog saveFileDialog = new SaveFileDialog();
|
||||
saveFileDialog.Filter = "CSV file (*.csv)|*.csv";
|
||||
saveFileDialog.Title = "Export";
|
||||
if (saveFileDialog.ShowDialog() == DialogResult.OK)
|
||||
// Open the GitHub page
|
||||
ProcessStartInfo psi = new ProcessStartInfo
|
||||
{
|
||||
StreamWriter sw = new StreamWriter(saveFileDialog.FileName);
|
||||
foreach (string domain in DomainsRenewable)
|
||||
{
|
||||
if (domain == null) break;
|
||||
sw.WriteLine(domain);
|
||||
}
|
||||
sw.Dispose();
|
||||
}
|
||||
FileName = "https://github.com/Nathanwoodburn/FireWallet/",
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(psi);
|
||||
}
|
||||
|
||||
private void buttonRenewAll_Click(object sender, EventArgs e)
|
||||
private void websiteToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (DomainsRenewable == null)
|
||||
ProcessStartInfo psi = new ProcessStartInfo
|
||||
{
|
||||
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");
|
||||
}
|
||||
FileName = "https://firewallet",
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(psi);
|
||||
}
|
||||
|
||||
private void supportDiscordServerToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
ProcessStartInfo psi = new ProcessStartInfo
|
||||
{
|
||||
FileName = "https://l.woodburn.au/discord",
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(psi);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -120,10 +120,19 @@
|
||||
<metadata name="statusStripmain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>133, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="toolStripDropDownButtonHelp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACRSURBVDhPY/j27dt/SjDYACcnJ7IwigEf3n8kCZNswPNb
|
||||
J/+f6DYF0yA+yQac6Db5f6hWCmwIiE+mC0wIu2DS2Vf/F1x6DefjwlgNyNr34r/0wkdgTMgQDAOQNRNj
|
||||
CIoBOg0rMTTDMLIhIHbriZeYBmDTiIxBGkEYxge5liQDsGGQqykyAISpZwAlmIEywMAAAAc1/Jwvt6sN
|
||||
AAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="timerNodeStatus.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>269, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAEAAAAAAAEAIAB2pAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAOEAAADAAgGAAAAfG+p9QAAIABJ
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace FireWallet
|
||||
|
||||
panelInputs.Controls.Add(PanelInput);
|
||||
}
|
||||
|
||||
panelInputs.Visible = true;
|
||||
// For each output
|
||||
JArray outputs = (JArray)tx["outputs"];
|
||||
foreach (JObject output in outputs)
|
||||
@@ -136,8 +136,6 @@ namespace FireWallet
|
||||
|
||||
panelOutputs.Controls.Add(PanelOutput);
|
||||
}
|
||||
|
||||
panelInputs.Visible = true;
|
||||
panelOutputs.Visible = true;
|
||||
}
|
||||
|
||||
|
||||
29
FireWallet/TransferForm.Designer.cs
generated
29
FireWallet/TransferForm.Designer.cs
generated
@@ -36,6 +36,8 @@
|
||||
label2 = new Label();
|
||||
textBoxAddress = new TextBox();
|
||||
labelError = new Label();
|
||||
labelSendingHIPAddress = new Label();
|
||||
labelHIPArrow = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// buttonTransfer
|
||||
@@ -105,18 +107,41 @@
|
||||
// labelError
|
||||
//
|
||||
labelError.AutoSize = true;
|
||||
labelError.Location = new Point(46, 139);
|
||||
labelError.Location = new Point(492, 139);
|
||||
labelError.Name = "labelError";
|
||||
labelError.Size = new Size(98, 15);
|
||||
labelError.TabIndex = 6;
|
||||
labelError.Text = "Address not valid";
|
||||
labelError.Visible = false;
|
||||
//
|
||||
// labelSendingHIPAddress
|
||||
//
|
||||
labelSendingHIPAddress.AutoSize = true;
|
||||
labelSendingHIPAddress.Location = new Point(75, 150);
|
||||
labelSendingHIPAddress.Name = "labelSendingHIPAddress";
|
||||
labelSendingHIPAddress.Size = new Size(64, 15);
|
||||
labelSendingHIPAddress.TabIndex = 19;
|
||||
labelSendingHIPAddress.Text = "To Address";
|
||||
labelSendingHIPAddress.Visible = false;
|
||||
//
|
||||
// labelHIPArrow
|
||||
//
|
||||
labelHIPArrow.AutoSize = true;
|
||||
labelHIPArrow.Font = new Font("Segoe UI", 18F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelHIPArrow.Location = new Point(46, 139);
|
||||
labelHIPArrow.Name = "labelHIPArrow";
|
||||
labelHIPArrow.Size = new Size(32, 32);
|
||||
labelHIPArrow.TabIndex = 20;
|
||||
labelHIPArrow.Text = "⮡ ";
|
||||
labelHIPArrow.Visible = false;
|
||||
//
|
||||
// TransferForm
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(602, 340);
|
||||
Controls.Add(labelSendingHIPAddress);
|
||||
Controls.Add(labelHIPArrow);
|
||||
Controls.Add(labelError);
|
||||
Controls.Add(textBoxAddress);
|
||||
Controls.Add(label2);
|
||||
@@ -143,5 +168,7 @@
|
||||
private Label label2;
|
||||
private TextBox textBoxAddress;
|
||||
private Label labelError;
|
||||
private Label labelSendingHIPAddress;
|
||||
private Label labelHIPArrow;
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,8 @@ using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using DnsClient.Protocol;
|
||||
using DnsClient;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace FireWallet
|
||||
@@ -46,16 +48,19 @@ namespace FireWallet
|
||||
this.Close();
|
||||
}
|
||||
|
||||
string address = "";
|
||||
private async void buttonTransfer_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!await MainForm.ValidAddress(textBoxAddress.Text))
|
||||
updateAddress();
|
||||
|
||||
if (!await MainForm.ValidAddress(address))
|
||||
{
|
||||
labelError.Show();
|
||||
return;
|
||||
}
|
||||
|
||||
string content = "{\"method\": \"sendtransfer\",\"params\": [ \"" + Domain + "\", \"" +
|
||||
textBoxAddress.Text + "\"]}";
|
||||
address + "\"]}";
|
||||
string output = await MainForm.APIPost("", true, content);
|
||||
JObject APIresp = JObject.Parse(output);
|
||||
if (APIresp["error"].ToString() != "")
|
||||
@@ -78,14 +83,113 @@ namespace FireWallet
|
||||
|
||||
private async void buttonBatch_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!await MainForm.ValidAddress(textBoxAddress.Text))
|
||||
updateAddress();
|
||||
|
||||
if (!await MainForm.ValidAddress(address))
|
||||
{
|
||||
labelError.Show();
|
||||
return;
|
||||
}
|
||||
|
||||
MainForm.AddBatch(Domain, "TRANSFER", textBoxAddress.Text);
|
||||
MainForm.AddBatch(Domain, "TRANSFER", address);
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void updateAddress()
|
||||
{
|
||||
labelError.Hide();
|
||||
|
||||
if (textBoxAddress.Text.Length < 1)
|
||||
{
|
||||
address = "";
|
||||
return;
|
||||
}
|
||||
if (textBoxAddress.Text.Substring(0, 1) == "@")
|
||||
{
|
||||
string domain = textBoxAddress.Text.Substring(1);
|
||||
|
||||
try
|
||||
{
|
||||
IPAddress iPAddress = null;
|
||||
|
||||
|
||||
// Create an instance of LookupClient using the custom options
|
||||
NameServer nameServer = new NameServer(IPAddress.Parse("127.0.0.1"), 5350);
|
||||
var options = new LookupClientOptions(nameServer);
|
||||
options.EnableAuditTrail = true;
|
||||
options.UseTcpOnly = true;
|
||||
options.Recursion = true;
|
||||
options.UseCache = false;
|
||||
options.RequestDnsSecRecords = true;
|
||||
options.Timeout = TimeSpan.FromSeconds(5);
|
||||
|
||||
|
||||
var client = new LookupClient(options);
|
||||
|
||||
|
||||
// Perform the DNS lookup for the specified domain using DNSSec
|
||||
|
||||
var result = client.Query(domain, QueryType.A);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Display the DNS lookup results
|
||||
foreach (var record in result.Answers.OfType<ARecord>())
|
||||
{
|
||||
iPAddress = record.Address;
|
||||
}
|
||||
|
||||
if (iPAddress == null)
|
||||
{
|
||||
labelError.Show();
|
||||
labelError.Text = "HIP-02 lookup failed";
|
||||
return;
|
||||
}
|
||||
|
||||
// Get TLSA record
|
||||
var resultTLSA = client.Query("_443._tcp." + domain, QueryType.TLSA);
|
||||
foreach (var record in resultTLSA.Answers.OfType<TlsaRecord>())
|
||||
{
|
||||
MainForm.TLSA = record.CertificateAssociationDataAsString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
string url = "https://" + iPAddress.ToString() + "/.well-known/wallets/HNS";
|
||||
var handler = new HttpClientHandler();
|
||||
|
||||
handler.ServerCertificateCustomValidationCallback = MainForm.ValidateServerCertificate;
|
||||
|
||||
// Create an instance of HttpClient with the custom handler
|
||||
using (var httpclient = new HttpClient(handler))
|
||||
{
|
||||
httpclient.DefaultRequestHeaders.Add("Host", domain);
|
||||
// Send a GET request to the specified URL
|
||||
HttpResponseMessage response = httpclient.GetAsync(url).Result;
|
||||
|
||||
// Response
|
||||
string address = response.Content.ReadAsStringAsync().Result;
|
||||
|
||||
labelSendingHIPAddress.Text = address;
|
||||
this.address = address;
|
||||
labelSendingHIPAddress.Show();
|
||||
labelHIPArrow.Show();
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MainForm.AddLog(ex.Message);
|
||||
labelError.Show();
|
||||
labelError.Text = "HIP-02 lookup failed";
|
||||
}
|
||||
} else
|
||||
{
|
||||
address = textBoxAddress.Text;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,15 +224,15 @@
|
||||
{
|
||||
"Name" = "8:Microsoft Visual Studio"
|
||||
"ProductName" = "8:FireWallet"
|
||||
"ProductCode" = "8:{CA9B8BF8-C03C-4C1F-BF5E-768B5897DB34}"
|
||||
"PackageCode" = "8:{A830408F-C770-4E8D-BEE3-22D4736728B5}"
|
||||
"ProductCode" = "8:{460D8F86-4FE9-4547-9B17-7E01ACBF9194}"
|
||||
"PackageCode" = "8:{A6678F97-9CE8-4005-82AC-AB2D09A9DA27}"
|
||||
"UpgradeCode" = "8:{0C86F725-6B01-4173-AA05-3F0EDF481362}"
|
||||
"AspNetVersion" = "8:"
|
||||
"RestartWWWService" = "11:FALSE"
|
||||
"RemovePreviousVersions" = "11:TRUE"
|
||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||
"InstallAllUsers" = "11:FALSE"
|
||||
"ProductVersion" = "8:2.6"
|
||||
"ProductVersion" = "8:3.1"
|
||||
"Manufacturer" = "8:Nathan.Woodburn/"
|
||||
"ARPHELPTELEPHONE" = "8:"
|
||||
"ARPHELPLINK" = "8:https://l.woodburn.au/discord"
|
||||
|
||||
28
README.md
28
README.md
@@ -2,6 +2,14 @@
|
||||
Experimental wallet for Handshake chain
|
||||
|
||||
## Installation
|
||||
### Dependencies
|
||||
You will need .net desktop installed. You can download it from [here](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-6.0.18-windows-x64-installer).
|
||||
|
||||
You will also need Node, NPM, and git installed if you want to use the internal HSD or Ledger wallets.
|
||||
[Git](https://git-scm.com/downloads)
|
||||
[Node](https://nodejs.org/en/download/)
|
||||
[NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
|
||||
|
||||
### From Releases
|
||||
You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/).
|
||||
|
||||
@@ -60,6 +68,9 @@ You can change the number of transactions shown in the `portfolio-tx:` settings.
|
||||
<br><br>
|
||||
## Sending HNS
|
||||

|
||||
This page lets you send HNS to Handshake addresses or domains using [HIP-02](https://github.com/handshake-org/HIPs/blob/master/HIP-0002.md).
|
||||
To use HIP-02 you need to have HSD resolver (or any HNS compatible DNS resolver) listening on port 5350 (default HSD port).
|
||||
To enter a domain to use HIP-02 you need to prefix the domain with `@` (eg. `@nathan.woodburn`).
|
||||
|
||||
## Receiving HNS or Domains
|
||||
The receive page shows your current HNS address.
|
||||
@@ -104,6 +115,8 @@ The "CANCEL" transaction type is used to cancel an transfer.
|
||||
|
||||
At the momemt "UPDATE" or coin only transactions are not supported.
|
||||
|
||||
|
||||
Please not that the import syntax for BIDs is BID,LOCKUP where LOCKUP is (BID+BLIND)
|
||||

|
||||
|
||||
## Exporting
|
||||
@@ -134,6 +147,15 @@ This file stores the node (HSD/Bob connection) settings.
|
||||
The Network is the network you want to connect to (default is `0` for Mainnet).
|
||||
If you delete this file, FireWallet will show the node setup screen on next startup.
|
||||
|
||||
You can set a custom HSD launch command by setting the `hsd-command` key.
|
||||
The default launch is the same as this
|
||||
```yaml
|
||||
HSD-command: {default-dir} --agent=FireWallet --index-tx --index-address --api-key {key} --prefix {Bob}
|
||||
```
|
||||
The `{default-dir}` will be replaced with the HSD directory `%appdata%\FireWallet\hsd\`.
|
||||
The `{key}` will be replaced with the API key from the node.txt file.
|
||||
The `{Bob}` will be replaced with the Bob wallet HSD data directory `%appdata%\Bob\hsd_data\` this is used to sync FireWallet with Bob's accounts and also stops you needing to sync the chain twice.
|
||||
|
||||
## theme.txt
|
||||
This file stores the theme settings.
|
||||
The theme is the color scheme of the application.
|
||||
@@ -143,3 +165,9 @@ There are 4 modes: `off` is disabled, `mica` is windows app style, `key` is to m
|
||||
## log.txt
|
||||
This file stores the logs for the application.
|
||||
You should check this file if you have any issues with the application.
|
||||
|
||||
|
||||
# Support
|
||||
If you have any issues with the application you can open an issue on GitHub or contact me on Discord (NathanWoodburn on most Handshake servers).
|
||||
|
||||
If you would like to support this project you can find out how at https://nathan.woodburn.au/#donate or you can help by contributing to the project on GitHub.
|
||||
@@ -1,3 +1,5 @@
|
||||
IP: 127.0.0.1
|
||||
Network: 0
|
||||
Key: my-super-secret-api-key
|
||||
HSD: False
|
||||
HSD-command: {default-dir} --agent=FireWallet --index-tx --index-address --api-key {key} --prefix {Bob}
|
||||
15
hsd-ledger
15
hsd-ledger
@@ -136,20 +136,14 @@ async function sendRaw(wclient, nclient, config, ledger, args) { // Create a fun
|
||||
const network = Network.get(config.str('network')); // Get the network
|
||||
const id = config.str('wallet-id'); // Get the wallet id
|
||||
const acct = config.str('account-name'); // Get the account name
|
||||
const batch = args[0]; // Get the batch file location
|
||||
const nameslocation = args[1]; // Get the names file location
|
||||
// Log the arguments to the console (for debugging)
|
||||
|
||||
const batch = JSON.parse(args[0]); // Get the batch
|
||||
const names = JSON.parse(args[1]); // Get the names
|
||||
await wclient.execute('selectwallet', [id]); // Select the wallet
|
||||
|
||||
|
||||
const fs = require('fs'); // Import fs (used to read files)
|
||||
try {
|
||||
const data = fs.readFileSync(batch, 'utf8'); // Read the batch file
|
||||
const json = JSON.parse(data); // Parse the batch file as JSON
|
||||
const mtx = MTX.fromJSON(json.result); // Create a new MTX from the JSON
|
||||
|
||||
const namefile = fs.readFileSync(nameslocation, 'utf8'); // Read the names file
|
||||
const names = namefile.split(','); // Split the names file into an array
|
||||
const mtx = MTX.fromJSON(batch.result); // Create a new MTX from the JSON
|
||||
const hashes = {}; // Create an empty object to store the hashes
|
||||
for (const name of names) { // Loop through the names
|
||||
const hash = hashName(name); // Hash the name
|
||||
@@ -428,6 +422,7 @@ function usage(err) {
|
||||
console.log(' $ hsd-ledger createaccount <account-name> <account-index>');
|
||||
console.log(' $ hsd-ledger createaddress');
|
||||
console.log(' $ hsd-ledger sendtoaddress <address> <amount>');
|
||||
console.log(' $ hsd-ledger sendraw <batch> <names>');
|
||||
console.log(' $ hsd-ledger getwallets');
|
||||
console.log(' $ hsd-ledger getaccounts');
|
||||
console.log(' $ hsd-ledger getaccount <account-name>');
|
||||
|
||||
Reference in New Issue
Block a user