Fix getbalance + fix get orders for bot

This commit is contained in:
2025-04-21 12:15:53 +02:00
parent 3113e5d278
commit 868c7bdb65
13 changed files with 140 additions and 90 deletions

View File

@@ -1,5 +1,6 @@
using System.Net.Http.Json;
using System.Numerics;
using Managing.Application.Abstractions;
using Managing.Application.Abstractions.Repositories;
using Managing.Common;
using Managing.Core;
@@ -29,6 +30,7 @@ using BalanceOfOutputDTO = Nethereum.Contracts.Standards.ERC20.ContractDefinitio
using Chain = Managing.Domain.Evm.Chain;
using TransferEventDTO = Nethereum.Contracts.Standards.ERC721.ContractDefinition.TransferEventDTO;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Managing.Infrastructure.Evm;
@@ -38,9 +40,9 @@ public class EvmManager : IEvmManager
private readonly HttpClient _httpClient;
private readonly string _password = "!StrongPassword94";
private readonly IEnumerable<ISubgraphPrices> _subgraphs;
private Dictionary<string, Dictionary<string, decimal>> _geckoPrices;
private readonly GmxV2Service _gmxV2Service;
private readonly IWeb3ProxyService _web3ProxyService;
private readonly ICacheService _cacheService;
private readonly List<Ticker> _eligibleTickers = new List<Ticker>()
{
@@ -49,44 +51,15 @@ public class EvmManager : IEvmManager
};
public EvmManager(IEnumerable<ISubgraphPrices> subgraphs,
IWeb3ProxyService web3ProxyService)
IWeb3ProxyService web3ProxyService, ICacheService cacheService)
{
var defaultChain = ChainService.GetEthereum();
_web3 = new Web3(defaultChain.RpcUrl);
_httpClient = new HttpClient();
_subgraphs = subgraphs;
_web3ProxyService = web3ProxyService;
_geckoPrices = _geckoPrices != null && _geckoPrices.Any()
? _geckoPrices
: new Dictionary<string, Dictionary<string, decimal>>();
_gmxV2Service = new GmxV2Service();
SetupPrices();
}
public void SetupPrices()
{
try
{
var geckoIds = new List<string>();
foreach (var ticker in Enum.GetValues<Ticker>())
{
var geckoId = TokenService.GetGeckoToken(ticker.ToString())?.Id;
if (geckoId != null)
{
geckoIds.Add(geckoId);
}
}
if (geckoIds != null && geckoIds.Count > 0 && !_geckoPrices.Any())
{
_geckoPrices = GetPrices(geckoIds).Result;
}
}
catch (Exception ex)
{
// TODO : Handle error
}
_cacheService = cacheService;
}
public async Task<decimal> GetAddressBalance(string address)
@@ -208,16 +181,15 @@ public class EvmManager : IEvmManager
{
var web3 = new Web3(chain.RpcUrl);
var etherBalance = Web3.Convert.FromWei(await web3.Eth.GetBalance.SendRequestAsync(account));
var etherPrice = (await GetPrices(new List<string> { "ethereum" }))["ethereum"]["usd"];
var lastCandle = await GetCandle(Ticker.ETH);
return new EvmBalance()
{ Balance = etherBalance, Price = etherPrice, TokenName = "ETH", Value = etherBalance * etherPrice };
{ Balance = etherBalance, Price = lastCandle.Close, TokenName = "ETH", Value = etherBalance * lastCandle.Close };
}
public async Task<List<EvmBalance>> GetAllBalances(Chain chain, string publicAddress)
{
var balances = new List<EvmBalance>();
SetupPrices();
foreach (var ticker in Enum.GetValues<Ticker>())
{
try
@@ -259,12 +231,8 @@ public class EvmManager : IEvmManager
.QueryAsync<BigInteger>(contractAddress, balanceOfMessage)
.ConfigureAwait(false);
var geckoId = TokenService.GetGeckoToken(ticker.ToString())?.Id;
if (geckoId == null)
return null;
var tokenUsdPrice = _geckoPrices[geckoId][Constants.Stablecoins.Usd.ToLowerInvariant()];
var lastCandle = await GetCandle(ticker);
var tokenUsdPrice = lastCandle.Close;
var tokenDecimal = TokenService.GetDecimal(ticker);
var balanceFromWei = Web3.Convert.FromWei(balance, tokenDecimal);
@@ -374,7 +342,7 @@ public class EvmManager : IEvmManager
return chainBalances;
}
public async Task<List<Candle>> GetCandles(SubgraphProvider subgraphProvider, Ticker ticker, DateTime startDate,
public async Task<List<Candle>> GetCandles(Ticker ticker, DateTime startDate,
Timeframe timeframe)
{
string gmxTimeframe = GmxHelpers.GeTimeframe(timeframe);
@@ -423,11 +391,21 @@ public class EvmManager : IEvmManager
return GmxV2Mappers.Map(tokenList).Where(t => _eligibleTickers.Contains(t)).ToList();
}
public async Task<Candle> GetCandle(SubgraphProvider subgraphProvider, Ticker ticker)
public async Task<Candle> GetCandle(Ticker ticker)
{
var lastPrices = await GetCandles(subgraphProvider, ticker, DateTime.UtcNow.AddMinutes(-15),
Timeframe.FiveMinutes);
return lastPrices.Last();
var key = $"lastcandle-{ticker}";
var cachedCandle = _cacheService.GetValue<Candle>(key);
if (cachedCandle == null)
{
var lastCandles = await GetCandles(ticker, DateTime.UtcNow.AddMinutes(-5),
Timeframe.OneMinute);
cachedCandle = lastCandles.Last();
_cacheService.SaveValue(key, cachedCandle, TimeSpan.FromMinutes(5));
}
return cachedCandle;
}
public async Task<bool> InitAddress(string publicAddress)
@@ -776,10 +754,10 @@ public class EvmManager : IEvmManager
{
if (account.IsPrivyWallet)
{
var orders = await _web3ProxyService.CallGmxServiceAsync<List<Trade>>("/get-orders",
new { address = account.Key, walletId = account.Secret, ticker = ticker.ToString() });
var result = await _web3ProxyService.GetGmxServiceAsync<GetGmxTradesResponse>("/trades",
new { account = account.Key, ticker = ticker.ToString() });
return orders;
return result.Trades;
}
else
{