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