

UserOpA UserOp is not a transaction.
It’s a struct containing fields like:
Why this design?
Because simulations must be trustless.
UserOps cannot read dynamic chain data (block timestamp, blockhash, etc.).
That prevents simulation mismatch attacks.
The mempool has rules: