diff --git a/BTCPayServer.Tests/RateRulesTest.cs b/BTCPayServer.Tests/RateRulesTest.cs index 3a62bb448..2d3ce1446 100644 --- a/BTCPayServer.Tests/RateRulesTest.cs +++ b/BTCPayServer.Tests/RateRulesTest.cs @@ -141,6 +141,7 @@ namespace BTCPayServer.Tests // Make sure can handle pairs builder = new StringBuilder(); builder.AppendLine("BTC_USD = kraken(BTC_USD)"); + Assert.True(RateRules.TryParse(builder.ToString(), out rules)); rule2 = rules.GetRuleFor(CurrencyPair.Parse("BTC_USD")); rule2.ExchangeRates.SetRate("kraken", CurrencyPair.Parse("BTC_USD"), new BidAsk(6000m, 6100m)); Assert.True(rule2.Reevaluate()); @@ -151,6 +152,18 @@ namespace BTCPayServer.Tests Assert.True(rule2.Reevaluate()); Assert.Equal("1 / (6000, 6100)", rule2.ToString(true)); Assert.Equal(1m/6100m, rule2.Value.Value); + + // Make sure the inverse has more priority than X_X or CDNT_X + builder = new StringBuilder(); + builder.AppendLine("EUR_CDNT = 10"); + builder.AppendLine("CDNT_BTC = CDNT_EUR * EUR_BTC;"); + builder.AppendLine("CDNT_X = CDNT_BTC * BTC_X;"); + builder.AppendLine("X_X = coinaverage(X_X);"); + Assert.True(RateRules.TryParse(builder.ToString(), out rules)); + rule2 = rules.GetRuleFor(CurrencyPair.Parse("CDNT_EUR")); + rule2.ExchangeRates.SetRate("coinaverage", CurrencyPair.Parse("BTC_USD"), new BidAsk(6000m, 6100m)); + Assert.True(rule2.Reevaluate()); + Assert.Equal("1 / 10", rule2.ToString(false)); } } } diff --git a/BTCPayServer/Rating/RateRules.cs b/BTCPayServer/Rating/RateRules.cs index cc744d376..7d2b898a6 100644 --- a/BTCPayServer/Rating/RateRules.cs +++ b/BTCPayServer/Rating/RateRules.cs @@ -148,9 +148,9 @@ namespace BTCPayServer.Rating foreach (var pair in new[] { (Pair: p, Priority: 0, Inverse: false), - (Pair: new CurrencyPair(p.Left, "X"), Priority: 1, Inverse: false), - (Pair: new CurrencyPair("X", p.Right), Priority: 1, Inverse: false), - (Pair: invP, Priority: 2, Inverse: true), + (Pair: invP, Priority: 1, Inverse: true), + (Pair: new CurrencyPair(p.Left, "X"), Priority: 2, Inverse: false), + (Pair: new CurrencyPair("X", p.Right), Priority: 2, Inverse: false), (Pair: new CurrencyPair(invP.Left, "X"), Priority: 3, Inverse: true), (Pair: new CurrencyPair("X", invP.Right), Priority: 3, Inverse: true), (Pair: new CurrencyPair("X", "X"), Priority: 4, Inverse: false)