This repository contains the tools and resources for working with ERC-4337 Account Abstraction smart contracts. This includes the code for the singleton EntryPoint contract that is deployed by our team on most EVM-compatible networks.
Account abstraction allows users to interact with Ethereum using smart contract wallets instead of EOAs, without compromising decentralization, providing benefits like:
contracts/core/EntryPoint.sol): The central contract that processes UserOperationscontracts/core/BaseAccount.sol): Base implementation for smart contract accountscontracts/core/BasePaymaster.sol): Helper class for creating a paymastercontracts/core/StakeManager.sol): Manages deposits and stakes for accounts and paymasterscontracts/core/NonceManager.sol): Handles nonce management for accountscontracts/core/UserOperationLib.sol): Utilities for working with UserOperationscontracts/core/Helpers.sol): Common constants and helper functionsSimpleAccount (contracts/accounts/SimpleAccount.sol): Basic implementation of an ERC-4337 account
Simple7702Account (contracts/accounts/Simple7702Account.sol): A minimal account to be used with EIP-7702 (for batching) and ERC-4337 (for gas sponsoring)
SimpleAccountFactory (contracts/accounts/SimpleAccountFactory.sol): A sample factory contract for SimpleAccount
git clone https://github.com/eth-infinitism/account-abstraction.git
cd account-abstraction
yarn install
yarn compile
yarn test
The EntryPoint contract is the central hub for processing UserOperations. It: - Validates UserOperations - Handles account creation (if needed) - Executes the requested operations - Manages gas payments and refunds
The EntryPoint is deployed by using
hardhat deploy --network {net}
EntryPoint v0.8 is always deployed at address 0x4337084d9e255ff0702461cf8895ce9e3b5ff108
This repository also includes a number of audited base classes and utilities that can simplify the development of AA related contracts.
If you are building a project that uses account abstraction and want to integrate our contracts:
yarn add @account-abstraction/contracts
import "@account-abstraction/contracts/core/BasePaymaster.sol";
contract MyCustomPaymaster is BasePaymaster {
/// implement your gas payment logic here
function _validatePaymasterUserOp(
PackedUserOperation calldata userOp,
bytes32 userOpHash,
uint256 maxCost
) internal virtual override returns (bytes memory context, uint256 validationData) {
context = “”; // specify “context” if needed in postOp call.
validationData = _packValidationData(
false,
validUntil,
validAfter
);
}
}
import "@account-abstraction/contracts/core/BaseAccount.sol";
contract MyAccount is BaseAccount {
/// implement your authentication logic here
function _validateSignature(PackedUserOperation calldata userOp, bytes32 userOpHash)
internal override virtual returns (uint256 validationData) {
// UserOpHash can be generated using eth_signTypedData_v4
if (owner != ECDSA.recover(userOpHash, userOp.signature))
return SIG_VALIDATION_FAILED;
return SIG_VALIDATION_SUCCESS;
}
}
$ claude mcp add account-abstraction \
-- python -m otcore.mcp_server <graph>