public static TransactionViewModel Create(ITransaction ninjaTransaction, IReadOnlyDictionary <string, IAssetDefinition> assetDictionary, MixedTransactionType?offchainType = null) { if (ninjaTransaction == null) { return(null); } var bc = ninjaTransaction.TransactionsByAssets.First(p => !p.IsColored); var colored = ninjaTransaction.TransactionsByAssets.Where(p => p.IsColored).OrderBy(p => p.AssetId); var assetDic = AssetDictionary.Create(assetDictionary); var result = new TransactionViewModel { TransactionId = ninjaTransaction.TransactionId, IsCoinBase = ninjaTransaction.IsCoinBase, IsColor = ninjaTransaction.IsColor, Block = BlockViewModel.Create(ninjaTransaction.Block), AssetsCount = ninjaTransaction.TransactionsByAssets.Count(p => p.IsColored), IsConfirmed = ninjaTransaction.Block != null, Bitcoin = BitcoinAsset.Create(ninjaTransaction.Fees, ninjaTransaction.IsCoinBase, bc.TransactionIn.Union(colored.SelectMany(p => p.TransactionIn)), bc.TransactionsOut.Union(colored.SelectMany(p => p.TransactionsOut)), assetDic), ColoredAssets = colored.Select(p => ColoredAsset.Create(p, assetDic)), InputsCount = ninjaTransaction.InputsCount, OutputsCount = ninjaTransaction.OutputsCount, OffchainType = offchainType }; return(result); }
public static ColoredAsset Create(IInOutsByAsset inOutsByAsset, AssetDictionary assetDictionary) { var divisibility = assetDictionary.GetAssetProp(inOutsByAsset.AssetId, p => p.Divisibility, 0); var assetShortName = assetDictionary.GetAssetProp(inOutsByAsset.AssetId, p => p.NameShort, null); var ins = inOutsByAsset.TransactionIn.Select(p => In.Create(p, divisibility, inOutsByAsset.TransactionsOut, assetShortName)).ToList(); var outs = inOutsByAsset.TransactionsOut.Select(p => Out.Create(p, divisibility, assetShortName)).ToList(); var insWithoutChange = ins.Select(p => p.Clone <In>()).ToList(); var outsWithoutChange = outs.Select(p => p.Clone <Out>()).ToList(); var showChange = false; AssetHelper.CalculateWithReturnedChange(ins, outs, ref showChange); if (ins.All(p => p.Value == 0) && outs.All(p => p.Value == 0)) { ins = ins.Take(1).ToList(); outs = outs.Take(1).ToList(); } else { ins = ins.Where(p => p.Value != 0).ToList(); outs = outs.Where(p => p.Value != 0).ToList(); } var issuedQuantity = (-1) * outs.Sum(p => p.Value); var destroyedQuantity = (-1) * ins.Sum(p => p.Value); var result = new ColoredAsset { AssetId = inOutsByAsset.AssetId, Divisibility = divisibility, Name = assetDictionary.GetAssetProp(inOutsByAsset.AssetId, p => p.Name, inOutsByAsset.AssetId), IconImageUrl = assetDictionary.GetAssetProp(inOutsByAsset.AssetId, p => p.IconUrl, null), AggregatedIns = AssetHelper.GroupByAddress(ins), AggregatedOuts = AssetHelper.GroupByAddress(outs), AggregatedInsWithoutChange = AssetHelper.GroupByAddress(insWithoutChange), AggregatedOutsWithoutChange = AssetHelper.GroupByAddress(outsWithoutChange), ShowWithoutChange = showChange, IssedQuantity = issuedQuantity, DestroyedQuantity = destroyedQuantity, ShortName = assetDictionary.GetAssetProp(inOutsByAsset.AssetId, p => p.NameShort, null), IsKnown = assetDictionary.Dic.ContainsKey(inOutsByAsset.AssetId) }; return(result); }