Ejemplo n.º 1
0
        private void DumpBalances(Chain chain, IToken token)
        {
            var symbol = token.Symbol;

            Console.WriteLine($"Analysing {symbol} balances on {chain.Name} chain");

            var list = new List <BalanceEntry>();

            balances[symbol] = list;

            var fungible = token.IsFungible();

            var prefix = fungible ? BalanceSheet.MakePrefix(symbol) : System.Text.Encoding.UTF8.GetBytes($".ids.{symbol}");

            var store = chain.Storage;

            var stakeMapKey = SmartContract.GetKeyForField(NativeContractKind.Stake, "_stakeMap", true);
            var stakeMap    = new StorageMap(stakeMapKey, store);
            //var stakeCount = stakeMap.Count();

            var addresses = new HashSet <Address>();

            decimal total = 0;

            store.Visit((key, value) =>
            {
                if (HasPrefix(prefix, key))
                {
                    var diff = key.Length - prefix.Length;
                    if (diff < Address.LengthInBytes)
                    {
                        return;
                    }

                    var bytes = new byte[Address.LengthInBytes];

                    ByteArrayUtils.CopyBytes(key, prefix.Length, bytes, 0, bytes.Length);

                    var addr = Address.FromBytes(bytes);

                    BigInteger amount;

                    if (!fungible)
                    {
                        if (addresses.Contains(addr))
                        {
                            return; // already visited
                        }

                        var newKey = ByteArrayUtils.ConcatBytes(prefix, bytes);
                        var map    = new StorageMap(newKey, store);

                        amount = map.Count();
                    }
                    else
                    {
                        if (value.Length > 0)
                        {
                            amount = BigInteger.FromSignedArray(value);
                        }
                        else
                        {
                            amount = 0;
                        }

                        if (symbol == DomainSettings.StakingTokenSymbol && stakeMap.ContainsKey <Address>(addr))
                        {
                            var temp = stakeMap.Get <Address, EnergyStake>(addr);
                            amount  += temp.stakeAmount;
                        }
                    }

                    if (amount < 1)
                    {
                        return;
                    }

                    addresses.Add(addr);

                    var dec = UnitConversion.ToDecimal(amount, token.Decimals);
                    total  += dec;


                    list.Add(new BalanceEntry(addr.Text, dec));
                }
            }, uint.MaxValue, new byte[0]);

            /*
             * if (symbol == DomainSettings.StakingTokenSymbol)
             * {
             *  var masterListKey = GetKeyForField<StakeContract>("_mastersList");
             *  var masterList = new StorageList(masterListKey, storage);
             *  var masterCount = masterList.Count();
             *  for (int i = 0; i < masterCount; i++)
             *  {
             *      var master = masterList.Get<EnergyMaster>(i);
             *      if (addresses.Contains(master.address))
             *      {
             *          continue;
             *      }
             *
             *      var temp = stakeMap.Get<Address, EnergyAction>(master.address);
             *
             *      string s;
             *
             *      if (PrettyPrint)
             *      {
             *          var stake = UnitConversion.ToDecimal(temp.totalAmount, decimals);
             *          s = stake.ToString();
             *          total += stake;
             *      }
             *      else
             *      {
             *          s = temp.totalAmount.ToString();
             *      }
             *
             *      Console.WriteLine($"{master.address.Text},{symbol},{s}");
             *  }
             * }*/

            totals[symbol] = total;

            if (list.Count == 0)
            {
                return;
            }

            list.Sort((x, y) => y.value.CompareTo(x.value));

            var lines = new List <string>();

            list.ForEach(x => lines.Add($"{x.address},{symbol},{x.value}"));
            File.WriteAllLines($"{outputFolder}/{chain.Name}_balances_{symbol}.csv", lines);
        }
Ejemplo n.º 2
0
        static void DumpBalances(string symbol, int decimals)
        {
            var prefix = BalanceSheet.MakePrefix(symbol);

            var storage = new KeyStoreStorage(store);

            var stakeMapKey = GetKeyForField <StakeContract>("_stakes");
            var stakeMap    = new StorageMap(stakeMapKey, storage);
            var stakeCount  = stakeMap.Count();

            var addresses = new HashSet <Address>();

            //Console.WriteLine($"************ BALANCE LIST FOR {symbol} ************");

            decimal total = 0;

            store.Visit((key, value) =>
            {
                if (HasPrefix(prefix, key))
                {
                    var bytes = new byte[key.Length - prefix.Length];
                    ByteArrayUtils.CopyBytes(key, prefix.Length, bytes, 0, bytes.Length);

                    var addr = Address.FromBytes(bytes);
                    if (addr.IsSystem || addr.Text == "P2KFNXEbt65rQiWqogAzqkVGMqFirPmqPw8mQyxvRKsrXV8")
                    {
                        return;
                    }

                    BigInteger amount;

                    if (value.Length > 0)
                    {
                        amount = BigInteger.FromSignedArray(value);
                    }
                    else
                    {
                        amount = 0;
                    }

                    /*if (symbol == DomainSettings.StakingTokenSymbol && stakeMap.ContainsKey<Address>(addr))
                     * {
                     *  var temp = stakeMap.Get<Address, EnergyStake>(addr);
                     *  amount += temp.stakeAmount;
                     * }*/

                    addresses.Add(addr);

                    string s;

                    if (PrettyPrint)
                    {
                        var dec = UnitConversion.ToDecimal(amount, decimals);
                        total  += dec;
                        s       = dec.ToString();
                    }
                    else
                    {
                        s = amount.ToString();
                    }

                    Console.WriteLine($"{addr.Text},{symbol},{s}");
                }
            });

            /*
             * if (symbol == DomainSettings.StakingTokenSymbol)
             * {
             *  var masterListKey = GetKeyForField<StakeContract>("_mastersList");
             *  var masterList = new StorageList(masterListKey, storage);
             *  var masterCount = masterList.Count();
             *  for (int i = 0; i < masterCount; i++)
             *  {
             *      var master = masterList.Get<EnergyMaster>(i);
             *      if (addresses.Contains(master.address))
             *      {
             *          continue;
             *      }
             *
             *      var temp = stakeMap.Get<Address, EnergyAction>(master.address);
             *
             *      string s;
             *
             *      if (PrettyPrint)
             *      {
             *          var stake = UnitConversion.ToDecimal(temp.totalAmount, decimals);
             *          s = stake.ToString();
             *          total += stake;
             *      }
             *      else
             *      {
             *          s = temp.totalAmount.ToString();
             *      }
             *
             *      Console.WriteLine($"{master.address.Text},{symbol},{s}");
             *  }
             * }*/

            if (PrettyPrint)
            {
                Console.WriteLine($"Total,{symbol},{total}");
            }
        }