@using BTCPayServer.Abstractions.Models @model BTCPayServer.Models.StoreViewModels.RatesViewModel @{ Layout = "../Shared/_NavLayout.cshtml"; ViewData.SetActivePage(StoreNavPages.Rates, "Rates", Context.GetStoreData().Id); }

@ViewData["Title"]

@if (!ViewContext.ModelState.IsValid) {
}
@if (Model.ShowScripting) {
Scripting

Rate script allows you to express precisely how you want to calculate rates for currency pairs.

We are retrieving the rate of each exchange either directly, or via CoinGecko (free).

@foreach (var exchange in Model.AvailableExchanges.Where(a => a.Source == BTCPayServer.Rating.RateSource.Direct)) { @exchange.Id  }

@foreach (var exchange in Model.AvailableExchanges.Where(a => a.Source == BTCPayServer.Rating.RateSource.Coingecko)) { @exchange.Id  }
} @if (Model.TestRateRules != null) {
Test Results:
@foreach (var result in Model.TestRateRules) { @if (result.Error) { } else { } }
@result.CurrencyPair @result.CurrencyPair@result.Rule
} @if (Model.ShowScripting) {

The script language is composed of several rules composed of a currency pair and a mathematic expression. The example below will use kraken for both LTC_USD and BTC_USD pairs.

                        
                            LTC_USD = kraken(LTC_USD);
                            BTC_USD = kraken(BTC_USD);
                        
                    

However, explicitely setting specific pairs like this can be a bit difficult. Instead, you can define a rule X_X which will match any currency pair. The following example will use kraken for getting the rate of any currency pair.

                        
                            X_X = kraken(X_X);
                        
                    

However, kraken does not support the BTC_CAD pair. For this reason you can add a rule mapping all X_CAD to ndax, a Canadian exchange.

                    
                            X_CAD = ndax(X_CAD);
                            X_X = kraken(X_X);
                        
                    

A given currency pair match the most specific rule. If two rules are matching and are as specific, the first rule will be chosen.

But now, what if you want to support DOGE? The problem with DOGE is that most exchange do not have any pair for it. But bittrex has a DOGE_BTC pair.
Luckily, the rule engine allow you to reference rules:

                    
                            DOGE_X = bittrex(DOGE_BTC) * BTC_X
                            X_CAD = ndax(X_CAD);
                            X_X = kraken(X_X);
                        
                    

With DOGE_USD will be expanded to bittrex(DOGE_BTC) * kraken(BTC_USD). And DOGE_CAD will be expanded to bittrex(DOGE_BTC) * ndax(BTC_CAD).
However, we advise you to write it that way to increase coverage so that DOGE_BTC is also supported:

                    
                            DOGE_X = DOGE_BTC * BTC_X
                            DOGE_BTC = bittrex(DOGE_BTC)
                            X_CAD = ndax(X_CAD);
                            X_X = kraken(X_X);
                        
                    

It is worth noting that the inverses of those pairs are automatically supported as well.
It means that the rule USD_DOGE = 1 / DOGE_USD implicitely exists.

} else {
Current Rates source is @Model.PreferredExchange.
}
%

Testing

Default Currency Pairs

@section PageFootContent { }