mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-02-22 06:21:44 +01:00
Merge pull request #1041 from Kukks/satscurrency
Add sats as a native currency
This commit is contained in:
commit
dc7733abcd
3 changed files with 54 additions and 0 deletions
|
@ -99,6 +99,8 @@ namespace BTCPayServer.Rating
|
||||||
RuleList ruleList;
|
RuleList ruleList;
|
||||||
|
|
||||||
decimal _Spread;
|
decimal _Spread;
|
||||||
|
private const string ImplicitSatsRule = "SATS_X = SATS_BTC * BTC_X;\nSATS_BTC = 0.00000001;\n";
|
||||||
|
|
||||||
public decimal Spread
|
public decimal Spread
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -126,6 +128,7 @@ namespace BTCPayServer.Rating
|
||||||
}
|
}
|
||||||
public static bool TryParse(string str, out RateRules rules, out List<RateRulesErrors> errors)
|
public static bool TryParse(string str, out RateRules rules, out List<RateRulesErrors> errors)
|
||||||
{
|
{
|
||||||
|
str = ImplicitSatsRule + str;
|
||||||
rules = null;
|
rules = null;
|
||||||
errors = null;
|
errors = null;
|
||||||
var expression = CSharpSyntaxTree.ParseText(str, new CSharpParseOptions(LanguageVersion.Default).WithKind(SourceCodeKind.Script));
|
var expression = CSharpSyntaxTree.ParseText(str, new CSharpParseOptions(LanguageVersion.Default).WithKind(SourceCodeKind.Script));
|
||||||
|
@ -195,6 +198,7 @@ namespace BTCPayServer.Rating
|
||||||
{
|
{
|
||||||
return root.NormalizeWhitespace("", "\n")
|
return root.NormalizeWhitespace("", "\n")
|
||||||
.ToFullString()
|
.ToFullString()
|
||||||
|
.Replace(ImplicitSatsRule, string.Empty, StringComparison.OrdinalIgnoreCase)
|
||||||
.Replace("{\n", string.Empty, StringComparison.OrdinalIgnoreCase)
|
.Replace("{\n", string.Empty, StringComparison.OrdinalIgnoreCase)
|
||||||
.Replace("\n}", string.Empty, StringComparison.OrdinalIgnoreCase);
|
.Replace("\n}", string.Empty, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,8 @@ namespace BTCPayServer.Tests
|
||||||
(Pair: "BTC_CAD", Expected: "coinbase(BTC_CAD)"),
|
(Pair: "BTC_CAD", Expected: "coinbase(BTC_CAD)"),
|
||||||
(Pair: "DOGE_CAD", Expected: "bittrex(DOGE_BTC) * coinbase(BTC_CAD) * 1.1"),
|
(Pair: "DOGE_CAD", Expected: "bittrex(DOGE_BTC) * coinbase(BTC_CAD) * 1.1"),
|
||||||
(Pair: "LTC_CAD", Expected: "coinaverage(LTC_CAD) * 1.02"),
|
(Pair: "LTC_CAD", Expected: "coinaverage(LTC_CAD) * 1.02"),
|
||||||
|
(Pair: "SATS_CAD", Expected: "0.00000001 * coinbase(BTC_CAD)"),
|
||||||
|
(Pair: "Sats_USD", Expected: "0.00000001 * kraken(BTC_USD)")
|
||||||
};
|
};
|
||||||
foreach (var test in tests)
|
foreach (var test in tests)
|
||||||
{
|
{
|
||||||
|
@ -102,6 +104,8 @@ namespace BTCPayServer.Tests
|
||||||
(Pair: "BTC_CAD", Expected: "coinbase(BTC_CAD)", ExpectedExchangeRates: "coinbase(BTC_CAD)"),
|
(Pair: "BTC_CAD", Expected: "coinbase(BTC_CAD)", ExpectedExchangeRates: "coinbase(BTC_CAD)"),
|
||||||
(Pair: "DOGE_CAD", Expected: "bittrex(DOGE_BTC) * coinbase(BTC_CAD) * 1.1", ExpectedExchangeRates: "bittrex(DOGE_BTC),coinbase(BTC_CAD)"),
|
(Pair: "DOGE_CAD", Expected: "bittrex(DOGE_BTC) * coinbase(BTC_CAD) * 1.1", ExpectedExchangeRates: "bittrex(DOGE_BTC),coinbase(BTC_CAD)"),
|
||||||
(Pair: "LTC_CAD", Expected: "coinaverage(LTC_CAD) * 1.02", ExpectedExchangeRates: "coinaverage(LTC_CAD)"),
|
(Pair: "LTC_CAD", Expected: "coinaverage(LTC_CAD) * 1.02", ExpectedExchangeRates: "coinaverage(LTC_CAD)"),
|
||||||
|
(Pair: "SATS_USD", Expected: "0.00000001 * kraken(BTC_USD)", ExpectedExchangeRates: "kraken(BTC_USD)"),
|
||||||
|
(Pair: "SATS_EUR", Expected: "0.00000001 * coinbase(BTC_EUR)", ExpectedExchangeRates: "coinbase(BTC_EUR)")
|
||||||
};
|
};
|
||||||
foreach (var test in tests2)
|
foreach (var test in tests2)
|
||||||
{
|
{
|
||||||
|
@ -189,6 +193,37 @@ namespace BTCPayServer.Tests
|
||||||
rule2.ExchangeRates.SetRate("coinaverage", CurrencyPair.Parse("BTC_USD"), new BidAsk(6000m, 6100m));
|
rule2.ExchangeRates.SetRate("coinaverage", CurrencyPair.Parse("BTC_USD"), new BidAsk(6000m, 6100m));
|
||||||
Assert.True(rule2.Reevaluate());
|
Assert.True(rule2.Reevaluate());
|
||||||
Assert.Equal($"({(1m / 6100m).ToString(CultureInfo.InvariantCulture)}, {(1m / 6000m).ToString(CultureInfo.InvariantCulture)})", rule2.ToString(true));
|
Assert.Equal($"({(1m / 6100m).ToString(CultureInfo.InvariantCulture)}, {(1m / 6000m).ToString(CultureInfo.InvariantCulture)})", rule2.ToString(true));
|
||||||
|
|
||||||
|
// Make sure defining value in sats works
|
||||||
|
builder = new StringBuilder();
|
||||||
|
builder.AppendLine("BTC_USD = kraken(BTC_USD)");
|
||||||
|
builder.AppendLine("BTC_X = coinbase(BTC_X)");
|
||||||
|
Assert.True(RateRules.TryParse(builder.ToString(), out rules));
|
||||||
|
rule2 = rules.GetRuleFor(CurrencyPair.Parse("SATS_USD"));
|
||||||
|
rule2.ExchangeRates.SetRate("kraken", CurrencyPair.Parse("BTC_USD"), new BidAsk(6000m, 6100m));
|
||||||
|
Assert.True(rule2.Reevaluate());
|
||||||
|
Assert.Equal("0.00000001 * (6000, 6100)", rule2.ToString(true));
|
||||||
|
Assert.Equal(0.00006m, rule2.BidAsk.Bid);
|
||||||
|
rule2 = rules.GetRuleFor(CurrencyPair.Parse("USD_SATS"));
|
||||||
|
rule2.ExchangeRates.SetRate("kraken", CurrencyPair.Parse("BTC_USD"), new BidAsk(6000m, 6100m));
|
||||||
|
Assert.True(rule2.Reevaluate());
|
||||||
|
Assert.Equal("1 / (0.00000001 * (6000, 6100))", rule2.ToString(true));
|
||||||
|
Assert.Equal(1m / 0.000061m, rule2.BidAsk.Bid);
|
||||||
|
|
||||||
|
// testing rounding
|
||||||
|
rule2 = rules.GetRuleFor(CurrencyPair.Parse("Sats_EUR"));
|
||||||
|
rule2.ExchangeRates.SetRate("coinbase", CurrencyPair.Parse("BTC_EUR"), new BidAsk(1.23m, 2.34m));
|
||||||
|
Assert.True(rule2.Reevaluate());
|
||||||
|
Assert.Equal("0.00000001 * (1.23, 2.34)", rule2.ToString(true));
|
||||||
|
Assert.Equal(0.0000000234m, rule2.BidAsk.Ask);
|
||||||
|
Assert.Equal(0.0000000123m, rule2.BidAsk.Bid);
|
||||||
|
|
||||||
|
rule2 = rules.GetRuleFor(CurrencyPair.Parse("EUR_Sats"));
|
||||||
|
rule2.ExchangeRates.SetRate("coinbase", CurrencyPair.Parse("BTC_EUR"), new BidAsk(1.23m, 2.34m));
|
||||||
|
Assert.True(rule2.Reevaluate());
|
||||||
|
Assert.Equal("1 / (0.00000001 * (1.23, 2.34))", rule2.ToString(true));
|
||||||
|
Assert.Equal(1m / 0.0000000123m, rule2.BidAsk.Ask);
|
||||||
|
Assert.Equal(1m / 0.0000000234m, rule2.BidAsk.Bid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,12 @@ namespace BTCPayServer.Services.Rates
|
||||||
{
|
{
|
||||||
AddCurrency(_CurrencyProviders, network.CryptoCode, network.Divisibility, network.CryptoCode);
|
AddCurrency(_CurrencyProviders, network.CryptoCode, network.Divisibility, network.CryptoCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_CurrencyProviders.TryAdd("SATS",
|
||||||
|
new NumberFormatInfo()
|
||||||
|
{
|
||||||
|
CurrencySymbol = "sats", CurrencyDecimalDigits = 0, CurrencyPositivePattern = 3
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return _CurrencyProviders.TryGet(currency.ToUpperInvariant());
|
return _CurrencyProviders.TryGet(currency.ToUpperInvariant());
|
||||||
}
|
}
|
||||||
|
@ -189,6 +195,15 @@ namespace BTCPayServer.Services.Rates
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dico.TryAdd("SATS", new CurrencyData()
|
||||||
|
{
|
||||||
|
Code = "SATS",
|
||||||
|
Crypto = true,
|
||||||
|
Divisibility = 0,
|
||||||
|
Name = "Satoshis",
|
||||||
|
Symbol = "Sats",
|
||||||
|
});
|
||||||
|
|
||||||
return dico.Values.ToArray();
|
return dico.Values.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue