mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-17 22:14:26 +01:00
Wallet UI: Improve views (#1763)
* Improve UpdateStore and DerivationScheme views fix * Improve wallet views CSS fix * Apply suggestions from code review Co-authored-by: Andrew Camilleri <evilkukka@gmail.com>
This commit is contained in:
@@ -11,6 +11,8 @@ namespace BTCPayServer.Models.StoreViewModels
|
|||||||
public DerivationSchemeViewModel()
|
public DerivationSchemeViewModel()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Display(Name = "Derivation scheme")]
|
||||||
public string DerivationScheme
|
public string DerivationScheme
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
@@ -31,7 +33,7 @@ namespace BTCPayServer.Models.StoreViewModels
|
|||||||
|
|
||||||
public KeyPath RootKeyPath { get; set; }
|
public KeyPath RootKeyPath { get; set; }
|
||||||
|
|
||||||
[Display(Name = "Electrum/Hardware Wallet File")]
|
[Display(Name = "Wallet File")]
|
||||||
public IFormFile WalletFile { get; set; }
|
public IFormFile WalletFile { get; set; }
|
||||||
public string Config { get; set; }
|
public string Config { get; set; }
|
||||||
public string Source { get; set; }
|
public string Source { get; set; }
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using NBXplorer.Models;
|
using NBXplorer.Models;
|
||||||
|
|
||||||
@@ -12,11 +13,14 @@ namespace BTCPayServer.Models.WalletViewModels
|
|||||||
public bool Ok => IsServerAdmin && IsSupportedByCurrency && IsFullySync;
|
public bool Ok => IsServerAdmin && IsSupportedByCurrency && IsFullySync;
|
||||||
|
|
||||||
[Range(1000, 10_000)]
|
[Range(1000, 10_000)]
|
||||||
|
[DisplayName("Batch size")]
|
||||||
public int BatchSize { get; set; } = 3000;
|
public int BatchSize { get; set; } = 3000;
|
||||||
[Range(0, 10_000_000)]
|
[Range(0, 10_000_000)]
|
||||||
|
[DisplayName("Starting index")]
|
||||||
public int StartingIndex { get; set; } = 0;
|
public int StartingIndex { get; set; } = 0;
|
||||||
|
|
||||||
[Range(100, 100000)]
|
[Range(100, 100000)]
|
||||||
|
[DisplayName("Gap limit")]
|
||||||
public int GapLimit { get; set; } = 10000;
|
public int GapLimit { get; set; } = 10000;
|
||||||
|
|
||||||
public int? Progress { get; set; }
|
public int? Progress { get; set; }
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace BTCPayServer.Models.WalletViewModels
|
|||||||
_FileName = value;
|
_FileName = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[Display(Name = "PSBT content")]
|
||||||
public string PSBT { get; set; }
|
public string PSBT { get; set; }
|
||||||
public List<string> Errors { get; set; } = new List<string>();
|
public List<string> Errors { get; set; } = new List<string>();
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace BTCPayServer.Models.WalletViewModels
|
namespace BTCPayServer.Models.WalletViewModels
|
||||||
@@ -6,6 +7,7 @@ namespace BTCPayServer.Models.WalletViewModels
|
|||||||
public class WalletSettingsViewModel
|
public class WalletSettingsViewModel
|
||||||
{
|
{
|
||||||
public string Label { get; set; }
|
public string Label { get; set; }
|
||||||
|
[DisplayName("Derivation scheme")]
|
||||||
public string DerivationScheme { get; set; }
|
public string DerivationScheme { get; set; }
|
||||||
public string DerivationSchemeInput { get; set; }
|
public string DerivationSchemeInput { get; set; }
|
||||||
[Display(Name = "Is signing key")]
|
[Display(Name = "Is signing key")]
|
||||||
@@ -20,9 +22,12 @@ namespace BTCPayServer.Models.WalletViewModels
|
|||||||
|
|
||||||
public class WalletSettingsAccountKeyViewModel
|
public class WalletSettingsAccountKeyViewModel
|
||||||
{
|
{
|
||||||
|
[DisplayName("Account key")]
|
||||||
public string AccountKey { get; set; }
|
public string AccountKey { get; set; }
|
||||||
|
[DisplayName("Master fingerprint")]
|
||||||
[Validation.HDFingerPrintValidator]
|
[Validation.HDFingerPrintValidator]
|
||||||
public string MasterFingerprint { get; set; }
|
public string MasterFingerprint { get; set; }
|
||||||
|
[DisplayName("Account key path")]
|
||||||
[Validation.KeyPathValidator]
|
[Validation.KeyPathValidator]
|
||||||
public string AccountKeyPath { get; set; }
|
public string AccountKeyPath { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="modal fade" id="btcpayservervault" tabindex="-1" role="dialog" aria-labelledby="btcpayservervault" aria-hidden="true">
|
<div class="modal fade" id="btcpayservervault" tabindex="-1" role="dialog" aria-labelledby="btcpayservervault" aria-hidden="true"></div>
|
||||||
|
|
||||||
</div>
|
|
||||||
<partial name="VaultElements" />
|
<partial name="VaultElements" />
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<div id="WebsocketPath" style="display:none;">@Url.Action("VaultBridgeConnection", "Vault", new { cryptoCode = Model.CryptoCode })</div>
|
<div id="WebsocketPath" style="display:none;">@Url.Action("VaultBridgeConnection", "Vault", new { cryptoCode = Model.CryptoCode })</div>
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
}
|
}
|
||||||
<form method="post" asp-action="AddDerivationScheme"
|
<form method="post" asp-action="AddDerivationScheme"
|
||||||
asp-route-cryptoCode="@Model.CryptoCode"
|
asp-route-cryptoCode="@Model.CryptoCode"
|
||||||
asp-route-storeId="@this.Context.GetRouteValue("storeId")">
|
asp-route-storeId="@this.Context.GetRouteValue("storeId")">
|
||||||
|
|
||||||
@@ -72,12 +72,15 @@
|
|||||||
<input id="DerivationSchemeFormat" asp-for="DerivationSchemeFormat" type="hidden" />
|
<input id="DerivationSchemeFormat" asp-for="DerivationSchemeFormat" type="hidden" />
|
||||||
<input id="AccountKey" asp-for="AccountKey" type="hidden" />
|
<input id="AccountKey" asp-for="AccountKey" type="hidden" />
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<h5>Derivation Scheme</h5>
|
<h5>Derivation scheme</h5>
|
||||||
<span>The DerivationScheme represents the destination of the funds received by your invoice. It is generated by your wallet software. Please, verify that you are generating the right addresses by clicking on 'Check ExtPubKey'</span>
|
<p>
|
||||||
|
The derivation scheme represents the destination of the funds received by your invoice.
|
||||||
|
It is generated by your wallet software.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="DerivationScheme"></label>
|
<label asp-for="DerivationScheme"></label>
|
||||||
<input asp-for="DerivationScheme" class="form-control store-derivation-scheme" />
|
<textarea asp-for="DerivationScheme" class="form-control store-derivation-scheme text-monospace py-2" rows="2"></textarea>
|
||||||
<span asp-validation-for="DerivationScheme" class="text-danger"></span>
|
<span asp-validation-for="DerivationScheme" class="text-danger"></span>
|
||||||
|
|
||||||
<div class="dropdown mt-2 text-right">
|
<div class="dropdown mt-2 text-right">
|
||||||
@@ -99,43 +102,40 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<table class="table table-sm table-responsive-md">
|
||||||
<span>BTCPay format memo</span>
|
<thead>
|
||||||
<table class="table table-sm table-responsive-md">
|
<tr>
|
||||||
<thead>
|
<th>Address type</th>
|
||||||
<tr>
|
<th>Example</th>
|
||||||
<th>Address type</th>
|
</tr>
|
||||||
<th>Example</th>
|
</thead>
|
||||||
</tr>
|
<tbody>
|
||||||
</thead>
|
<tr>
|
||||||
<tbody>
|
<td>P2WPKH</td>
|
||||||
<tr>
|
<td>xpub...</td>
|
||||||
<td>P2WPKH</td>
|
</tr>
|
||||||
<td>xpub...</td>
|
<tr>
|
||||||
</tr>
|
<td>P2SH-P2WPKH</td>
|
||||||
<tr>
|
<td>xpub...-[p2sh]</td>
|
||||||
<td>P2SH-P2WPKH</td>
|
</tr>
|
||||||
<td>xpub...-[p2sh]</td>
|
<tr>
|
||||||
</tr>
|
<td>P2PKH</td>
|
||||||
<tr>
|
<td>xpub...-[legacy]</td>
|
||||||
<td>P2PKH</td>
|
</tr>
|
||||||
<td>xpub...-[legacy]</td>
|
<tr>
|
||||||
</tr>
|
<td>Multi-sig P2WSH</td>
|
||||||
<tr>
|
<td>2-of-xpub1...-xpub2...</td>
|
||||||
<td>Multi-sig P2WSH</td>
|
</tr>
|
||||||
<td>2-of-xpub1...-xpub2...</td>
|
<tr>
|
||||||
</tr>
|
<td>Multi-sig P2SH-P2WSH</td>
|
||||||
<tr>
|
<td>2-of-xpub1...-xpub2...-[p2sh]</td>
|
||||||
<td>Multi-sig P2SH-P2WSH</td>
|
</tr>
|
||||||
<td>2-of-xpub1...-xpub2...-[p2sh]</td>
|
<tr>
|
||||||
</tr>
|
<td>Multi-sig P2SH</td>
|
||||||
<tr>
|
<td>2-of-xpub1...-xpub2...-[legacy]</td>
|
||||||
<td>Multi-sig P2SH</td>
|
</tr>
|
||||||
<td>2-of-xpub1...-xpub2...-[legacy]</td>
|
</tbody>
|
||||||
</tr>
|
</table>
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group hw-fields">
|
<div class="form-group hw-fields">
|
||||||
<h5>Additional pairing information</h5>
|
<h5>Additional pairing information</h5>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<div class="modal fade" id="electrumimport" tabindex="-1" role="dialog" aria-labelledby="electrumimport" aria-hidden="true">
|
<div class="modal fade" id="electrumimport" tabindex="-1" role="dialog" aria-labelledby="electrumimport" aria-hidden="true">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<form class="modal-content" form method="post" enctype="multipart/form-data">
|
<form class="modal-content" method="post" enctype="multipart/form-data">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h5 class="modal-title" id="electrumimportLabel">Import Wallet from file</h5>
|
<h5 class="modal-title" id="electrumimportLabel">Import Wallet from file</h5>
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
@@ -17,21 +17,43 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>You may import your air-gapped hardware wallet (such as ColdCard, Cobo Vault) by exporting a file and uploading it here.</p>
|
<p>Import your air-gapped hardware wallet by exporting a file and uploading it here.</p>
|
||||||
<ul >
|
<table class="table table-sm table-responsive-md">
|
||||||
<li>Cobo Vault - <kbd>Settings->Watch-Only Wallet->Wasabi Wallet/BTCPay->Export Wallet</kbd></li>
|
<thead>
|
||||||
<li>ColdCard - <kbd>Advanced->MicroSD Card->Electrum Wallet</kbd> or <kbd>Advanced->MicroSD Card->Wasabi Wallet</kbd></li>
|
<tr>
|
||||||
<li>Electrum - <kbd>File->Save Copy</kbd></li>
|
<th>Wallet</th>
|
||||||
<li>Wasabi - <kbd>Tools->Wallet Manager->Open Wallets Folder</kbd></li>
|
<th>Instructions</th>
|
||||||
</ul>
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Cobo Vault</td>
|
||||||
|
<td><kbd>Settings ❯ Watch-Only Wallet ❯ BTCPay ❯ Export Wallet</kbd></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ColdCard</td>
|
||||||
|
<td>
|
||||||
|
<kbd>Advanced ❯ MicroSD Card ❯ Electrum Wallet</kbd> or
|
||||||
|
<kbd>Advanced ❯ MicroSD Card ❯ Wasabi Wallet</kbd>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Electrum</td>
|
||||||
|
<td><kbd>File ❯ Save Copy</kbd></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Wasabi</td>
|
||||||
|
<td><kbd>Tools ❯ Wallet Manager ❯ Open Wallets Folder</kbd></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="WalletFile"></label>
|
<label asp-for="WalletFile"></label>
|
||||||
|
|
||||||
<input type="file" class="form-control-file" asp-for="WalletFile" required>
|
<input type="file" class="form-control-file" asp-for="WalletFile" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
|
||||||
<button type="submit" class="btn btn-primary">Submit</button>
|
<button type="submit" class="btn btn-primary">Submit</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -73,7 +95,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
|
||||||
<button id="vault-confirm" class="btn btn-primary" style="display:none;"></button>
|
<button id="vault-confirm" class="btn btn-primary" style="display:none;"></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
@model NBXplorer.Models.GenerateWalletRequest
|
@model NBXplorer.Models.GenerateWalletRequest
|
||||||
<div class="modal fade" id="nbxplorergeneratewallet" tabindex="-1" role="dialog" aria-labelledby="nbxplorergeneratewallet" aria-hidden="true">
|
<div class="modal fade" id="nbxplorergeneratewallet" tabindex="-1" role="dialog" aria-labelledby="nbxplorergeneratewallet" aria-hidden="true">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
<form id="generate-wallet-form" class="modal-content" form method="post" onsubmit="return validatePassphraseConf();"
|
<form id="generate-wallet-form" class="modal-content" method="post" onsubmit="return validatePassphraseConf();"
|
||||||
asp-action="GenerateNBXWallet"
|
asp-action="GenerateNBXWallet"
|
||||||
asp-route-storeId="@this.Context.GetRouteValue("storeId")"
|
asp-route-storeId="@this.Context.GetRouteValue("storeId")"
|
||||||
asp-route-cryptoCode="@this.Context.GetRouteValue("cryptoCode")"
|
asp-route-cryptoCode="@this.Context.GetRouteValue("cryptoCode")"
|
||||||
@@ -27,7 +27,8 @@
|
|||||||
<input type="text" asp-for="ExistingMnemonic" class="form-control" autocomplete="off"/>
|
<input type="text" asp-for="ExistingMnemonic" class="form-control" autocomplete="off"/>
|
||||||
<span asp-validation-for="ExistingMnemonic" class="text-danger"></span>
|
<span asp-validation-for="ExistingMnemonic" class="text-danger"></span>
|
||||||
<small class="form-text text-muted">
|
<small class="form-text text-muted">
|
||||||
You can choose to import an existing mnemonic seed phrase. If you leave blank, we will generate one for you.
|
You can choose to import an existing mnemonic seed phrase.<br/>
|
||||||
|
If you leave it blank, we will generate one for you.
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -37,7 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="passphrase_conf">Passphrase confirmation</label>
|
<label for="passphrase_conf">Passphrase confirmation</label>
|
||||||
<input type="text" name="passphrase_conf" class="form-control"/>
|
<input type="text" name="passphrase_conf" id="passphrase_conf" class="form-control"/>
|
||||||
<span class="text-danger field-validation-valid" id="passphrase_conf_validation"></span>
|
<span class="text-danger field-validation-valid" id="passphrase_conf_validation"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -60,9 +61,9 @@
|
|||||||
<span asp-validation-for="AccountNumber" class="text-danger"></span>
|
<span asp-validation-for="AccountNumber" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group form-check">
|
||||||
<input type="checkbox" class="form-check-inline" asp-for="SavePrivateKeys"/>
|
<input type="checkbox" class="form-check-input" asp-for="SavePrivateKeys"/>
|
||||||
<label asp-for="SavePrivateKeys">Is hot wallet</label>
|
<label asp-for="SavePrivateKeys" class="form-check-label">Is hot wallet</label>
|
||||||
<span asp-validation-for="SavePrivateKeys" class="text-danger"></span>
|
<span asp-validation-for="SavePrivateKeys" class="text-danger"></span>
|
||||||
<small class="form-text text-danger">
|
<small class="form-text text-danger">
|
||||||
If checked, each private key associated with an address generated will be stored as metadata in NBXplorer. While convenient, this means that anyone with access to your server will have access to your private keys and will be able to steal your funds.
|
If checked, each private key associated with an address generated will be stored as metadata in NBXplorer. While convenient, this means that anyone with access to your server will have access to your private keys and will be able to steal your funds.
|
||||||
@@ -70,9 +71,9 @@
|
|||||||
</div>
|
</div>
|
||||||
@if (ViewData["CanUseRPCImport"] is true)
|
@if (ViewData["CanUseRPCImport"] is true)
|
||||||
{
|
{
|
||||||
<div class="form-group">
|
<div class="form-group form-check">
|
||||||
<input type="checkbox" class="form-check-inline" asp-for="ImportKeysToRPC"/>
|
<input type="checkbox" class="form-check-input" asp-for="ImportKeysToRPC"/>
|
||||||
<label asp-for="ImportKeysToRPC">Import keys to RPC</label>
|
<label asp-for="ImportKeysToRPC" class="form-check-label">Import keys to RPC</label>
|
||||||
<span asp-validation-for="ImportKeysToRPC" class="text-danger"></span>
|
<span asp-validation-for="ImportKeysToRPC" class="text-danger"></span>
|
||||||
<small class="form-text text-muted">
|
<small class="form-text text-muted">
|
||||||
If checked, each address generated will be imported into the node wallet so that you can view your balance through your node. When this is enabled alongside <code>Is hot wallet</code>, you're also able to use the node wallet to spend (this works pretty well in conjunction with apps such as FullyNoded).
|
If checked, each address generated will be imported into the node wallet so that you can view your balance through your node. When this is enabled alongside <code>Is hot wallet</code>, you're also able to use the node wallet to spend (this works pretty well in conjunction with apps such as FullyNoded).
|
||||||
@@ -81,7 +82,7 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
|
||||||
<button type="submit" class="btn btn-primary" id="btn-generate">Generate</button>
|
<button type="submit" class="btn btn-primary" id="btn-generate">Generate</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
@model WalletSendModel
|
@model WalletSendModel
|
||||||
|
|
||||||
<div id="coin-selection-app" v-cloak>
|
<div id="coin-selection-app" v-cloak>
|
||||||
<ul class="list-group">
|
<ul class="list-group mb-4">
|
||||||
<li class="list-group-item list-group-item-heading d-flex justify-content-between align-items-center">
|
<li class="list-group-item list-group-item-heading d-flex justify-content-between align-items-center">
|
||||||
<h3>Coin selection</h3>
|
<h3>Coin selection</h3>
|
||||||
<span class="text-muted text-right" >
|
<span class="text-muted text-right" >
|
||||||
@@ -57,14 +57,13 @@
|
|||||||
<a :href="label.link" target="_blank"v-if="label.link" data-toggle="tooltip" v-tooltip="label.tooltip">
|
<a :href="label.link" target="_blank"v-if="label.link" data-toggle="tooltip" v-tooltip="label.tooltip">
|
||||||
{{label.value}}
|
{{label.value}}
|
||||||
<i class="fa fa-info-circle"></i>
|
<i class="fa fa-info-circle"></i>
|
||||||
|
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="text-muted ml-2">{{item.amount}}</span>
|
<span class="text-muted ml-2">{{item.amount}}</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item">
|
<li class="list-group-item d-flex align-items-center justify-content-between">
|
||||||
<ul class="pagination float-left">
|
<ul class="pagination float-left">
|
||||||
<li class="page-item" v-bind:class="{'disabled' : pageStart == 0}">
|
<li class="page-item" v-bind:class="{'disabled' : pageStart == 0}">
|
||||||
<a class="page-link" tabindex="-1" href="#" v-on:click="page = page -1">«</a>
|
<a class="page-link" tabindex="-1" href="#" v-on:click="page = page -1">«</a>
|
||||||
@@ -79,7 +78,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<a href="#" v-on:click="showSelectedOnly = !showSelectedOnly" class="btn btn-link" v-bind:class="{'disabled' : selectedInputs.length === 0}">
|
<a href="#" v-on:click="showSelectedOnly = !showSelectedOnly" class="btn btn-secondary" v-bind:class="{'disabled' : selectedInputs.length === 0}">
|
||||||
<template v-if="showSelectedOnly">Show all</template>
|
<template v-if="showSelectedOnly">Show all</template>
|
||||||
<template v-else>Show selected only</template>
|
<template v-else>Show selected only</template>
|
||||||
</a>
|
</a>
|
||||||
@@ -89,7 +88,6 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
$(function() {
|
||||||
|
|
||||||
Vue.directive('tooltip', function(el, binding) {
|
Vue.directive('tooltip', function(el, binding) {
|
||||||
$(el).tooltip({
|
$(el).tooltip({
|
||||||
title: binding.value,
|
title: binding.value,
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
border: 0;
|
border: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (TempData.HasStatusMessage())
|
@if (TempData.HasStatusMessage())
|
||||||
{
|
{
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -55,6 +56,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<form method="post"
|
<form method="post"
|
||||||
@@ -65,15 +67,17 @@
|
|||||||
<input asp-for="Name" class="form-control" />
|
<input asp-for="Name" class="form-control" />
|
||||||
<span asp-validation-for="Name" class="text-danger"></span>
|
<span asp-validation-for="Name" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-row">
|
||||||
<label asp-for="Amount" class="control-label"></label>
|
<div class="form-group col-8">
|
||||||
<input asp-for="Amount" class="form-control" />
|
<label asp-for="Amount" class="control-label"></label>
|
||||||
<span asp-validation-for="Amount" class="text-danger"></span>
|
<input asp-for="Amount" class="form-control" />
|
||||||
</div>
|
<span asp-validation-for="Amount" class="text-danger"></span>
|
||||||
<div class="form-group">
|
</div>
|
||||||
<label asp-for="Currency" class="control-label"></label>
|
<div class="form-group col-4">
|
||||||
<input asp-for="Currency" class="form-control" />
|
<label asp-for="Currency" class="control-label"></label>
|
||||||
<span asp-validation-for="Currency" class="text-danger"></span>
|
<input asp-for="Currency" class="form-control" />
|
||||||
|
<span asp-validation-for="Currency" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="submit" value="Create" class="btn btn-primary" id="Create" />
|
<input type="submit" value="Create" class="btn btn-primary" id="Create" />
|
||||||
|
|||||||
@@ -26,29 +26,31 @@
|
|||||||
<form method="post">
|
<form method="post">
|
||||||
<div class="row button-row">
|
<div class="row button-row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
List of unprocessed payouts
|
<h4 class="mb-3">Payouts to process</h4>
|
||||||
</div>
|
|
||||||
<div class="col text-right">
|
|
||||||
<button type="submit" id="payCommand" name="Command" class="btn btn-primary" role="button" value="pay">Confirm selected payouts</button>
|
|
||||||
<button type="submit" id="payCommand" name="Command" class="btn btn-secondary" role="button" value="cancel">Cancel selected payouts</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
@if (Model.WaitingForApproval.Any())
|
||||||
|
{
|
||||||
|
<div class="col text-right">
|
||||||
|
<button type="submit" id="payCommand" name="Command" class="btn btn-primary" role="button" value="pay">Confirm selected payouts</button>
|
||||||
|
<button type="submit" id="payCommand" name="Command" class="btn btn-secondary" role="button" value="cancel">Cancel selected payouts</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h3>Payouts to process</h3>
|
@if (Model.WaitingForApproval.Any())
|
||||||
<table class="table table-sm table-responsive-lg">
|
{
|
||||||
<thead class="thead-inverse">
|
<table class="table table-sm table-responsive-lg">
|
||||||
|
<thead class="thead-inverse">
|
||||||
<tr>
|
<tr>
|
||||||
<th><input id="selectAllCheckbox" type="checkbox" onclick="selectAll(this); return true;" /></th>
|
<th><input id="selectAllCheckbox" type="checkbox" onclick="selectAll(this); return true;" /></th>
|
||||||
<th style="min-width: 90px;" class="col-md-auto">
|
<th style="min-width: 90px;" class="col-md-auto">Date</th>
|
||||||
Date
|
|
||||||
</th>
|
|
||||||
<th class="text-left">Source</th>
|
<th class="text-left">Source</th>
|
||||||
<th class="text-left">Destination</th>
|
<th class="text-left">Destination</th>
|
||||||
<th class="text-right">Amount</th>
|
<th class="text-right">Amount</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@for (int i = 0; i < Model.WaitingForApproval.Count; i++)
|
@for (int i = 0; i < Model.WaitingForApproval.Count; i++)
|
||||||
{
|
{
|
||||||
var pp = Model.WaitingForApproval[i];
|
var pp = Model.WaitingForApproval[i];
|
||||||
@@ -65,59 +67,61 @@
|
|||||||
<td class="text-right"><span>@pp.Amount</span></td>
|
<td class="text-right"><span>@pp.Amount</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@if (Model.WaitingForApproval.Count == 0)
|
</tbody>
|
||||||
{
|
</table>
|
||||||
<tr>
|
}
|
||||||
<td colspan="5" class="text-center"><span>No payout waiting for approval</span></td>
|
else
|
||||||
</tr>
|
{
|
||||||
}
|
<p class="mb-0">No payout waiting for approval.</p>
|
||||||
</tbody>
|
}
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<hr class="my-4"/>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h3>Completed payouts</h3>
|
<h4 class="mb-3">Completed payouts</h4>
|
||||||
<table class="table table-sm table-responsive-lg">
|
@if (Model.Other.Any())
|
||||||
<thead class="thead-inverse">
|
{
|
||||||
<tr>
|
<table class="table table-sm table-responsive-lg">
|
||||||
<th style="min-width: 90px;" class="col-md-auto">
|
<thead class="thead-inverse">
|
||||||
Date
|
|
||||||
</th>
|
|
||||||
<th class="text-left">Source</th>
|
|
||||||
<th class="text-left">Destination</th>
|
|
||||||
<th class="text-right">Amount</th>
|
|
||||||
<th class="text-right">Transaction</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@for (int i = 0; i < Model.Other.Count; i++)
|
|
||||||
{
|
|
||||||
var pp = Model.Other[i];
|
|
||||||
<tr>
|
|
||||||
<td><span>@pp.Date.ToBrowserDate()</span></td>
|
|
||||||
<td class="mw-100"><span>@pp.PullPaymentName</span></td>
|
|
||||||
<td><span>@pp.Destination</span></td>
|
|
||||||
<td class="text-right"><span>@pp.Amount</span></td>
|
|
||||||
@if (pp.TransactionLink is null)
|
|
||||||
{
|
|
||||||
<td class="text-right"><span>Cancelled</span></td>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<td class="text-right"><span><a class="transaction-link" href="@pp.TransactionLink">Link</a></span></td>
|
|
||||||
}
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
@if (Model.Other.Count == 0)
|
|
||||||
{
|
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="5" class="text-center"><span>No payout in history</span></td>
|
<th style="min-width: 90px;" class="col-md-auto">
|
||||||
|
Date
|
||||||
|
</th>
|
||||||
|
<th class="text-left">Source</th>
|
||||||
|
<th class="text-left">Destination</th>
|
||||||
|
<th class="text-right">Amount</th>
|
||||||
|
<th class="text-right">Transaction</th>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
</thead>
|
||||||
</tbody>
|
<tbody>
|
||||||
</table>
|
@for (int i = 0; i < Model.Other.Count; i++)
|
||||||
|
{
|
||||||
|
var pp = Model.Other[i];
|
||||||
|
<tr>
|
||||||
|
<td><span>@pp.Date.ToBrowserDate()</span></td>
|
||||||
|
<td class="mw-100"><span>@pp.PullPaymentName</span></td>
|
||||||
|
<td><span>@pp.Destination</span></td>
|
||||||
|
<td class="text-right"><span>@pp.Amount</span></td>
|
||||||
|
@if (pp.TransactionLink is null)
|
||||||
|
{
|
||||||
|
<td class="text-right"><span>Cancelled</span></td>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<td class="text-right"><span><a class="transaction-link" href="@pp.TransactionLink">Link</a></span></td>
|
||||||
|
}
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<p class="mb-0">No payout in history.</p>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -51,9 +51,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<pre><code class="json">@Model.Decoded</code></pre>
|
<pre><code class="json">@Model.Decoded</code></pre>
|
||||||
}
|
}
|
||||||
<h3>PSBT to decode</h3>
|
<h4 class="mb-3">Decode PSBT</h4>
|
||||||
|
<p>You can decode a PSBT by either pasting its content or by uploading the file.</p>
|
||||||
<form class="form-group" method="post" asp-action="WalletPSBT" asp-route-walletId="@this.Context.GetRouteValue("walletId")" enctype="multipart/form-data">
|
<form class="form-group" method="post" asp-action="WalletPSBT" asp-route-walletId="@this.Context.GetRouteValue("walletId")" enctype="multipart/form-data">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
<label asp-for="PSBT"></label>
|
||||||
<textarea class="form-control" rows="5" asp-for="PSBT"></textarea>
|
<textarea class="form-control" rows="5" asp-for="PSBT"></textarea>
|
||||||
<span asp-validation-for="PSBT" class="text-danger"></span>
|
<span asp-validation-for="PSBT" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="row no-gutters">
|
<div class="row no-gutters">
|
||||||
<div class="col-lg-7 mx-auto my-auto ">
|
<div class="col-lg-8 mx-auto my-auto">
|
||||||
<form method="post" asp-action="WalletReceive" class="card text-center">
|
<form method="post" asp-action="WalletReceive" class="card text-center">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@if (string.IsNullOrEmpty(Model.Address))
|
@if (string.IsNullOrEmpty(Model.Address))
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<h3 class="card-title mb-4">Next available @Model.CryptoCode address</h3>
|
<h3 class="card-title mb-4">Next available @Model.CryptoCode address</h3>
|
||||||
<noscript>
|
<noscript>
|
||||||
<div class="card-body m-sm-0 p-sm-0">
|
<div class="card-body m-sm-0 p-sm-0">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
@@ -34,9 +34,13 @@
|
|||||||
<span class="input-group-text fa fa-copy"> </span>
|
<span class="input-group-text fa fa-copy"> </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="row mt-4">
|
||||||
<button type="submit" name="command" value="unreserve-current-address" class="btn btn-link">Unreserve this address</button>
|
<div class="col-12 col-sm-6">
|
||||||
<button type="submit" name="command" value="generate-new-address" class="btn btn-link">Generate another address</button>
|
<button type="submit" name="command" value="generate-new-address" class="btn btn-primary w-100">Generate another address</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-6 mt-4 mt-sm-0">
|
||||||
|
<button type="submit" name="command" value="unreserve-current-address" class="btn btn-secondary w-100">Unreserve this address</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</noscript>
|
</noscript>
|
||||||
@@ -52,9 +56,13 @@
|
|||||||
<span class="input-group-text fa fa-copy"> </span>
|
<span class="input-group-text fa fa-copy"> </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="row mt-4">
|
||||||
<button type="submit" name="command" value="unreserve-current-address" class="btn btn-link">Unreserve this address</button>
|
<div class="col-12 col-sm-6">
|
||||||
<button type="submit" name="command" value="generate-new-address" class="btn btn-link">Generate another address</button>
|
<button type="submit" name="command" value="generate-new-address" class="btn btn-primary w-100">Generate another address</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-6 mt-4 mt-sm-0">
|
||||||
|
<button type="submit" name="command" value="unreserve-current-address" class="btn btn-secondary w-100">Unreserve this address</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,10 @@
|
|||||||
ViewData.SetActivePageAndTitle(WalletsNavPages.Rescan);
|
ViewData.SetActivePageAndTitle(WalletsNavPages.Rescan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@if (!Model.Ok)
|
@if (!Model.Ok)
|
||||||
{
|
{
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-10">
|
<div class="col-lg-8">
|
||||||
<p>This feature is disabled</p>
|
<p>This feature is disabled</p>
|
||||||
@if (Model.IsFullySync)
|
@if (Model.IsFullySync)
|
||||||
{
|
{
|
||||||
@@ -55,7 +54,7 @@ else if (!Model.Progress.HasValue)
|
|||||||
<span>The previous scan completed and found <b>@Model.LastSuccess.Found</b> UTXOs in <b>@Model.TimeOfScan</b> (The total UTXO set size is @Model.LastSuccess.TotalSizeOfUTXOSet.Value)</span>
|
<span>The previous scan completed and found <b>@Model.LastSuccess.Found</b> UTXOs in <b>@Model.TimeOfScan</b> (The total UTXO set size is @Model.LastSuccess.TotalSizeOfUTXOSet.Value)</span>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="col-md-8">
|
<div class="col-lg-8">
|
||||||
<p>
|
<p>
|
||||||
Scanning the UTXO set allow you to restore the balance of your wallet, but not all the transaction history.
|
Scanning the UTXO set allow you to restore the balance of your wallet, but not all the transaction history.
|
||||||
</p>
|
</p>
|
||||||
@@ -68,19 +67,19 @@ else if (!Model.Progress.HasValue)
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8">
|
<div class="col-lg-8">
|
||||||
<form method="post">
|
<form method="post">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="StartingIndex"></label>
|
<label asp-for="StartingIndex"></label>
|
||||||
<input asp-for="StartingIndex" class="form-control" type="number" />
|
<input asp-for="StartingIndex" class="form-control" type="number" style="max-width:14ch;" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="GapLimit"></label>
|
<label asp-for="GapLimit"></label>
|
||||||
<input asp-for="GapLimit" class="form-control" type="number" />
|
<input asp-for="GapLimit" class="form-control" type="number" step="1000" style="max-width:14ch;" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="BatchSize"></label>
|
<label asp-for="BatchSize"></label>
|
||||||
<input asp-for="BatchSize" class="form-control" type="number" />
|
<input asp-for="BatchSize" class="form-control" type="number" step="1000" style="max-width:14ch;" />
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn btn-primary">Start scan</button>
|
<button type="submit" class="btn btn-primary">Start scan</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -90,7 +89,7 @@ else if (!Model.Progress.HasValue)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-10">
|
<div class="col-lg-8">
|
||||||
<p>Scanning in progress, refresh the page to see the progress... (Estimated time: @Model.RemainingTime)</p>
|
<p>Scanning in progress, refresh the page to see the progress... (Estimated time: @Model.RemainingTime)</p>
|
||||||
<div class="progress">
|
<div class="progress">
|
||||||
<div class="progress-bar" role="progressbar" aria-valuenow="@(Model.Progress.Value)"
|
<div class="progress-bar" role="progressbar" aria-valuenow="@(Model.Progress.Value)"
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<partial name="WalletCameraScanner"/>
|
<partial name="WalletCameraScanner"/>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
<div class="@(!Model.InputSelection && Model.Outputs.Count==1? "col-lg-7 transaction-output-form": "col-lg-8")">
|
<div class="@(!Model.InputSelection && Model.Outputs.Count==1? "col-lg-7 transaction-output-form": "col-lg-8")">
|
||||||
<form method="post" asp-action="WalletSend" asp-route-walletId="@this.Context.GetRouteValue("walletId")">
|
<form method="post" asp-action="WalletSend" asp-route-walletId="@this.Context.GetRouteValue("walletId")">
|
||||||
<input type="hidden" asp-for="InputSelection" />
|
<input type="hidden" asp-for="InputSelection" />
|
||||||
@@ -51,7 +51,6 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<partial name="CoinSelection" />
|
<partial name="CoinSelection" />
|
||||||
<br>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (Model.Outputs.Count == 1)
|
@if (Model.Outputs.Count == 1)
|
||||||
@@ -65,12 +64,12 @@
|
|||||||
<label asp-for="Outputs[0].Amount"></label>
|
<label asp-for="Outputs[0].Amount"></label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input asp-for="Outputs[0].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount" />
|
<input asp-for="Outputs[0].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount" />
|
||||||
<div class="input-group-prepend">
|
<div class="input-group-append">
|
||||||
<span class="input-group-text fiat-value" style="display:none;"></span>
|
<span class="input-group-text fiat-value" style="display:none;"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span asp-validation-for="Outputs[0].Amount" class="text-danger"></span>
|
<span asp-validation-for="Outputs[0].Amount" class="text-danger"></span>
|
||||||
<p class="form-text text-muted crypto-info">
|
<p class="form-text text-secondary crypto-info">
|
||||||
Your current balance is
|
Your current balance is
|
||||||
<button type="button" class="crypto-balance-link btn btn-link p-0 align-baseline">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
|
<button type="button" class="crypto-balance-link btn btn-link p-0 align-baseline">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
|
||||||
</p>
|
</p>
|
||||||
@@ -78,15 +77,15 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<div class="list-group-item ">
|
<div class="list-group-item">
|
||||||
<h5 class="mb-1">Destinations</h5>
|
<h5 class="mb-0">Destinations</h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-group mb-2">
|
<div class="list-group mb-4">
|
||||||
@for (var index = 0; index < Model.Outputs.Count; index++)
|
@for (var index = 0; index < Model.Outputs.Count; index++)
|
||||||
{
|
{
|
||||||
<div class="list-group-item transaction-output-form p-0 pl-lg-2">
|
<div class="list-group-item transaction-output-form">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-12 col-md-12 col-lg-10 py-2 ">
|
<div class="col-sm-12 col-lg-10">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="Outputs[index].DestinationAddress" class="control-label"></label>
|
<label asp-for="Outputs[index].DestinationAddress" class="control-label"></label>
|
||||||
<input asp-for="Outputs[index].DestinationAddress" class="form-control" />
|
<input asp-for="Outputs[index].DestinationAddress" class="form-control" />
|
||||||
@@ -96,17 +95,17 @@
|
|||||||
<label asp-for="Outputs[index].Amount" class="control-label"></label>
|
<label asp-for="Outputs[index].Amount" class="control-label"></label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input asp-for="Outputs[index].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount" />
|
<input asp-for="Outputs[index].Amount" type="number" step="any" asp-format="{0}" class="form-control output-amount" />
|
||||||
<div class="input-group-prepend">
|
<div class="input-group-append">
|
||||||
<span class="input-group-text fiat-value" style="display:none;"></span>
|
<span class="input-group-text fiat-value" style="display:none;"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="form-text text-muted crypto-info">
|
<p class="form-text text-secondary crypto-info mb-2">
|
||||||
Your current balance is
|
Your current balance is
|
||||||
<button type="button" class="crypto-balance-link btn btn-link p-0 align-baseline">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
|
<button type="button" class="crypto-balance-link btn btn-link p-0 align-baseline">@Model.CurrentBalance</button> <span>@Model.CryptoCode</span>.
|
||||||
</p>
|
</p>
|
||||||
<span asp-validation-for="Outputs[index].Amount" class="text-danger"></span>
|
<span asp-validation-for="Outputs[index].Amount" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group mb-0">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" asp-for="Outputs[index].SubtractFeesFromOutput" class="form-check-input subtract-fees" />
|
<input type="checkbox" asp-for="Outputs[index].SubtractFeesFromOutput" class="form-check-input subtract-fees" />
|
||||||
<label asp-for="Outputs[index].SubtractFeesFromOutput" class="form-check-label"></label>
|
<label asp-for="Outputs[index].SubtractFeesFromOutput" class="form-check-label"></label>
|
||||||
@@ -114,38 +113,36 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-12 col-lg-2 pull-right">
|
<div class="col-sm-12 col-lg-2">
|
||||||
<button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")"
|
<button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")"
|
||||||
class="d-block d-lg-none d-xl-none btn btn-danger mb-2 ml-2">
|
class="d-inline-block d-lg-none d-xl-none btn btn-danger mt-4 mb-2">
|
||||||
Remove Destination
|
Remove Destination
|
||||||
</button>
|
</button>
|
||||||
<button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")"
|
<button type="submit" title="Remove Destination" name="command" value="@($"remove-output:{index}")"
|
||||||
class="d-none d-lg-block remove-destination-btn text-decoration-none h-100 align-middle btn text-danger btn-link fa fa-times rounded-0 pull-right"></button>
|
class="d-none d-lg-inline-block remove-destination-btn btn text-danger fa fa-times pull-right m-0"></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="form-group">
|
<div class="form-group my-4">
|
||||||
<label asp-for="FeeSatoshiPerByte"></label>
|
<label asp-for="FeeSatoshiPerByte"></label>
|
||||||
<input asp-for="FeeSatoshiPerByte" type="number" step="any" class="form-control" />
|
<input asp-for="FeeSatoshiPerByte" type="number" step="any" class="form-control" style="max-width:14ch;" />
|
||||||
<span asp-validation-for="FeeSatoshiPerByte" class="text-danger"></span>
|
<span asp-validation-for="FeeSatoshiPerByte" class="text-danger"></span>
|
||||||
<span id="FeeRate-Error" class="text-danger"></span>
|
<span id="FeeRate-Error" class="text-danger"></span>
|
||||||
@if (Model.RecommendedSatoshiPerByte.Any())
|
@if (Model.RecommendedSatoshiPerByte.Any())
|
||||||
{
|
{
|
||||||
<div class="text-left mt-1" >
|
<div class="text-left mt-2 d-flex align-items-center">
|
||||||
<span class="text-muted">
|
<span class="text-secondary mr-2">
|
||||||
Confirm in the next
|
Confirm in the next
|
||||||
</span>
|
</span>
|
||||||
<div class="btn-group btn-group-toggle feerate-options" data-toggle="buttons">
|
<div class="btn-group btn-group-toggle feerate-options" role="group" data-toggle="buttons">
|
||||||
|
|
||||||
@for (var index = 0; index < Model.RecommendedSatoshiPerByte.Count; index++)
|
@for (var index = 0; index < Model.RecommendedSatoshiPerByte.Count; index++)
|
||||||
{
|
{
|
||||||
var feeRateOption = Model.RecommendedSatoshiPerByte[index];
|
var feeRateOption = Model.RecommendedSatoshiPerByte[index];
|
||||||
<button type="button" class="btn btn-sm btn-outline-primary crypto-fee-link" value="@feeRateOption.FeeRate" data-toggle="tooltip" title="@feeRateOption.FeeRate sat/b">
|
<button type="button" class="btn btn-sm btn-outline-primary crypto-fee-link" value="@feeRateOption.FeeRate" data-toggle="tooltip" title="@feeRateOption.FeeRate sat/b">
|
||||||
@feeRateOption.Target.TimeString()
|
@feeRateOption.Target.TimeString()
|
||||||
|
|
||||||
</button>
|
</button>
|
||||||
<input type="hidden" asp-for="RecommendedSatoshiPerByte[index].Target" />
|
<input type="hidden" asp-for="RecommendedSatoshiPerByte[index].Target" />
|
||||||
<input type="hidden" asp-for="RecommendedSatoshiPerByte[index].FeeRate" />
|
<input type="hidden" asp-for="RecommendedSatoshiPerByte[index].FeeRate" />
|
||||||
@@ -165,8 +162,8 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="card">
|
<div class="card border-0 my-4">
|
||||||
<button id="advancedSettings" class="btn btn-light collapsed" type="button" data-toggle="collapse" data-target="#accordian-advanced" aria-expanded="false" aria-controls="accordian-advanced">
|
<button id="advancedSettings" class="btn btn-link text-secondary collapsed text-left" type="button" data-toggle="collapse" data-target="#accordian-advanced" aria-expanded="false" aria-controls="accordian-advanced">
|
||||||
Advanced settings
|
Advanced settings
|
||||||
</button>
|
</button>
|
||||||
<div id="accordian-advanced" class="collapse" aria-labelledby="accordian-advanced-header" data-parent="#accordian-advanced">
|
<div id="accordian-advanced" class="collapse" aria-labelledby="accordian-advanced-header" data-parent="#accordian-advanced">
|
||||||
@@ -196,7 +193,7 @@
|
|||||||
<a href="https://docs.btcpayserver.org/Wallet/#rbf-replace-by-fee" target="_blank">
|
<a href="https://docs.btcpayserver.org/Wallet/#rbf-replace-by-fee" target="_blank">
|
||||||
<span class="fa fa-question-circle-o" title="More information..."></span>
|
<span class="fa fa-question-circle-o" title="More information..."></span>
|
||||||
</a>
|
</a>
|
||||||
<select asp-for="AllowFeeBump" class="form-control">
|
<select asp-for="AllowFeeBump" class="form-control w-auto">
|
||||||
<option value="Maybe">Randomize for higher privacy</option>
|
<option value="Maybe">Randomize for higher privacy</option>
|
||||||
<option value="Yes">Yes</option>
|
<option value="Yes">Yes</option>
|
||||||
<option value="No">No</option>
|
<option value="No">No</option>
|
||||||
@@ -211,17 +208,17 @@
|
|||||||
<span asp-validation-for="PayJoinBIP21" class="text-danger"></span>
|
<span asp-validation-for="PayJoinBIP21" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="form-group">
|
<div class="form-group mt-4 mb-0">
|
||||||
<button id="toggleInputSelection" type="submit" name="command" value="toggle-input-selection" class="btn btn-sm btn-secondary">Toggle coin selection</button>
|
<button id="toggleInputSelection" type="submit" name="command" value="toggle-input-selection" class="btn btn-secondary">Toggle coin selection</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group d-flex mt-2">
|
<div class="form-group d-flex mt-2">
|
||||||
<partial name="WalletSigningMenu" model="@((Model.CryptoCode, Model.NBXSeedAvailable))"/>
|
<partial name="WalletSigningMenu" model="@((Model.CryptoCode, Model.NBXSeedAvailable))"/>
|
||||||
<button type="submit" name="command" value="add-output" class="ml-1 btn btn-secondary">Add another destination</button>
|
<button type="submit" name="command" value="add-output" class="ml-2 btn btn-secondary">Add another destination</button>
|
||||||
<button type="button" id="bip21parse" class="ml-1 btn btn-secondary" title="Paste BIP21/Address"><i class="fa fa-paste"></i></button>
|
<button type="button" id="bip21parse" class="ml-2 btn btn-secondary" title="Paste BIP21/Address"><i class="fa fa-paste"></i></button>
|
||||||
<button type="button" id="scanqrcode" class="ml-1 btn btn-secondary only-for-js" data-toggle="modal" data-target="#scanModal" title="Scan BIP21/Address with camera"><i class="fa fa-camera"></i></button>
|
<button type="button" id="scanqrcode" class="ml-2 btn btn-secondary only-for-js" data-toggle="modal" data-target="#scanModal" title="Scan BIP21/Address with camera"><i class="fa fa-camera"></i></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -231,12 +228,7 @@
|
|||||||
{
|
{
|
||||||
<bundle name="wwwroot/bundles/wallet-send-bundle.min.js" asp-append-version="true"></bundle>
|
<bundle name="wwwroot/bundles/wallet-send-bundle.min.js" asp-append-version="true"></bundle>
|
||||||
<style>
|
<style>
|
||||||
.remove-destination-btn{
|
.remove-destination-btn { font-size: 1.5rem; }
|
||||||
font-size: 1.5rem;
|
.remove-destination-btn:hover { border-color: var(--btcpay-color-danger); }
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
.remove-destination-btn:hover{
|
|
||||||
background-color: #CCCCCC;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,22 +6,13 @@
|
|||||||
}
|
}
|
||||||
@if (TempData.HasStatusMessage())
|
@if (TempData.HasStatusMessage())
|
||||||
{
|
{
|
||||||
<div class="row">
|
<partial name="_StatusMessage" />
|
||||||
<div class="col-md-10 text-center">
|
|
||||||
<partial name="_StatusMessage" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<h4 class="mb-3">Additional wallet information</h4>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-10">
|
<div class="col-md-8 col-lg-6">
|
||||||
<p>
|
|
||||||
Additional information about your wallet
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<form method="post" asp-action="WalletSettings">
|
<form method="post" asp-action="WalletSettings">
|
||||||
<input type="hidden" asp-for="StoreName"/>
|
<input type="hidden" asp-for="StoreName"/>
|
||||||
<input type="hidden" asp-for="UriScheme"/>
|
<input type="hidden" asp-for="UriScheme"/>
|
||||||
@@ -45,35 +36,38 @@
|
|||||||
}
|
}
|
||||||
@for (int i = 0; i < Model.AccountKeys.Count; i++)
|
@for (int i = 0; i < Model.AccountKeys.Count; i++)
|
||||||
{
|
{
|
||||||
<hr/>
|
<hr class="my-4"/>
|
||||||
<h5>Account key @i</h5>
|
|
||||||
|
<h4 class="mb-3">Account key @i</h4>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="@Model.AccountKeys[i].AccountKey"></label>
|
<label asp-for="@Model.AccountKeys[i].AccountKey"></label>
|
||||||
<input asp-for="@Model.AccountKeys[i].AccountKey" class="form-control" readonly/>
|
<input asp-for="@Model.AccountKeys[i].AccountKey" class="form-control" readonly/>
|
||||||
<span asp-validation-for="@Model.AccountKeys[i].AccountKey" class="text-danger"></span>
|
<span asp-validation-for="@Model.AccountKeys[i].AccountKey" class="text-danger"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-row">
|
||||||
<label asp-for="@Model.AccountKeys[i].MasterFingerprint"></label>
|
<div class="form-group col-auto">
|
||||||
<input asp-for="@Model.AccountKeys[i].MasterFingerprint" class="form-control"/>
|
<label asp-for="@Model.AccountKeys[i].MasterFingerprint"></label>
|
||||||
<span asp-validation-for="@Model.AccountKeys[i].MasterFingerprint" class="text-danger"></span>
|
<input asp-for="@Model.AccountKeys[i].MasterFingerprint" class="form-control" style="max-width:16ch;"/>
|
||||||
</div>
|
<span asp-validation-for="@Model.AccountKeys[i].MasterFingerprint" class="text-danger"></span>
|
||||||
<div class="form-group">
|
</div>
|
||||||
<label asp-for="@Model.AccountKeys[i].AccountKeyPath"></label>
|
<div class="form-group col-auto">
|
||||||
<input asp-for="@Model.AccountKeys[i].AccountKeyPath" class="form-control"/>
|
<label asp-for="@Model.AccountKeys[i].AccountKeyPath"></label>
|
||||||
<span asp-validation-for="@Model.AccountKeys[i].AccountKeyPath" class="text-danger"></span>
|
<input asp-for="@Model.AccountKeys[i].AccountKeyPath" class="form-control" style="max-width:16ch;" />
|
||||||
|
<span asp-validation-for="@Model.AccountKeys[i].AccountKeyPath" class="text-danger"></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@if (Model.IsMultiSig)
|
@if (Model.IsMultiSig)
|
||||||
{
|
{
|
||||||
<div class="form-group">
|
<div class="form-check form-check-inline">
|
||||||
<label asp-for="SelectedSigningKey"></label>
|
<input asp-for="SelectedSigningKey" class="form-check-input" type="radio" value="@Model.AccountKeys[i].AccountKey"/>
|
||||||
<input asp-for="SelectedSigningKey" type="radio" value="@Model.AccountKeys[i].AccountKey"/>
|
<label asp-for="SelectedSigningKey" class="form-check-label"></label>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<div class="form-group d-flex mt-2">
|
<div class="form-group d-flex mt-3">
|
||||||
<button name="command" type="submit" class="btn btn-primary" value="save">Save</button>
|
<button name="command" type="submit" class="btn btn-primary mr-2" value="save">Save</button>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button class="ml-1 btn btn-secondary dropdown-toggle" type="button" id="SettingsMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<button class="btn btn-secondary dropdown-toggle" type="button" id="SettingsMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
Other actions...
|
Other actions...
|
||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu" aria-labelledby="SendMenu">
|
<div class="dropdown-menu" aria-labelledby="SendMenu">
|
||||||
@@ -82,7 +76,6 @@
|
|||||||
{
|
{
|
||||||
<button name="command" type="submit" class="dropdown-item" value="view-seed">View seed</button>
|
<button name="command" type="submit" class="dropdown-item" value="view-seed">View seed</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (Model.UriScheme == "bitcoin")
|
@if (Model.UriScheme == "bitcoin")
|
||||||
{
|
{
|
||||||
<button type="button" class="dropdown-item register-wallet" data-storename="@Model.StoreName" data-scheme="@Model.UriScheme" data-url="@Url.Action("WalletSend", "Wallets", new {walletId = Context.GetRouteValue("walletId"), bip21 = "%s"})">Open this bitcoin wallet on payment links</button>
|
<button type="button" class="dropdown-item register-wallet" data-storename="@Model.StoreName" data-scheme="@Model.UriScheme" data-url="@Url.Action("WalletSend", "Wallets", new {walletId = Context.GetRouteValue("walletId"), bip21 = "%s"})">Open this bitcoin wallet on payment links</button>
|
||||||
|
|||||||
Reference in New Issue
Block a user