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 }); }
public void Trace(Transaction transaction, BlockHeader block, ITxTracer txTracer) => _transactionProcessor.Trace(transaction, block, txTracer);