or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

access-control.mdaccount-abstraction.mdfinance.mdgovernance.mdindex.mdmathematical-utilities.mdmeta-transactions.mdproxy-patterns.mdsecurity-utilities.mdtoken-standards.md

account-abstraction.mddocs/

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

```