Как конвертировать баланс BigInteger NEthereum из WEI в ETH?

Я использую этот простой код для получения балансов с NEthereum:

using System;
using System.Numerics;

namespace TestConsole
{
    class Program
    {
        static readonly BigInteger ethToWeiRatio = new BigInteger(1000000000000000000m);

        static void Main(string[] args)
        {
            var web3 = new Nethereum.Web3.Web3();
            var accountsTask = web3.Eth.Accounts.SendRequestAsync();
            accountsTask.Wait();
            var accounts = accountsTask.Result;
            foreach (var account in accounts)
            {
                Console.WriteLine("account " + account);
            }
            foreach (var account in accounts)
            {
                var balanceTask = web3.Eth.GetBalance.SendRequestAsync(account);
                balanceTask.Wait();
                var balance = balanceTask.Result;
                Console.WriteLine("account " + account + "; balance in wei: "
                                  + balance.Value);
            }
            foreach (var account in accounts)
            {
                var balanceTask = web3.Eth.GetBalance.SendRequestAsync(account);
                balanceTask.Wait();
                var balance = balanceTask.Result;
                Console.WriteLine("account " + account + "; balance in eth: "
                      + BigInteger.Divide(balance.Value, ethToWeiRatio));
            }
        }
    }
}

Первые foreachпетли работают, а третья нет. Я предполагаю, что балансы, выводимые во втором foreach, указаны в единицах Wei, поэтому мне пришлось преобразовать их в Eth. Но при этом результат равен 0 для обоих случаев, что неверно, поскольку балансы на разных счетах разные.

Это полный вывод:

account 0xd74c7d19e3bff6b150f76cac754a65df3b23b755
account 0xa9f4a7d4d7a163bc9f45e2e1e216b7f40ce79af5
account 0xd74c7d19e3bff6b150f76cac754a65df3b23b755; balance in wei: 542316352000000000
account 0xa9f4a7d4d7a163bc9f45e2e1e216b7f40ce79af5; balance in wei: 300000000000000000
account 0xd74c7d19e3bff6b150f76cac754a65df3b23b755; balance in eth: 0
account 0xa9f4a7d4d7a163bc9f45e2e1e216b7f40ce79af5; balance in eth: 0

ОБНОВЛЕНИЕ 1 : только что нашел уродливое обходное решение: decimal.Parse(balance.Value.ToString())/10000000000000000m.

ОБНОВЛЕНИЕ 2 : Автор библиотеки рекомендовал новый API: https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Util/UnitConversion.cs (еще не тестировал).

Что это за язык? С#?
NEthereum — это библиотека .NET, так что да, это C#.

Ответы (1)

В Web3 есть вспомогательная функция конвертера, аналогичная реализованной в web3.js.

Его можно использовать следующим образом:

web3.Convert.ToWei() или web3.Convert.FromWei()

или как статический метод Nethereum.Web3.Web3.Convert.ToWei() или Nethereum.Web3.Web3.Convert.FromWei()

пожалуйста, взгляните на код для различных перегрузок

https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Util/UnitConversion.cs

Только что попробовал ваш метод FromWei(), и он дает мне ту же проблему, возвращает 0. Так что мне все равно нужно использовать обходной путь :(
Интересно, что bigInteger не делает правильного деления, я проверю это позже.
Только что понял, что преобразование из и в Wei не обрабатывает десятичные разряды из-за BigInteger. У меня уже есть реализация для десятичных знаков. github.com/Nethereum/Netherum.Maker/blob/master/Nethereum.Maker/…
это в списке TODO.. добавить в конвертер
URL-адрес теперь 404: P
В библиотеке NEthereum это статический метод, который можно вызвать как Nethereum.Web3.Web3.Convert.FromWei(<numberInWei>); Он возвращает десятичное число, которое представляет собой значение eth.
Спасибо, @ThorkilVærge отредактировано, чтобы добавить больше информации.