/// <summary> /// Format a token value according to its decimals and symbol /// eg "5000000000000000" becomes "50,000 SYM" /// </summary> public static async Task <string> PrettifyAsync(this BigInteger value, StandardTokenService sts) { var symbol = await sts.SymbolQueryAsync(); var decimals = await sts.DecimalsQueryAsync(); var valueFactored = value / BigInteger.Pow(10, decimals); return($"{valueFactored.ToString("N0")} {symbol}"); }
private async Task <string> WriteOHLC(TradeEvent ev, DateTimeOffset?timestamp) { try { string tokenSymbol; decimal tokenAmount, ethAmount, price = 0; TokenModel token; if (ev.TokenGet == NullAddress) { token = await _context.Token.FirstOrDefaultAsync(x => x.Token == ev.TokenGive); tokenSymbol = token.Symbol; var d = await _cache.GetOrCreateAsync(ev.TokenGive, entry => { entry.SlidingExpiration = TimeSpan.FromSeconds(5); var tokenContract = new StandardTokenService(_nethereumClient, ev.TokenGive); var decimals = tokenContract.DecimalsQueryAsync(new DecimalsFunction()).Result; return(Task.FromResult((decimal)Math.Pow(10, decimals))); }); tokenAmount = (decimal)BigInteger.DivRem(ev.AmountGive, new BigInteger(d), out var remainder); if (remainder > 0) { tokenAmount += (decimal)remainder / d; } ethAmount = UnitConversion.Convert.FromWei(ev.AmountGet, UnitConversion.EthUnit.Ether); if (tokenAmount > 0) { price = ethAmount / tokenAmount; } } else { token = await _context.Token.FirstOrDefaultAsync(x => x.Token == ev.TokenGet); tokenSymbol = token.Symbol; var d = await _cache.GetOrCreateAsync(ev.TokenGet, entry => { entry.SlidingExpiration = TimeSpan.FromSeconds(5); var tokenContract = new StandardTokenService(_nethereumClient, ev.TokenGive); var decimals = tokenContract.DecimalsQueryAsync(new DecimalsFunction()).Result; return(Task.FromResult((decimal)Math.Pow(10, decimals))); }); tokenAmount = (decimal)BigInteger.DivRem(ev.AmountGet, new BigInteger(d), out var remainder); if (remainder > 0) { tokenAmount += (decimal)remainder / d; } ethAmount = UnitConversion.Convert.FromWei(ev.AmountGive, UnitConversion.EthUnit.Ether); if (tokenAmount > 0) { price = ethAmount / tokenAmount; } } _ohclService.WriteOHLC(price, tokenAmount, token.Symbol, timestamp.Value.UtcDateTime); return(tokenSymbol); } catch (Exception e) { Console.WriteLine(e); throw; } }