mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
* Disable shapeshift and use changelly * UI to manage changelly payment method * wip on changelly api * Add in Vue component for changelly and remove target currency from payment method * add changelly merhcant id * Small fixes to get Conversion to load * wip fixing the component * fix merge conflict * fixes to UI * remove debug, fix fee calc and move changelly to own partials * Update ChangellyController.cs * move original vue setup back to checkout * Update core.js * Extracting Changelly component to js file * Proposal for loading spinner * remove zone * imrpove changelly ui * add in changelly config checks * try new method to calculate amount + remove to currency from list * abstract changelly lofgic to provider and reduce dependency on js component * Add UTs for Changelly * refactor changelly backend * fix failing UT * add shitcoin tax * pr changes * pr changes * WIP: getting rid of changelly dependency * client caching, compiling code, cleaner code * Cleaner changelly * fiat! * updat i18n, css and error styler * default keys * pr changes part 1 * part2 * fix tests * fix loader alignment and retry button responsiveness * final pr change
126 lines
4.2 KiB
C#
126 lines
4.2 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using BTCPayServer.Models;
|
|
using BTCPayServer.Payments.Changelly;
|
|
using BTCPayServer.Rating;
|
|
using BTCPayServer.Services.Rates;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace BTCPayServer.Controllers
|
|
{
|
|
[Route("[controller]/{storeId}")]
|
|
public class ChangellyController : Controller
|
|
{
|
|
private readonly ChangellyClientProvider _changellyClientProvider;
|
|
private readonly BTCPayNetworkProvider _btcPayNetworkProvider;
|
|
private readonly RateFetcher _RateProviderFactory;
|
|
|
|
public ChangellyController(ChangellyClientProvider changellyClientProvider,
|
|
BTCPayNetworkProvider btcPayNetworkProvider,
|
|
RateFetcher rateProviderFactory)
|
|
{
|
|
_RateProviderFactory = rateProviderFactory ?? throw new ArgumentNullException(nameof(rateProviderFactory));
|
|
|
|
_changellyClientProvider = changellyClientProvider;
|
|
_btcPayNetworkProvider = btcPayNetworkProvider;
|
|
}
|
|
|
|
[HttpGet]
|
|
[Route("currencies")]
|
|
public async Task<IActionResult> GetCurrencyList(string storeId)
|
|
{
|
|
if (!TryGetChangellyClient(storeId, out var actionResult, out var client))
|
|
{
|
|
return actionResult;
|
|
}
|
|
|
|
try
|
|
{
|
|
return Ok(await client.GetCurrenciesFull());
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
return BadRequest(new BitpayErrorModel()
|
|
{
|
|
Error = e.Message
|
|
});
|
|
}
|
|
}
|
|
|
|
[HttpGet]
|
|
[Route("calculate")]
|
|
public async Task<IActionResult> CalculateAmount(string storeId, string fromCurrency, string toCurrency,
|
|
decimal toCurrencyAmount)
|
|
{
|
|
if (!TryGetChangellyClient(storeId, out var actionResult, out var client))
|
|
{
|
|
return actionResult;
|
|
}
|
|
|
|
|
|
if (fromCurrency.Equals("usd", StringComparison.InvariantCultureIgnoreCase)
|
|
|| fromCurrency.Equals("eur", StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
var store = HttpContext.GetStoreData();
|
|
var rules = store.GetStoreBlob().GetRateRules(_btcPayNetworkProvider);
|
|
var rate = await _RateProviderFactory.FetchRate(new CurrencyPair(toCurrency, fromCurrency), rules);
|
|
if (rate.BidAsk == null) return BadRequest();
|
|
var flatRate = rate.BidAsk.Center;
|
|
return Ok(flatRate * toCurrencyAmount);
|
|
}
|
|
|
|
|
|
try
|
|
{
|
|
var callCounter = 0;
|
|
var response1 = await client.GetExchangeAmount(fromCurrency, toCurrency, 1);
|
|
var currentAmount = response1;
|
|
while (true)
|
|
{
|
|
if (callCounter > 10)
|
|
{
|
|
BadRequest();
|
|
}
|
|
|
|
var response2 = await client.GetExchangeAmount(fromCurrency, toCurrency, currentAmount);
|
|
callCounter++;
|
|
if (response2 < toCurrencyAmount)
|
|
{
|
|
var newCurrentAmount = ((toCurrencyAmount / response2) * 1m) * currentAmount;
|
|
|
|
currentAmount = newCurrentAmount;
|
|
}
|
|
else
|
|
{
|
|
return Ok(currentAmount);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
return BadRequest(new BitpayErrorModel()
|
|
{
|
|
Error = e.Message
|
|
});
|
|
}
|
|
}
|
|
|
|
private bool TryGetChangellyClient(string storeId, out IActionResult actionResult,
|
|
out Changelly changelly)
|
|
{
|
|
changelly = null;
|
|
actionResult = null;
|
|
storeId = storeId ?? HttpContext.GetStoreData()?.Id;
|
|
|
|
if (_changellyClientProvider.TryGetChangellyClient(storeId, out var error, out changelly))
|
|
return true;
|
|
actionResult = BadRequest(new BitpayErrorModel()
|
|
{
|
|
Error = error
|
|
});
|
|
return false;
|
|
|
|
}
|
|
}
|
|
}
|