Can pass pre filled amount and address to Send Wallet

This commit is contained in:
nicolas.dorier 2018-10-09 23:48:14 +09:00
parent 3c58bff803
commit da2fb876cb
3 changed files with 43 additions and 30 deletions

View file

@ -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)
{ {

View file

@ -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; }

View file

@ -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);