@@ -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 etherPric e = ( await GetPrices ( new List < string > { "ethereum" } ) ) [ "ethereum" ] [ "usd" ] ;
var lastCandl e = await GetCandle ( Ticker . ETH ) ;
return new EvmBalance ( )
{ Balance = etherBalance , Price = etherPric e, TokenName = "ETH" , Value = etherBalance * etherPric e } ;
{ Balance = etherBalance , Price = lastCandle . Clos e, TokenName = "ETH" , Value = etherBalance * lastCandle . Clos e } ;
}
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 . Call GmxServiceAsync< List < Trade > > ( "/get-or der s" ,
new { address = account . Key , walletId = account . Secret , ticker = ticker . ToString ( ) } ) ;
var result = await _web3ProxyService . Get GmxServiceAsync< GetGmxTradesResponse > ( "/tra des" ,
new { account = account . Key , ticker = ticker . ToString ( ) } ) ;
return o rder s;
return result . Tra des ;
}
else
{