diff --git a/BTCPayServerPlugins.sln b/BTCPayServerPlugins.sln
index 9a59434..2eaa38a 100644
--- a/BTCPayServerPlugins.sln
+++ b/BTCPayServerPlugins.sln
@@ -53,6 +53,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BTCPayServer.Plugins.FileSe
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BTCPayServer.Plugins.DynamicReports", "Plugins\BTCPayServer.Plugins.DynamicReports\BTCPayServer.Plugins.DynamicReports.csproj", "{BCB4E68D-089F-481E-A3AE-FC9CED6AA34D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BTCPayServer.Plugins.Bringin", "Plugins\BTCPayServer.Plugins.Bringin\BTCPayServer.Plugins.Bringin.csproj", "{D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -253,6 +255,14 @@ Global
{BCB4E68D-089F-481E-A3AE-FC9CED6AA34D}.Altcoins-Debug|Any CPU.Build.0 = Debug|Any CPU
{BCB4E68D-089F-481E-A3AE-FC9CED6AA34D}.Altcoins-Release|Any CPU.ActiveCfg = Debug|Any CPU
{BCB4E68D-089F-481E-A3AE-FC9CED6AA34D}.Altcoins-Release|Any CPU.Build.0 = Debug|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Altcoins-Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Altcoins-Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Altcoins-Release|Any CPU.ActiveCfg = Debug|Any CPU
+ {D4AFEC95-64D4-4FC4-9AE4-B82F4C6D6E29}.Altcoins-Release|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{B19C9F52-DC47-466D-8B5C-2D202B7B003F} = {9E04ECE9-E304-4FF2-9CBC-83256E6C6962}
diff --git a/Plugins/BTCPayServer.Plugins.Bringin/BTCPayServer.Plugins.Bringin.csproj b/Plugins/BTCPayServer.Plugins.Bringin/BTCPayServer.Plugins.Bringin.csproj
new file mode 100644
index 0000000..6d37b70
--- /dev/null
+++ b/Plugins/BTCPayServer.Plugins.Bringin/BTCPayServer.Plugins.Bringin.csproj
@@ -0,0 +1,35 @@
+
+
+
+ net6.0
+ 10
+
+
+
+
+ Dynamic Reports
+ Allows you to create custom reports using SQL.
+ 1.0.0
+
+
+
+ true
+ false
+ true
+
+
+
+
+
+ StaticWebAssetsEnabled=false
+ false
+ runtime;native;build;buildTransitive;contentFiles
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/BTCPayServer.Plugins.Bringin/Class1.cs b/Plugins/BTCPayServer.Plugins.Bringin/Class1.cs
new file mode 100644
index 0000000..99295df
--- /dev/null
+++ b/Plugins/BTCPayServer.Plugins.Bringin/Class1.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using BTCPayServer.JsonConverters;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace BTCPayServer.Plugins.Bringin;
+
+public class BringinClient
+{
+ public BringinClient(string apiKey, HttpClient httpClient)
+ {
+ ApiKey = apiKey;
+ HttpClient = httpClient;
+ }
+
+ private string ApiKey { get; set; }
+ private HttpClient HttpClient { get; set; }
+
+
+ public async Task GetUserId()
+ {
+ var response = await HttpClient.GetAsync($"/api/v0/user/user-id");
+ var content = await response.Content.ReadAsStringAsync();
+ if (response.IsSuccessStatusCode) return JObject.Parse(content)["userId"].ToString();
+ var error = JObject.Parse(content).ToObject();
+ throw new BringinException(error);
+ }
+
+ public async Task GetRate(string ticker = "BTCEUR")
+ {
+ var request = new {ticker};
+ var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
+ var response = await HttpClient.PostAsync($"/api/v0/offramp/rates", content);
+ var responseContent = await response.Content.ReadAsStringAsync();
+ if (response.IsSuccessStatusCode) return JObject.Parse(responseContent).ToObject();
+ var error = JObject.Parse(responseContent).ToObject();
+ throw new BringinException(error);
+ }
+
+ public async Task PlaceOrder(CreateOrderRequest request)
+ {
+ var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
+ var response = await HttpClient.PostAsync($"/api/v0/offramp/order/lightning", content);
+ var responseContent = await response.Content.ReadAsStringAsync();
+ if (response.IsSuccessStatusCode) return JObject.Parse(responseContent).ToObject();
+ var error = JObject.Parse(responseContent).ToObject();
+ throw new BringinException(error);
+ }
+
+ public async Task GetOrderInfo(GetOrderRequest request)
+ {
+ var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
+ var response = await HttpClient.PostAsync($"/api/v0/offramp/order/lightning", content);
+ var responseContent = await response.Content.ReadAsStringAsync();
+ if (response.IsSuccessStatusCode) return JObject.Parse(responseContent).ToObject();
+ var error = JObject.Parse(responseContent).ToObject();
+ throw new BringinException(error);
+ }
+
+ public class GetOrderResponse
+ {
+ public string OrderId { get; set; }
+ public string Status { get; set; }
+ public string SubType { get; set; }
+
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal SourceAmount { get; set; }
+
+ public string SourceCurrency { get; set; }
+
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal DestinationAmount { get; set; }
+
+ public string DestinationCurrency { get; set; }
+ public BringinPrice BringinPrice { get; set; }
+ }
+
+ public class BringinPrice
+ {
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal Price { get; set; }
+
+ public string Currency { get; set; }
+ }
+
+ public class GetOrderRequest
+ {
+ public string UserId { get; set; }
+ public string OrderId { get; set; }
+ }
+
+ public class CreateOrderResponse
+ {
+ public string Id { get; set; }
+
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal Amount { get; set; }
+
+ public string Invoice { get; set; }
+
+ [JsonConverter(typeof(NBitcoin.JsonConverters.DateTimeToUnixTimeConverter))]
+ [JsonProperty("expiresAt")]
+ public string Expiry { get; set; }
+ }
+
+ public class CreateOrderRequest
+ {
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal SourceAmount { get; set; }
+
+ [JsonProperty("ipAddress")] public string IP { get; set; }
+ }
+
+ public class RateResponse
+ {
+ public string Ticker { get; set; }
+ public string Currency { get; set; }
+
+ [JsonConverter(typeof(NBitcoin.JsonConverters.DateTimeToUnixTimeConverter))]
+ public string Timestamp { get; set; }
+
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal Price { get; set; }
+
+ [JsonConverter(typeof(NumericStringJsonConverter))]
+ public decimal BringinPrice { get; set; }
+ }
+
+ public class BringinErrorResponse
+ {
+ public string Message { get; set; }
+ public string StatusCode { get; set; }
+ public string ErrorCode { get; set; }
+ public JObject ErrorDetails { get; set; }
+ }
+}
+
+public class BringinException : Exception
+{
+ private readonly BringinClient.BringinErrorResponse _error;
+
+ public BringinException(BringinClient.BringinErrorResponse error)
+ {
+ _error = error;
+ }
+}
\ No newline at end of file
diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj
index d6a3f69..2139f58 100644
--- a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj
+++ b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj
@@ -13,7 +13,7 @@
Wabisabi Coinjoin
Allows you to integrate your btcpayserver store with coinjoins.
- 1.0.65
+ 1.0.66