Update payload
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
using Managing.Domain.Users;
|
||||||
|
|
||||||
namespace Managing.Application.Abstractions.Services;
|
namespace Managing.Application.Abstractions.Services;
|
||||||
|
|
||||||
public interface IKaigenService
|
public interface IKaigenService
|
||||||
@@ -5,16 +7,16 @@ public interface IKaigenService
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Debits user credits for a backtest operation
|
/// Debits user credits for a backtest operation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userName">The username to debit</param>
|
/// <param name="user">The user to debit</param>
|
||||||
/// <param name="debitAmount">The amount to debit</param>
|
/// <param name="debitAmount">The amount to debit</param>
|
||||||
/// <returns>The request ID for tracking</returns>
|
/// <returns>The request ID for tracking</returns>
|
||||||
Task<string> DebitUserCreditsAsync(string userName, decimal debitAmount);
|
Task<string> DebitUserCreditsAsync(User user, decimal debitAmount);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Refunds user credits if debit operation fails
|
/// Refunds user credits if debit operation fails
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="requestId">The original request ID from debit operation</param>
|
/// <param name="requestId">The original request ID from debit operation</param>
|
||||||
/// <param name="userName">The username to refund</param>
|
/// <param name="user">The user to refund</param>
|
||||||
/// <returns>True if refund was successful</returns>
|
/// <returns>True if refund was successful</returns>
|
||||||
Task<bool> RefundUserCreditsAsync(string requestId, string userName);
|
Task<bool> RefundUserCreditsAsync(string requestId, User user);
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ namespace Managing.Application.Backtesting
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
creditRequestId = await _kaigenService.DebitUserCreditsAsync(user.Name, 3);
|
creditRequestId = await _kaigenService.DebitUserCreditsAsync(user, 3);
|
||||||
_logger.LogInformation("Successfully debited credits for user {UserName} with request ID {RequestId}",
|
_logger.LogInformation("Successfully debited credits for user {UserName} with request ID {RequestId}",
|
||||||
user.Name, creditRequestId);
|
user.Name, creditRequestId);
|
||||||
}
|
}
|
||||||
@@ -127,7 +127,7 @@ namespace Managing.Application.Backtesting
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var refundSuccess = await _kaigenService.RefundUserCreditsAsync(creditRequestId, user.Name);
|
var refundSuccess = await _kaigenService.RefundUserCreditsAsync(creditRequestId, user);
|
||||||
if (refundSuccess)
|
if (refundSuccess)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Successfully refunded credits for user {UserName} after backtest failure", user.Name);
|
_logger.LogInformation("Successfully refunded credits for user {UserName} after backtest failure", user.Name);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System.Net.Http.Json;
|
using System.Net.Http.Json;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using Managing.Application.Abstractions.Services;
|
using Managing.Application.Abstractions.Services;
|
||||||
|
using Managing.Domain.Users;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Nethereum.Signer;
|
using Nethereum.Signer;
|
||||||
@@ -56,22 +57,15 @@ public class KaigenService : IKaigenService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> DebitUserCreditsAsync(string userName, decimal debitAmount)
|
public async Task<string> DebitUserCreditsAsync(User user, decimal debitAmount)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var walletAddress = GetUserWalletAddress(user);
|
||||||
var requestId = Guid.NewGuid().ToString();
|
var requestId = Guid.NewGuid().ToString();
|
||||||
|
|
||||||
// Create the payload for signing
|
|
||||||
var payload = new
|
|
||||||
{
|
|
||||||
RequestId = requestId,
|
|
||||||
UserName = userName,
|
|
||||||
DebitAmount = debitAmount
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create the message to sign (concatenate the values)
|
// Create the message to sign (concatenate the values)
|
||||||
var message = $"{requestId}{userName}{debitAmount}";
|
var message = $"{requestId}{walletAddress}{debitAmount}";
|
||||||
|
|
||||||
// Sign the message
|
// Sign the message
|
||||||
var signature = SignMessage(message, _settings.PrivateKey);
|
var signature = SignMessage(message, _settings.PrivateKey);
|
||||||
@@ -80,13 +74,13 @@ public class KaigenService : IKaigenService
|
|||||||
var requestPayload = new
|
var requestPayload = new
|
||||||
{
|
{
|
||||||
requestId = requestId,
|
requestId = requestId,
|
||||||
userName = userName,
|
walletAddress = walletAddress,
|
||||||
debitAmount = debitAmount,
|
debitAmount = debitAmount,
|
||||||
signature = signature
|
signature = signature
|
||||||
};
|
};
|
||||||
|
|
||||||
_logger.LogInformation("Debiting {Amount} credits for user {UserName} with request ID {RequestId}",
|
_logger.LogInformation("Debiting {Amount} credits for user {UserName} (wallet: {WalletAddress}) with request ID {RequestId}",
|
||||||
debitAmount, userName, requestId);
|
debitAmount, user.Name, walletAddress, requestId);
|
||||||
|
|
||||||
var response = await _httpClient.PutAsJsonAsync(
|
var response = await _httpClient.PutAsJsonAsync(
|
||||||
$"{_settings.BaseUrl}{_settings.DebitEndpoint}",
|
$"{_settings.BaseUrl}{_settings.DebitEndpoint}",
|
||||||
@@ -102,24 +96,26 @@ public class KaigenService : IKaigenService
|
|||||||
}
|
}
|
||||||
|
|
||||||
var result = await response.Content.ReadFromJsonAsync<KaigenResponse>(_jsonOptions);
|
var result = await response.Content.ReadFromJsonAsync<KaigenResponse>(_jsonOptions);
|
||||||
_logger.LogInformation("Successfully debited {Amount} credits for user {UserName}",
|
_logger.LogInformation("Successfully debited {Amount} credits for user {UserName} (wallet: {WalletAddress})",
|
||||||
debitAmount, userName);
|
debitAmount, user.Name, walletAddress);
|
||||||
|
|
||||||
return requestId;
|
return requestId;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error debiting credits for user {UserName}", userName);
|
_logger.LogError(ex, "Error debiting credits for user {UserName}", user.Name);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> RefundUserCreditsAsync(string requestId, string userName)
|
public async Task<bool> RefundUserCreditsAsync(string requestId, User user)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var walletAddress = GetUserWalletAddress(user);
|
||||||
|
|
||||||
// Create the message to sign (concatenate the values)
|
// Create the message to sign (concatenate the values)
|
||||||
var message = $"{requestId}{userName}";
|
var message = $"{requestId}{walletAddress}";
|
||||||
|
|
||||||
// Sign the message
|
// Sign the message
|
||||||
var signature = SignMessage(message, _settings.PrivateKey);
|
var signature = SignMessage(message, _settings.PrivateKey);
|
||||||
@@ -128,12 +124,12 @@ public class KaigenService : IKaigenService
|
|||||||
var requestPayload = new
|
var requestPayload = new
|
||||||
{
|
{
|
||||||
requestId = requestId,
|
requestId = requestId,
|
||||||
userName = userName,
|
walletAddress = walletAddress,
|
||||||
signature = signature
|
signature = signature
|
||||||
};
|
};
|
||||||
|
|
||||||
_logger.LogInformation("Refunding credits for user {UserName} with request ID {RequestId}",
|
_logger.LogInformation("Refunding credits for user {UserName} (wallet: {WalletAddress}) with request ID {RequestId}",
|
||||||
userName, requestId);
|
user.Name, walletAddress, requestId);
|
||||||
|
|
||||||
var response = await _httpClient.PutAsJsonAsync(
|
var response = await _httpClient.PutAsJsonAsync(
|
||||||
$"{_settings.BaseUrl}{_settings.RefundEndpoint}",
|
$"{_settings.BaseUrl}{_settings.RefundEndpoint}",
|
||||||
@@ -148,16 +144,34 @@ public class KaigenService : IKaigenService
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("Successfully refunded credits for user {UserName}", userName);
|
_logger.LogInformation("Successfully refunded credits for user {UserName} (wallet: {WalletAddress})", user.Name, walletAddress);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error refunding credits for user {UserName}", userName);
|
_logger.LogError(ex, "Error refunding credits for user {UserName}", user.Name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetUserWalletAddress(User user)
|
||||||
|
{
|
||||||
|
if (user?.Accounts == null || !user.Accounts.Any())
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"No accounts found for user {user?.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the first account's key as the wallet address
|
||||||
|
var walletAddress = user.Accounts[0].Key;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(walletAddress))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"No wallet address found for user {user.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return walletAddress;
|
||||||
|
}
|
||||||
|
|
||||||
private string SignMessage(string message, string privateKey)
|
private string SignMessage(string message, string privateKey)
|
||||||
{
|
{
|
||||||
var signer = new EthereumMessageSigner();
|
var signer = new EthereumMessageSigner();
|
||||||
|
|||||||
Reference in New Issue
Block a user