Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
            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);
            }