diff --git a/src/Managing.Application.Abstractions/Repositories/IEvmManager.cs b/src/Managing.Application.Abstractions/Repositories/IEvmManager.cs index 2c95f36e..dae00b0c 100644 --- a/src/Managing.Application.Abstractions/Repositories/IEvmManager.cs +++ b/src/Managing.Application.Abstractions/Repositories/IEvmManager.cs @@ -18,6 +18,7 @@ public interface IEvmManager string SignMessage(string message, string privateKey); string VerifySignature(string signature, string message); Task> GetBalances(Chain chain, int page, int pageSize, string publicAddress); + Task> GetAllBalances(Chain chain, string publicAddress); Task> GetAllBalancesOnAllChain(string publicAddress); Task> GetCandles(Ticker ticker, DateTime startDate, @@ -67,4 +68,11 @@ public interface IEvmManager Task SignMessageAsync(string embeddedWalletId, string address, string message); Task> GetPositions(Account account); + + /// + /// Clears the cached balances for a specific chain and address + /// + /// The blockchain chain + /// The public address + void ClearBalancesCache(Chain chain, string publicAddress); } \ No newline at end of file diff --git a/src/Managing.Infrastructure.Web3/EvmManager.cs b/src/Managing.Infrastructure.Web3/EvmManager.cs index 377a05cd..65dbe9d6 100644 --- a/src/Managing.Infrastructure.Web3/EvmManager.cs +++ b/src/Managing.Infrastructure.Web3/EvmManager.cs @@ -183,6 +183,16 @@ public class EvmManager : IEvmManager public async Task> GetAllBalances(Chain chain, string publicAddress) { + var cacheKey = $"balances_{chain.Name}_{publicAddress.ToLowerInvariant()}"; + + // Try to get from cache first + var cachedBalances = _cacheService.GetValue>(cacheKey); + if (cachedBalances != null) + { + return cachedBalances; + } + + // If not in cache, fetch from blockchain var balances = new List(); foreach (var ticker in TokenService.GetEligibleTickersForBalance()) @@ -205,9 +215,18 @@ public class EvmManager : IEvmManager etherBalance.Chain = chain; balances.Add(etherBalance); + // Save to cache for 5 minutes + _cacheService.SaveValue(cacheKey, balances, TimeSpan.FromMinutes(5)); + return balances; } + public void ClearBalancesCache(Chain chain, string publicAddress) + { + var cacheKey = $"balances_{chain.Name}_{publicAddress.ToLowerInvariant()}"; + _cacheService.RemoveValue(cacheKey); + } + public async Task GetTokenBalance(string chainName, Ticker ticker, string publicAddress) { var chain = ChainService.GetChain(chainName); diff --git a/src/Managing.Infrastructure.Web3/Services/ChainService.cs b/src/Managing.Infrastructure.Web3/Services/ChainService.cs index d60a9c98..b205e729 100644 --- a/src/Managing.Infrastructure.Web3/Services/ChainService.cs +++ b/src/Managing.Infrastructure.Web3/Services/ChainService.cs @@ -7,7 +7,7 @@ public static class ChainService { //private const string RPC_ARBITRUM = "https://convincing-smart-arm.arbitrum-mainnet.discover.quiknode.pro/561ad3fa1db431a2c728c2fdb1a62e8f94acf703/"; private const string RPC_ARBITRUM = - "https://convincing-smart-arm.arbitrum-mainnet.quiknode.pro/561ad3fa1db431a2c728c2fdb1a62e8f94acf703"; + "https://arb1.arbitrum.io/rpc"; private const string RPC_ARBITRUM_GOERLI = "https://arb-goerli.g.alchemy.com/v2/ZMkIiKtNvgY03UtWOjho0oqkQrNt_pyc"; private const string RPC_ETHEREUM = "https://mainnet.infura.io/v3/58f44d906ab345beadd03dd2b76348af";