コード例 #1
0
        /// <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}");
        }
コード例 #2
0
ファイル: EthereumService.cs プロジェクト: dyavolick/dex
        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;
            }
        }