mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-02-22 22:25:28 +01:00
Can pass pre filled amount and address to Send Wallet
This commit is contained in:
parent
3c58bff803
commit
da2fb876cb
3 changed files with 43 additions and 30 deletions
|
@ -32,17 +32,19 @@ namespace BTCPayServer.Controllers
|
||||||
[Route("wallets")]
|
[Route("wallets")]
|
||||||
[Authorize(AuthenticationSchemes = Policies.CookieAuthentication)]
|
[Authorize(AuthenticationSchemes = Policies.CookieAuthentication)]
|
||||||
[AutoValidateAntiforgeryToken]
|
[AutoValidateAntiforgeryToken]
|
||||||
public class WalletsController : Controller
|
public partial class WalletsController : Controller
|
||||||
{
|
{
|
||||||
private StoreRepository _Repo;
|
public StoreRepository Repository { get; }
|
||||||
private BTCPayNetworkProvider _NetworkProvider;
|
public BTCPayNetworkProvider NetworkProvider { get; }
|
||||||
|
public ExplorerClientProvider ExplorerClientProvider { get; }
|
||||||
|
|
||||||
private readonly UserManager<ApplicationUser> _userManager;
|
private readonly UserManager<ApplicationUser> _userManager;
|
||||||
private readonly IOptions<MvcJsonOptions> _mvcJsonOptions;
|
private readonly IOptions<MvcJsonOptions> _mvcJsonOptions;
|
||||||
private readonly NBXplorerDashboard _dashboard;
|
private readonly NBXplorerDashboard _dashboard;
|
||||||
private readonly ExplorerClientProvider _explorerProvider;
|
|
||||||
private readonly IFeeProviderFactory _feeRateProvider;
|
private readonly IFeeProviderFactory _feeRateProvider;
|
||||||
private readonly BTCPayWalletProvider _walletProvider;
|
private readonly BTCPayWalletProvider _walletProvider;
|
||||||
RateFetcher _RateProvider;
|
public RateFetcher RateFetcher { get; }
|
||||||
CurrencyNameTable _currencyTable;
|
CurrencyNameTable _currencyTable;
|
||||||
public WalletsController(StoreRepository repo,
|
public WalletsController(StoreRepository repo,
|
||||||
CurrencyNameTable currencyTable,
|
CurrencyNameTable currencyTable,
|
||||||
|
@ -56,13 +58,13 @@ namespace BTCPayServer.Controllers
|
||||||
BTCPayWalletProvider walletProvider)
|
BTCPayWalletProvider walletProvider)
|
||||||
{
|
{
|
||||||
_currencyTable = currencyTable;
|
_currencyTable = currencyTable;
|
||||||
_Repo = repo;
|
Repository = repo;
|
||||||
_RateProvider = rateProvider;
|
RateFetcher = rateProvider;
|
||||||
_NetworkProvider = networkProvider;
|
NetworkProvider = networkProvider;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_mvcJsonOptions = mvcJsonOptions;
|
_mvcJsonOptions = mvcJsonOptions;
|
||||||
_dashboard = dashboard;
|
_dashboard = dashboard;
|
||||||
_explorerProvider = explorerProvider;
|
ExplorerClientProvider = explorerProvider;
|
||||||
_feeRateProvider = feeRateProvider;
|
_feeRateProvider = feeRateProvider;
|
||||||
_walletProvider = walletProvider;
|
_walletProvider = walletProvider;
|
||||||
}
|
}
|
||||||
|
@ -70,10 +72,10 @@ namespace BTCPayServer.Controllers
|
||||||
public async Task<IActionResult> ListWallets()
|
public async Task<IActionResult> ListWallets()
|
||||||
{
|
{
|
||||||
var wallets = new ListWalletsViewModel();
|
var wallets = new ListWalletsViewModel();
|
||||||
var stores = await _Repo.GetStoresByUserId(GetUserId());
|
var stores = await Repository.GetStoresByUserId(GetUserId());
|
||||||
|
|
||||||
var onChainWallets = stores
|
var onChainWallets = stores
|
||||||
.SelectMany(s => s.GetSupportedPaymentMethods(_NetworkProvider)
|
.SelectMany(s => s.GetSupportedPaymentMethods(NetworkProvider)
|
||||||
.OfType<DerivationStrategy>()
|
.OfType<DerivationStrategy>()
|
||||||
.Select(d => ((Wallet: _walletProvider.GetWallet(d.Network),
|
.Select(d => ((Wallet: _walletProvider.GetWallet(d.Network),
|
||||||
DerivationStrategy: d.DerivationStrategyBase,
|
DerivationStrategy: d.DerivationStrategyBase,
|
||||||
|
@ -111,7 +113,7 @@ namespace BTCPayServer.Controllers
|
||||||
[ModelBinder(typeof(WalletIdModelBinder))]
|
[ModelBinder(typeof(WalletIdModelBinder))]
|
||||||
WalletId walletId)
|
WalletId walletId)
|
||||||
{
|
{
|
||||||
var store = await _Repo.FindStore(walletId.StoreId, GetUserId());
|
var store = await Repository.FindStore(walletId.StoreId, GetUserId());
|
||||||
DerivationStrategy paymentMethod = GetPaymentMethod(walletId, store);
|
DerivationStrategy paymentMethod = GetPaymentMethod(walletId, store);
|
||||||
if (paymentMethod == null)
|
if (paymentMethod == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
|
@ -120,7 +122,7 @@ namespace BTCPayServer.Controllers
|
||||||
var transactions = await wallet.FetchTransactions(paymentMethod.DerivationStrategyBase);
|
var transactions = await wallet.FetchTransactions(paymentMethod.DerivationStrategyBase);
|
||||||
|
|
||||||
var model = new ListTransactionsViewModel();
|
var model = new ListTransactionsViewModel();
|
||||||
foreach(var tx in transactions.UnconfirmedTransactions.Transactions.Concat(transactions.ConfirmedTransactions.Transactions))
|
foreach (var tx in transactions.UnconfirmedTransactions.Transactions.Concat(transactions.ConfirmedTransactions.Transactions))
|
||||||
{
|
{
|
||||||
var vm = new ListTransactionsViewModel.TransactionViewModel();
|
var vm = new ListTransactionsViewModel.TransactionViewModel();
|
||||||
model.Transactions.Add(vm);
|
model.Transactions.Add(vm);
|
||||||
|
@ -139,29 +141,33 @@ namespace BTCPayServer.Controllers
|
||||||
[Route("{walletId}/send")]
|
[Route("{walletId}/send")]
|
||||||
public async Task<IActionResult> WalletSend(
|
public async Task<IActionResult> WalletSend(
|
||||||
[ModelBinder(typeof(WalletIdModelBinder))]
|
[ModelBinder(typeof(WalletIdModelBinder))]
|
||||||
WalletId walletId)
|
WalletId walletId, string defaultDestination = null, string defaultAmount = null)
|
||||||
{
|
{
|
||||||
if (walletId?.StoreId == null)
|
if (walletId?.StoreId == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
var store = await _Repo.FindStore(walletId.StoreId, GetUserId());
|
var store = await Repository.FindStore(walletId.StoreId, GetUserId());
|
||||||
DerivationStrategy paymentMethod = GetPaymentMethod(walletId, store);
|
DerivationStrategy paymentMethod = GetPaymentMethod(walletId, store);
|
||||||
if (paymentMethod == null)
|
if (paymentMethod == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
|
|
||||||
var storeData = store.GetStoreBlob();
|
var storeData = store.GetStoreBlob();
|
||||||
var rateRules = store.GetStoreBlob().GetRateRules(_NetworkProvider);
|
var rateRules = store.GetStoreBlob().GetRateRules(NetworkProvider);
|
||||||
rateRules.Spread = 0.0m;
|
rateRules.Spread = 0.0m;
|
||||||
var currencyPair = new Rating.CurrencyPair(paymentMethod.PaymentId.CryptoCode, GetCurrencyCode(storeData.DefaultLang) ?? "USD");
|
var currencyPair = new Rating.CurrencyPair(paymentMethod.PaymentId.CryptoCode, GetCurrencyCode(storeData.DefaultLang) ?? "USD");
|
||||||
WalletModel model = new WalletModel();
|
WalletModel model = new WalletModel()
|
||||||
model.ServerUrl = GetLedgerWebsocketUrl(this.HttpContext, walletId.CryptoCode, paymentMethod.DerivationStrategyBase);
|
{
|
||||||
model.CryptoCurrency = walletId.CryptoCode;
|
DefaultAddress = defaultDestination,
|
||||||
|
DefaultAmount = defaultAmount,
|
||||||
|
ServerUrl = GetLedgerWebsocketUrl(this.HttpContext, walletId.CryptoCode, paymentMethod.DerivationStrategyBase),
|
||||||
|
CryptoCurrency = walletId.CryptoCode
|
||||||
|
};
|
||||||
|
|
||||||
using (CancellationTokenSource cts = new CancellationTokenSource())
|
using (CancellationTokenSource cts = new CancellationTokenSource())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cts.CancelAfter(TimeSpan.FromSeconds(5));
|
cts.CancelAfter(TimeSpan.FromSeconds(5));
|
||||||
var result = await _RateProvider.FetchRate(currencyPair, rateRules).WithCancellation(cts.Token);
|
var result = await RateFetcher.FetchRate(currencyPair, rateRules).WithCancellation(cts.Token);
|
||||||
if (result.BidAsk != null)
|
if (result.BidAsk != null)
|
||||||
{
|
{
|
||||||
model.Rate = result.BidAsk.Center;
|
model.Rate = result.BidAsk.Center;
|
||||||
|
@ -173,7 +179,7 @@ namespace BTCPayServer.Controllers
|
||||||
model.RateError = $"{result.EvaluatedRule} ({string.Join(", ", result.Errors.OfType<object>().ToArray())})";
|
model.RateError = $"{result.EvaluatedRule} ({string.Join(", ", result.Errors.OfType<object>().ToArray())})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(Exception ex) { model.RateError = ex.Message; }
|
catch (Exception ex) { model.RateError = ex.Message; }
|
||||||
}
|
}
|
||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
@ -187,7 +193,7 @@ namespace BTCPayServer.Controllers
|
||||||
var ri = new RegionInfo(defaultLang);
|
var ri = new RegionInfo(defaultLang);
|
||||||
return ri.ISOCurrencySymbol;
|
return ri.ISOCurrencySymbol;
|
||||||
}
|
}
|
||||||
catch(ArgumentException) { }
|
catch (ArgumentException) { }
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +203,7 @@ namespace BTCPayServer.Controllers
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var paymentMethod = store
|
var paymentMethod = store
|
||||||
.GetSupportedPaymentMethods(_NetworkProvider)
|
.GetSupportedPaymentMethods(NetworkProvider)
|
||||||
.OfType<DerivationStrategy>()
|
.OfType<DerivationStrategy>()
|
||||||
.FirstOrDefault(p => p.PaymentId.PaymentType == Payments.PaymentTypes.BTCLike && p.PaymentId.CryptoCode == walletId.CryptoCode);
|
.FirstOrDefault(p => p.PaymentId.PaymentType == Payments.PaymentTypes.BTCLike && p.PaymentId.CryptoCode == walletId.CryptoCode);
|
||||||
return paymentMethod;
|
return paymentMethod;
|
||||||
|
@ -257,7 +263,7 @@ namespace BTCPayServer.Controllers
|
||||||
BTCPayNetwork network = null;
|
BTCPayNetwork network = null;
|
||||||
if (cryptoCode != null)
|
if (cryptoCode != null)
|
||||||
{
|
{
|
||||||
network = _NetworkProvider.GetNetwork(cryptoCode);
|
network = NetworkProvider.GetNetwork(cryptoCode);
|
||||||
if (network == null)
|
if (network == null)
|
||||||
throw new FormatException("Invalid value for crypto code");
|
throw new FormatException("Invalid value for crypto code");
|
||||||
}
|
}
|
||||||
|
@ -403,7 +409,7 @@ namespace BTCPayServer.Controllers
|
||||||
if (!strategy.Segwit)
|
if (!strategy.Segwit)
|
||||||
{
|
{
|
||||||
var parentHashes = usedCoins.Select(c => c.Outpoint.Hash).ToHashSet();
|
var parentHashes = usedCoins.Select(c => c.Outpoint.Hash).ToHashSet();
|
||||||
var explorer = _explorerProvider.GetExplorerClient(network);
|
var explorer = ExplorerClientProvider.GetExplorerClient(network);
|
||||||
var getTransactionAsyncs = parentHashes.Select(h => (Op: explorer.GetTransactionAsync(h), Hash: h)).ToList();
|
var getTransactionAsyncs = parentHashes.Select(h => (Op: explorer.GetTransactionAsync(h), Hash: h)).ToList();
|
||||||
foreach (var getTransactionAsync in getTransactionAsyncs)
|
foreach (var getTransactionAsync in getTransactionAsyncs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,6 +15,9 @@ namespace BTCPayServer.Models.WalletViewModels
|
||||||
get;
|
get;
|
||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
public string DefaultAddress { get; set; }
|
||||||
|
public string DefaultAmount { get; set; }
|
||||||
|
|
||||||
public decimal? Rate { get; set; }
|
public decimal? Rate { get; set; }
|
||||||
public int Divisibility { get; set; }
|
public int Divisibility { get; set; }
|
||||||
public string Fiat { get; set; }
|
public string Fiat { get; set; }
|
||||||
|
|
|
@ -15,7 +15,12 @@ $(function () {
|
||||||
var recommendedFees = "";
|
var recommendedFees = "";
|
||||||
var recommendedBalance = "";
|
var recommendedBalance = "";
|
||||||
var cryptoCode = $("#cryptoCode").val();
|
var cryptoCode = $("#cryptoCode").val();
|
||||||
|
if (srvModel.defaultAddress !== null) {
|
||||||
|
$("#destination-textbox").val(srvModel.defaultAddress);
|
||||||
|
}
|
||||||
|
if (srvModel.defaultAmount !== null) {
|
||||||
|
$("#amount-textbox").val(srvModel.defaultAmount);
|
||||||
|
}
|
||||||
function WriteAlert(type, message) {
|
function WriteAlert(type, message) {
|
||||||
$("#walletAlert").removeClass("alert-danger");
|
$("#walletAlert").removeClass("alert-danger");
|
||||||
$("#walletAlert").removeClass("alert-warning");
|
$("#walletAlert").removeClass("alert-warning");
|
||||||
|
@ -31,9 +36,9 @@ $(function () {
|
||||||
$("#" + prefix + "-error").css("display", "none");
|
$("#" + prefix + "-error").css("display", "none");
|
||||||
$("#" + prefix + "-success").css("display", "none");
|
$("#" + prefix + "-success").css("display", "none");
|
||||||
|
|
||||||
$("#" + prefix+"-" + type).css("display", "block");
|
$("#" + prefix + "-" + type).css("display", "block");
|
||||||
|
|
||||||
$("." + prefix +"-label").text(message);
|
$("." + prefix + "-label").text(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
$("#sendform").on("submit", function (elem) {
|
$("#sendform").on("submit", function (elem) {
|
||||||
|
@ -133,8 +138,7 @@ $(function () {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bridge.sendCommand('test', null, 5)
|
bridge.sendCommand('test', null, 5)
|
||||||
.catch(function (reason)
|
.catch(function (reason) {
|
||||||
{
|
|
||||||
if (reason.name === "TransportError")
|
if (reason.name === "TransportError")
|
||||||
reason = "Are you running the ledger app with version equals or above 1.2.4?";
|
reason = "Are you running the ledger app with version equals or above 1.2.4?";
|
||||||
Write('hw', 'error', reason);
|
Write('hw', 'error', reason);
|
||||||
|
|
Loading…
Add table
Reference in a new issue