gm! If you are a web3 user, you probably know that transactions are the basic unit of interaction on the network. Regular blockchain transactions are signed by Externally Owned Accounts (EOAs) using private keys and broadcasted to the network. Transactions can transfer tokens, call smart contracts, or deploy new contracts and they are validated by the consensus layer and executed by the execution layer.
But what if transactions are not enough? What if you want to use a smart contract as your primary account, instead of an EOA like Metamask? What if you want to customize your verification logic or pay gas fees with any token you have in your stash? What if you want to do all that without changing the Ethereum protocol?
That’s where UserOperation comes in. UserOperation is a new type of data structure that can be sent to a special mempool called the alt-mempool on behalf of a user.
A mempool is a like waiting room for storing information on unconfirmed transactions.
UserOperation is not validated by the consensus layer, but by the execution layer. This means that it can have more complex logic and features than regular transactions, such as:
Paying gas fees with any token, not just ETH
Signing transactions with any signature scheme, not just ECDSA
Batching multiple operations together, such as approving and executing a swap
UserOperation isn't exactly a typical blockchain transaction, but it's kinda similar because it's got some familiar fields like "sender," "to," "calldata," "maxFeePerGas," "maxPriorityFee," "signature," and "nonce." But here's the cool part: it also has some new fields that regular transactions don't have. Now, let's break down all UserOperation fields and explain what each one means.
UserOperation Fields
Sender
Sender is the address of the smart contract account that initiates the operation, just like the return address on an envelope.
Nonce
Nonce is like a number you write on the envelope to prevent others from reusing your old envelopes. A nonce has to be unique. It is built of two fields; a 192-bit key (defaults to zero, but any value can be used) and a sequence (64 bits). Within a key, the sequence is an increasing number, but you can use arbitrary key to have out-of-order nonces which are still unique.
InitCode
InitCode tells the system how to create the new account. It's needed only if the account doesn't exist yet. It is like a registration form that you fill out to create your business account. It includes details about your business so that the government can recognize and establish your business.
CallData
CallData is the data to pass to Sender during the main execution call. It can be any function on smart contract wallet (eg. execute or execute Batch) which usually then further calls a dApp smart contract. It is like a specific recipe you choose to follow. It contains all the steps and ingredients needed to make a delicious dish.
CallGasLimit
CallGasLimit is the amount of gas to allocate for the main execution call. Gas limit is used while calling the smart contract wallet method from EntryPoint contract using 'callData' above. Think of CallGasLimit as the fuel tank of a car. When you make the main execution call, it determines how much gas is available for that call. CallGasLimit ensures that smart contract wallet has enough gas to complete its task.
VerificationGasLimit
VerificationGasLimit is the amount of gas needed to do all the verification steps by EntryPoint before and after executing the operation. Imagine you are in a party and the party organizer is checking each guest before they enter the party and after they leave the party to see if there is any post-party settlement. The gas is the resource that is used for the checking process.
PreVerificationGas
PreVerificationGas is the amount of gas to pay to compensate the bundler for preverification execution and calldata. Imagine you're organizing a big party and you want to thank the person who helps you prepare everything in advance. It is like a special payment you give to someone who helps with the preparations and makes sure everything is ready before the party starts. It compensates Bundler for their work in verifying and preparing the execution of the smart contract.
MaxFeePerGas
MaxFeePerGas is the max fee per unit of gas that UserOp is willing to pay. EntryPoint uses this field to calculate gasPrice for the refund calculation to bundler. It limits the amount you're willing to spend for the work done by the smart contract wallet, ensuring you stay within your budget and avoid overspending.
MaxPriorityFeePerGas
MaxPriorityFeePerGas is the priority fee per unit of gas that UserOp is willing to pay on top of the base gas fee charged. Imagine you are paying a tip at the hairdresser to get a priority appointment. If the the hairdresser has a fixed rate and does not take any tips, then maxFeePerGas and maxPriorityFeePerGas will have the same value in that case.
PaymasterAndData
PaymasterAndData is the address of paymaster sponsoring the transaction, followed by extra data to send to the paymaster (empty if it’s a self-sponsored transaction). Think of it like your friend paying for your gas or tolls while you're driving. It contains the friend's contact information (address) and any additional details they need to handle the payment.
Signature
Signature is the data passed into the account along with nonce during the verification step. It represents the data to be passed to Smart Contract Wallet for verification. Usually it's the signature of userOpHash signed by the owner of SCW but it can be utilized in other ways too. It's a way to prove that the instructions and information coming from the smart contract wallet are indeed from the rightful owner.
Additionally it’s worth mentioning that UserOperation is not sent directly to the network, but to a decentralized network of Bundlers. These bundlers play a special role by packaging multiple UserOperations into a transaction through a call called "handleOps" made to an EntryPoint contract. This contract acts as a gatekeeper, validating and executing each UserOperation based on its specific fields and logic.
A bundler is a node (block builder) that collects multiple UserOperations from a separate mempool and creates a transaction that calls EntryPoint.handleOps().
Bundlers have the flexibility to accept UserOperations from private mempools or a shared canonical mempool. The canonical mempool serves a similar purpose as Ethereum's transaction pool, but it specifically handles UserOperations. As for their compensation, bundlers can charge fees for the services they provide. These fees can be paid in ETH or any other token specified by the UserOperation.
Ambire Wallet’s mobile app is on the horizon! 🌅
Argent is organizing Argent Xplorer campaign in which you complete certain tasks and mint NFTs.
Avocado Wallet by Instadapp now supports NFTs. You can simply interact with your NFTs by using USDC as gas.
Biconomy keeps shipping and collaborating with many projects. One of the most hard-working teams in the space. Their updates won’t fit in the abstracted times. Just check what they’re up to here :)
Braavos launched The Starknet Journey campaign in which you can complete certain tasks, increase your Pro Score and eventually mint NFTs as rewards.
Check out the latest release of Candide Wallet’s mobile app.
Etherspot shipped Skandha 0.0.3 release. With this release, you can seamlessly use Stackup’s userop.js with Skandha bundler. The bundler will route your execution layer RPC calls to the underlying L1 node. You wouldn't need to configure 2 separate RPC URLs to process UserOps.
Openfort, offering wallet-as-a-service for web3 gaming ecosystem, raised funding to streamline account management and programmable transactions with API endpoints.
Safe completed their EIP-721 compatibility. With the new signed messages feature, users can now use Safe (Wallet) with every EIP-721 compatible dApp such as Opensea.
Unipass and Keystone Wallet officially merged into Account Labs.
Uniswap updates their warning flows to allow users to send crypto to smart contract wallets.
Visa developed to ERC-4337 Paymasters and demonstrated both sponsored and ERC-20 transactions.
Wen Token DAO created a proposal to use WEN token as gas token for smart wallets utilizing ERC-4337.
In this section of the newsletter, I usually grab little snippets from podcasts and events about account abstraction and give you the highlights in a bite-sized format, but for this issue, I wanted to try something new and innovative. I used the latest AI technology to create a synthetic voice that sounds like Vitalik Buterin. I collected more than 10 audio clips of Vitalik speaking at different podcasts and events and fed them to an AI tool called VoiceLab by Eleven Labs. The result is an AI-generated voice that mimics Vitalik's speech patterns and accent. It's not flawless, but it's quite impressive for a beta version of an AI product.
With typical web3 wallets like Metamask or hardware wallets like Ledger, you have to keep your private key secret, and if it's exploited, all your funds are gone. However, with smart contract wallets, you don't need to expose your private key.
You interact with smart contracts that handle the signing of transactions, and these contracts can be designed to have extra security measures like requiring multifactor authentication (setting up two or more authentication methods for your crypto wallets, where a transaction is only signed once you confirm the approval via a second option like email or SMS) or hardware signers (using an iPhone or Android’s secure enclave to turn any smartphone into a hardware wallet that users can verify transactions using biometric data like a fingerprint or Apple Face ID - Braavos already implemented this, and Opclave is working on it). All these extra measures make it much harder for anyone to steal your funds from your wallet.
That’s a wrap! 🌯 Hope you enjoyed the third issue of the abstracted. Huge thanks for reading this far. I’d be a happy homo sapiens if you could give a follow on Twitter ❣️