0
# Account Abstraction
1
2
ERC-4337 compliant smart contract wallets with modular authentication, transaction batching, and paymaster integration for flexible account management.
3
4
## Capabilities
5
6
### Account Contract
7
8
Core ERC-4337 account implementation with modular signature validation and execution.
9
10
```solidity { .api }
11
/**
12
* ERC-4337 Account implementation with ERC-1271 signature validation
13
*/
14
contract Account is Context, IERC165, IERC1271, IAccount, Ownable, UUPSUpgradeable {
15
constructor(IEntryPoint anEntryPoint);
16
function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) external virtual returns (uint256 validationData);
17
function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external virtual;
18
function isValidSignature(bytes32 hash, bytes calldata signature) external view virtual returns (bytes4 magicValue);
19
function entryPoint() public view virtual returns (IEntryPoint);
20
function execute(address target, uint256 value, bytes calldata data) external virtual requireFromEntryPointOrOwner;
21
function executeBatch(address[] calldata targets, uint256[] calldata values, bytes[] calldata data) external virtual requireFromEntryPointOrOwner;
22
function proxiableUUID() external view virtual override notDelegated returns (bytes32);
23
function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy;
24
}
25
```
26
27
**Usage Examples:**
28
29
```solidity
30
import "@openzeppelin/contracts/account/Account.sol";
31
32
contract MyAccount is Account {
33
constructor(IEntryPoint anEntryPoint, address initialOwner)
34
Account(anEntryPoint)
35
Ownable(initialOwner)
36
{}
37
38
// Execute a transaction
39
function executeTransaction(address target, uint256 value, bytes calldata data) external {
40
execute(target, value, data);
41
}
42
43
// Execute multiple transactions
44
function executeBatch(
45
address[] calldata targets,
46
uint256[] calldata values,
47
bytes[] calldata data
48
) external {
49
executeBatch(targets, values, data);
50
}
51
}
52
```
53
54
### Account Management Utilities
55
56
Utilities for account deployment, validation, and management.
57
58
```solidity { .api }
59
/**
60
* Signature validation utilities for Account contracts
61
*/
62
library AccountUtils {
63
function isValidSignature(address account, bytes32 hash, bytes calldata signature) internal view returns (bool);
64
function validateSignature(address account, bytes32 hash, bytes calldata signature) internal view;
65
}
66
```
67
68
### Account Extensions
69
70
Extensions for enhanced account functionality.
71
72
#### AccountMultiSig Extension
73
74
Multi-signature functionality for account contracts.
75
76
```solidity { .api }
77
/**
78
* Multi-signature extension for Account contracts
79
*/
80
abstract contract AccountMultiSig is Account {
81
function addOwner(address newOwner) external virtual onlyOwner;
82
function removeOwner(address owner) external virtual onlyOwner;
83
function changeRequirement(uint256 required) external virtual onlyOwner;
84
function getOwners() external view virtual returns (address[] memory);
85
function getThreshold() external view virtual returns (uint256);
86
function isOwner(address owner) external view virtual returns (bool);
87
}
88
```
89
90
## Types
91
92
```solidity { .api }
93
/**
94
* ERC-4337 User Operation structure
95
*/
96
struct PackedUserOperation {
97
address sender;
98
uint256 nonce;
99
bytes initCode;
100
bytes callData;
101
bytes32 accountGasLimits;
102
uint256 preVerificationGas;
103
bytes32 gasFees;
104
bytes paymasterAndData;
105
bytes signature;
106
}
107
108
/**
109
* Account validation result
110
*/
111
struct ValidationData {
112
address aggregator;
113
uint48 validAfter;
114
uint48 validUntil;
115
}
116
117
/**
118
* ERC-4337 Entry Point interface
119
*/
120
interface IEntryPoint {
121
function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary) external;
122
function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary) external;
123
function depositTo(address account) external payable;
124
function balanceOf(address account) external view returns (uint256);
125
function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;
126
}
127
128
/**
129
* Account interface for ERC-4337 compliance
130
*/
131
interface IAccount {
132
function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) external returns (uint256 validationData);
133
}
134
135
/**
136
* Account modifiers and validation
137
*/
138
error AccountUnauthorized();
139
error AccountInvalidSignature();
140
error AccountInvalidUserOp();
141
```