public static IEnumerable <LogEvent> GetPluginLogs(this TransactionTrace txTrace)
        {
            var logEvents = new RepeatedField <LogEvent>();

            foreach (var preTrace in txTrace.PreTraces)
            {
                if (preTrace.IsSuccessful())
                {
                    logEvents.AddRange(preTrace.FlattenedLogs);
                }
            }

            foreach (var postTrace in txTrace.PostTraces)
            {
                if (postTrace.IsSuccessful())
                {
                    logEvents.AddRange(postTrace.FlattenedLogs);
                }
            }

            return(logEvents);
        }
        public static bool IsSuccessful(this TransactionTrace txTrace)
        {
            if (txTrace.ExecutionStatus != ExecutionStatus.Executed)
            {
                return(false);
            }

            if (txTrace.PreTraces.Any(trace => !trace.IsSuccessful()))
            {
                return(false);
            }

            if (txTrace.InlineTraces.Any(trace => !trace.IsSuccessful()))
            {
                return(false);
            }

            if (txTrace.PostTraces.Any(trace => !trace.IsSuccessful()))
            {
                return(false);
            }

            return(true);
        }
        public static void SurfaceUpError(this TransactionTrace txTrace)
        {
            foreach (var inline in txTrace.InlineTraces)
            {
                inline.SurfaceUpError();
                if (inline.ExecutionStatus < txTrace.ExecutionStatus)
                {
                    txTrace.ExecutionStatus = inline.ExecutionStatus;
                    txTrace.Error           = $"{inline.Error}";
                }
            }

            if (txTrace.ExecutionStatus == ExecutionStatus.Postfailed)
            {
                foreach (var trace in txTrace.PostTraces)
                {
                    trace.SurfaceUpError();
                    if (!string.IsNullOrEmpty(trace.Error))
                    {
                        txTrace.Error += $"Post-Error: {trace.Error}";
                    }
                }
            }

            if (txTrace.ExecutionStatus == ExecutionStatus.Prefailed)
            {
                foreach (var trace in txTrace.PreTraces)
                {
                    trace.SurfaceUpError();
                    if (!string.IsNullOrEmpty(trace.Error))
                    {
                        txTrace.Error += $"Pre-Error: {trace.Error}";
                    }
                }
            }
        }