using Managing.Domain.Trades; using Managing.Infrastructure.Evm.Models.Gmx; using Managing.Infrastructure.Evm.Referentials; using Nethereum.Web3; using System.Numerics; using static Managing.Common.Enums; namespace Managing.Infrastructure.Evm.Services.Gmx; public static class GmxHelpers { public static decimal GetQuantityForLeverage(decimal quantity, decimal? leverage) { return leverage.HasValue ? leverage.Value * quantity : quantity; } public static (List CollateralTokens, List IndexTokens, List IsLong) GetPositionQueryData(List contractAddress) { var collateralToken = new List(); var indexTokens = new List(); var isLongs = new List(); foreach (var token in contractAddress) { collateralToken.Add(token); indexTokens.Add(token); isLongs.Add(true); } foreach (var token in contractAddress) { collateralToken.Add(Arbitrum.Address.USDC); indexTokens.Add(token); isLongs.Add(false); } return (collateralToken, indexTokens, isLongs); } public static List GetIndexesRange(int lastIndex) { var indexes = new List(); var limit = 15; var from = (lastIndex - limit) < 0 ? 0 : lastIndex - limit; for (int i = from; i <= lastIndex; i++) { indexes.Add(new BigInteger(i)); } return indexes; } public static BigInteger GetAcceptablePrice(decimal price, bool isLong) { decimal priceBasisPoints; var basisPointDivisor = 10000m; var allowedSlippage = 34m; var toDecimal = 30; if (isLong) { priceBasisPoints = basisPointDivisor - allowedSlippage; } else { priceBasisPoints = basisPointDivisor + allowedSlippage; } var test = Web3.Convert.ToWei(price, toDecimal) * new BigInteger(priceBasisPoints); var priceLimit = test / Web3.Convert.ToWei(basisPointDivisor, 0); return priceLimit; } internal static BigInteger? GetGasLimit() { throw new NotImplementedException(); } internal static List Map(List orders, Ticker ticker) { return orders.ConvertAll(order => Map(order, ticker)); } private static Trade Map(GmxOrder order, Ticker ticker) { var trade = new Trade(DateTime.UtcNow, order.IsLong ? TradeDirection.Short : TradeDirection.Long, TradeStatus.Requested, GetTradeType(order.IsLong, order.TriggerAboveThreshold), ticker, Convert.ToDecimal(order.SizeDelta), Convert.ToDecimal(order.TriggerPrice), null, "", "" ); return trade; } public static bool GetTriggerAboveThreshold(bool isLong, TradeType tradeType) { if ((isLong && tradeType == TradeType.TakeProfit) || (!isLong && tradeType == TradeType.StopLoss)) { return true; } return false; } public static TradeType GetTradeType(bool isLong, bool isAboveThreshold) { if ((isLong && isAboveThreshold) || (!isLong && !isAboveThreshold)) { return TradeType.TakeProfit; } return TradeType.StopLoss; } internal static string GeTimeframe(Timeframe timeframe) { return timeframe switch { Timeframe.FiveMinutes => "5m", Timeframe.FifteenMinutes => "15m", Timeframe.ThirtyMinutes => "30m", Timeframe.OneHour => "1h", Timeframe.FourHour => "4h", Timeframe.OneDay => "1d", _ => throw new NotImplementedException(), }; } }