public void GetPluginLogs_Test()
        {
            var logEvents = new List <LogEvent>();

            for (int i = 0; i < 5; i++)
            {
                logEvents.Add(new LogEvent {
                    Name = "LogEvent" + i
                });
            }

            var transactionTrace = new TransactionTrace
            {
                PreTraces =
                {
                    new TransactionTrace
                    {
                        ExecutionStatus = ExecutionStatus.Executed,
                        Logs            = { logEvents[0] }
                    },
                    new TransactionTrace
                    {
                        ExecutionStatus = ExecutionStatus.Canceled,
                        Logs            = { logEvents[1] }
                    }
                },
                InlineTraces =
                {
                    new TransactionTrace
                    {
                        ExecutionStatus = ExecutionStatus.Executed,
                        Logs            = { logEvents[2] }
                    }
                },
                PostTraces =
                {
                    new TransactionTrace
                    {
                        ExecutionStatus = ExecutionStatus.Executed,
                        Logs            = { logEvents[3] }
                    },
                    new TransactionTrace
                    {
                        ExecutionStatus = ExecutionStatus.Canceled,
                        Logs            = { logEvents[4] }
                    }
                }
            };

            var logs = transactionTrace.GetPluginLogs().ToList();

            logs.Count.ShouldBe(2);
            logs.ShouldContain(logEvents[0]);
            logs.ShouldContain(logEvents[3]);
        }
Exemple #2
0
        private TransactionResult GetTransactionResult(TransactionTrace trace, long blockHeight)
        {
            var txResult = new TransactionResult
            {
                TransactionId = trace.TransactionId,
                BlockNumber   = blockHeight,
            };

            if (!trace.IsSuccessful())
            {
                // Is failed.
                txResult.Status = TransactionResultStatus.Failed;
                if (trace.ExecutionStatus == ExecutionStatus.Undefined)
                {
                    // Cannot find specific contract method.
                    txResult.Error = ExecutionStatus.Undefined.ToString();
                }
                else
                {
                    txResult.Error = trace.Error;
                    if (trace.ExecutionStatus != ExecutionStatus.Prefailed || IsExecutionStoppedByPrePlugin(trace))
                    {
                        txResult.Logs.AddRange(trace.GetPluginLogs());
                        txResult.UpdateBloom();
                    }
                }
            }
            else
            {
                // Is successful.
                txResult.Status      = TransactionResultStatus.Mined;
                txResult.ReturnValue = trace.ReturnValue;
                txResult.Logs.AddRange(trace.FlattenedLogs);

                txResult.UpdateBloom();
            }

            return(txResult);
        }
Exemple #3
0
        private TransactionResult GetTransactionResult(TransactionTrace trace, long blockHeight)
        {
            if (!trace.IsSuccessful())
            {
                if (trace.ExecutionStatus == ExecutionStatus.Undefined)
                {
                    // Cannot find specific contract method.
                    return(new TransactionResult
                    {
                        TransactionId = trace.TransactionId,
                        Status = TransactionResultStatus.Unexecutable,
                        BlockNumber = blockHeight,
                        Error = ExecutionStatus.Undefined.ToString()
                    });
                }

                // Show log events if pre-txs executed successfully.
                var isContainLogEvents = trace.PreTraces.All(pt => pt.ExecutionStatus == ExecutionStatus.Executed);

                if (trace.ExecutionStatus == ExecutionStatus.Prefailed)
                {
                    if (isContainLogEvents)
                    {
                        // All pre-txs succeeded, but one plugin stopped tx execution.
                        // Need to add log events to tx result, as well as show the error message in this situation.
                        var txResult = new TransactionResult
                        {
                            TransactionId = trace.TransactionId,
                            Status        = TransactionResultStatus.Failed,
                            ReturnValue   = trace.ReturnValue,
                            BlockNumber   = blockHeight,
                            Logs          = { trace.GetPluginLogs() },
                            Error         = ExecutionStatus.ExecutionStoppedByPrePlugin.ToString()
                        };
                        txResult.UpdateBloom();
                        return(txResult);
                    }

                    return(new TransactionResult
                    {
                        TransactionId = trace.TransactionId,
                        Status = TransactionResultStatus.Unexecutable,
                        BlockNumber = blockHeight,
                        Error = trace.Error
                    });
                }

                // Just failed.
                {
                    var txResult = new TransactionResult
                    {
                        TransactionId = trace.TransactionId,
                        Status        = TransactionResultStatus.Failed,
                        BlockNumber   = blockHeight,
                        Error         = trace.Error,
                        Logs          = { trace.GetPluginLogs() }
                    };
                    txResult.UpdateBloom();
                    return(txResult);
                }
            }

            {
                // Is successful.
                var txResult = new TransactionResult
                {
                    TransactionId = trace.TransactionId,
                    Status        = TransactionResultStatus.Mined,
                    ReturnValue   = trace.ReturnValue,
                    BlockNumber   = blockHeight,
                    Logs          = { trace.FlattenedLogs }
                };
                txResult.UpdateBloom();
                return(txResult);
            }
        }