private UserOperationSimulationResult SimulateValidation(
            Transaction transaction,
            UserOperation userOperation,
            BlockHeader parent,
            ITransactionProcessor transactionProcessor)
        {
            bool paymasterWhitelisted      = _whitelistedPaymasters.Contains(userOperation.Paymaster);
            UserOperationTxTracer txTracer = new(
                transaction,
                paymasterWhitelisted,
                userOperation.InitCode != Bytes.Empty, userOperation.Sender,
                userOperation.Paymaster,
                _entryPointContractAddress,
                _logger
                );

            transactionProcessor.Trace(transaction, parent, txTracer);

            FailedOp?failedOp = _userOperationTxBuilder.DecodeEntryPointOutputError(txTracer.Output);

            string?error = null;

            if (!txTracer.Success)
            {
                if (failedOp is not null)
                {
                    error = failedOp.ToString() !;
                }
                else
                {
                    error = txTracer.Error;
                }
                return(UserOperationSimulationResult.Failed(error));
            }

            UserOperationAccessList userOperationAccessList = new(txTracer.AccessedStorage);

            IDictionary <Address, Keccak> addressesToCodeHashes = new Dictionary <Address, Keccak>();

            foreach (Address accessedAddress in txTracer.AccessedAddresses)
            {
                addressesToCodeHashes[accessedAddress] = _stateProvider.GetCodeHash(accessedAddress);
            }

            return(new UserOperationSimulationResult()
            {
                Success = true,
                AccessList = userOperationAccessList,
                AddressesToCodeHashes = addressesToCodeHashes,
                Error = error
            });
        }
Exemple #2
0
 public void Trace(Transaction transaction, BlockHeader block, ITxTracer txTracer) =>
 _transactionProcessor.Trace(transaction, block, txTracer);