private BlockProcessor.TxAction ProcessAccountAbstractionTransaction( Block block, Transaction currentTx, int index, BlockReceiptsTracer receiptsTracer, ProcessingOptions processingOptions, LinkedHashSet <Transaction> transactionsInBlock) { int snapshot = receiptsTracer.TakeSnapshot(); BlockProcessor.TxAction action = ProcessTransaction(block, currentTx, index, receiptsTracer, processingOptions, transactionsInBlock, false); if (action != BlockProcessor.TxAction.Add) { return(action); } string?error = receiptsTracer.LastReceipt.Error; bool transactionSucceeded = string.IsNullOrEmpty(error); if (!transactionSucceeded) { receiptsTracer.Restore(snapshot); return(BlockProcessor.TxAction.Skip); } transactionsInBlock.Add(currentTx); _transactionProcessed?.Invoke(this, new TxProcessedEventArgs(index, currentTx, receiptsTracer.TxReceipts[index])); return(BlockProcessor.TxAction.Add); }
public override TxReceipt[] ProcessTransactions( Block block, ProcessingOptions processingOptions, BlockReceiptsTracer receiptsTracer, IReleaseSpec spec) { IEnumerable <Transaction> transactions = GetTransactions(block); int i = 0; LinkedHashSet <Transaction> transactionsInBlock = new(ByHashTxComparer.Instance); foreach (Transaction transaction in transactions) { if (IsAccountAbstractionTransaction(transaction)) { BlockProcessor.TxAction action = ProcessAccountAbstractionTransaction(block, transaction, i++, receiptsTracer, processingOptions, transactionsInBlock); if (action == BlockProcessor.TxAction.Stop) { break; } } else { BlockProcessor.TxAction action = ProcessTransaction(block, transaction, i++, receiptsTracer, processingOptions, transactionsInBlock); if (action == BlockProcessor.TxAction.Stop) { break; } } } _stateProvider.Commit(spec, receiptsTracer); _storageProvider.Commit(receiptsTracer); SetTransactions(block, transactionsInBlock); return(receiptsTracer.TxReceipts.ToArray()); }