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); }
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}"); } }