API Reference
Smart contract API reference
This package provides a production-ready ERC-4337 and ERC-7579 smart account and a set of ERC-7579 modules that can be installed on any ERC-7579 compliant account.
OpenAccount: A modular smart account with ERC-7579 module support, ERC-1271 signature validation and ERC-721/ERC-1155 holder capabilities.OpenAccountImplementation: Upgradeable implementation ofOpenAccountwith ERC-8043 init mode, used byOpenAccountFactory.OpenAccountFactory: A factory that deploysOpenAccountImplementationinstances as ERC-1967 proxy clones at deterministic addresses.
Modules, extensions and utilities are documented in their own pages:
- Modules: Validators, executors and the signer, multisig and session key primitives they are built from.
- Extensions: Account extensions such as ERC-8043 init mode.
- Utilities: Libraries and helpers for multisignatures, crosschain signatures and FHE coordination.
Account
Factory
import "@openzeppelin-accounts/contracts/OpenAccount.sol";A modular smart account implementation.
Functions
- initialize(moduleTypeIds, modules, initDatas, configMode, configCalldata)
- _validateUserOp(userOp, userOpHash, signature)
ERC1155Holder
ERC721Holder
AccountERC7579Upgradeable
- __AccountERC7579_init()
- __AccountERC7579_init_unchained()
- fallback()
- accountId()
- supportsExecutionMode(encodedMode)
- supportsModule(moduleTypeId)
- installModule(moduleTypeId, module, initData)
- uninstallModule(moduleTypeId, module, deInitData)
- isModuleInstalled(moduleTypeId, module, additionalContext)
- execute(mode, executionCalldata)
- executeFromExecutor(mode, executionCalldata)
- isValidSignature(hash, signature)
- _execute(mode, executionCalldata)
- _installModule(moduleTypeId, module, initData)
- _uninstallModule(moduleTypeId, module, deInitData)
- _fallback()
- _fallbackHandler(selector)
- _checkModule(moduleTypeId, module, additionalContext)
- _extractUserOpValidator(userOp)
- _extractSignatureValidator(signature)
- _decodeFallbackData(data)
- _rawSignatureValidation(, )
EIP712
Account
Events
IERC7579ModuleConfig
Initializable
IERC5267
Errors
AccountERC7579Upgradeable
Account
Initializable
initialize(uint256[] moduleTypeIds, address[] modules, bytes[] initDatas, Mode configMode, bytes configCalldata)
public
#Initializes the account with a validator or executor module.
It receives an array of moduleTypeIds, modules, and initDatas that are used
to install modules during initialization. It also receives a mode and executionCalldata
that are used to execute the account, these can be used to configure the account.
Set the configCalldata to bytes("") to skip the configuration call.
_validateUserOp(struct PackedUserOperation userOp, bytes32 userOpHash, bytes signature) → uint256
internal
#Validates a user operation with _signableUserOpHash and returns the validation data
if the module specified by the first 20 bytes of the nonce key is installed. Falls back to
Account-_validateUserOp otherwise.
See _extractUserOpValidator for the module extraction logic.
OpenAccountModuleTypeIdsLengthMismatch()
error
#Thrown when the length of the module type ids, modules, and init datas do not match during initialization.
OpenAccountNoValidatorOrExecutor()
error
#Thrown when the account is initialized without a validator or executor module.
import "@openzeppelin-accounts/contracts/OpenAccountFactory.sol";Implementation contract for the OpenAccount factory.
Functions
UUPSUpgradeable
ERC1155Holder
ERC721Holder
AccountERC7579Upgradeable
- __AccountERC7579_init()
- __AccountERC7579_init_unchained()
- fallback()
- accountId()
- supportsExecutionMode(encodedMode)
- supportsModule(moduleTypeId)
- installModule(moduleTypeId, module, initData)
- uninstallModule(moduleTypeId, module, deInitData)
- isModuleInstalled(moduleTypeId, module, additionalContext)
- execute(mode, executionCalldata)
- executeFromExecutor(mode, executionCalldata)
- isValidSignature(hash, signature)
- _execute(mode, executionCalldata)
- _installModule(moduleTypeId, module, initData)
- _uninstallModule(moduleTypeId, module, deInitData)
- _fallback()
- _fallbackHandler(selector)
- _checkModule(moduleTypeId, module, additionalContext)
- _extractUserOpValidator(userOp)
- _extractSignatureValidator(signature)
- _decodeFallbackData(data)
- _rawSignatureValidation(, )
EIP712
Account
Events
IERC7579ModuleConfig
Initializable
IERC5267
Errors
UUPSUpgradeable
AccountERC7579Upgradeable
Account
Initializable
constructor()
public
#_validateUserOp(struct PackedUserOperation userOp, bytes32 userOpHash, bytes signature) → uint256
internal
#_authorizeUpgrade(address newImplementation)
internal
#Function that should revert when msg.sender is not authorized to upgrade the contract. Called by
upgradeToAndCall.
Normally, this function will use an access control modifier such as Ownable-onlyOwner.
function _authorizeUpgrade(address) internal onlyOwner {}import "@openzeppelin-accounts/contracts/OpenAccountFactory.sol";A factory contract to create OpenAccount instances on demand.
Each account is created as a minimal ERC-1967 proxy clone that delegates to the implementation contract.
The proxy follows the ERC-1967 standard for proxy storage slots, storing the implementation address at
bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1).
See https://eips.ethereum.org/EIPS/eip-1967 for the full specification.
Functions
implementation() → address
public
#Returns the OpenAccount implementation contract address.
This is the logic contract that all created proxy clones will delegate to.
predictAddress(uint256[] moduleTypeIds, address[] modules, bytes[] initDatas, Mode configMode, bytes configCalldata, bytes32 salt) → address
public
#Predicts the address of an OpenAccount before it is created.
The address is deterministically computed based on the initialization parameters and salt. Each account is deployed as an ERC-1967 proxy clone.
createAndInitialize(uint256[] moduleTypeIds, address[] modules, bytes[] initDatas, Mode configMode, bytes configCalldata, bytes32 salt) → address
public
#Creates and initializes a new OpenAccount instance.
Deploys a minimal ERC-1967 proxy clone using CREATE2 for deterministic addresses. The proxy delegates all calls to the implementation contract and maintains its own storage. If an account at the predicted address already exists, returns that address without redeploying.