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