Secure Smart Contract library for Solidity with battle-tested implementations of token standards, access control, governance, and essential utilities for building decentralized applications.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
ERC-4337 compliant smart contract wallets with modular authentication, transaction batching, and paymaster integration for flexible account management.
Core ERC-4337 account implementation with modular signature validation and execution.
/**
* ERC-4337 Account implementation with ERC-1271 signature validation
*/
contract Account is Context, IERC165, IERC1271, IAccount, Ownable, UUPSUpgradeable {
constructor(IEntryPoint anEntryPoint);
function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) external virtual returns (uint256 validationData);
function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external virtual;
function isValidSignature(bytes32 hash, bytes calldata signature) external view virtual returns (bytes4 magicValue);
function entryPoint() public view virtual returns (IEntryPoint);
function execute(address target, uint256 value, bytes calldata data) external virtual requireFromEntryPointOrOwner;
function executeBatch(address[] calldata targets, uint256[] calldata values, bytes[] calldata data) external virtual requireFromEntryPointOrOwner;
function proxiableUUID() external view virtual override notDelegated returns (bytes32);
function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy;
}Usage Examples:
import "@openzeppelin/contracts/account/Account.sol";
contract MyAccount is Account {
constructor(IEntryPoint anEntryPoint, address initialOwner)
Account(anEntryPoint)
Ownable(initialOwner)
{}
// Execute a transaction
function executeTransaction(address target, uint256 value, bytes calldata data) external {
execute(target, value, data);
}
// Execute multiple transactions
function executeBatch(
address[] calldata targets,
uint256[] calldata values,
bytes[] calldata data
) external {
executeBatch(targets, values, data);
}
}Utilities for account deployment, validation, and management.
/**
* Signature validation utilities for Account contracts
*/
library AccountUtils {
function isValidSignature(address account, bytes32 hash, bytes calldata signature) internal view returns (bool);
function validateSignature(address account, bytes32 hash, bytes calldata signature) internal view;
}Extensions for enhanced account functionality.
Multi-signature functionality for account contracts.
/**
* Multi-signature extension for Account contracts
*/
abstract contract AccountMultiSig is Account {
function addOwner(address newOwner) external virtual onlyOwner;
function removeOwner(address owner) external virtual onlyOwner;
function changeRequirement(uint256 required) external virtual onlyOwner;
function getOwners() external view virtual returns (address[] memory);
function getThreshold() external view virtual returns (uint256);
function isOwner(address owner) external view virtual returns (bool);
}/**
* ERC-4337 User Operation structure
*/
struct PackedUserOperation {
address sender;
uint256 nonce;
bytes initCode;
bytes callData;
bytes32 accountGasLimits;
uint256 preVerificationGas;
bytes32 gasFees;
bytes paymasterAndData;
bytes signature;
}
/**
* Account validation result
*/
struct ValidationData {
address aggregator;
uint48 validAfter;
uint48 validUntil;
}
/**
* ERC-4337 Entry Point interface
*/
interface IEntryPoint {
function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary) external;
function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary) external;
function depositTo(address account) external payable;
function balanceOf(address account) external view returns (uint256);
function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;
}
/**
* Account interface for ERC-4337 compliance
*/
interface IAccount {
function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) external returns (uint256 validationData);
}
/**
* Account modifiers and validation
*/
error AccountUnauthorized();
error AccountInvalidSignature();
error AccountInvalidUserOp();Install with Tessl CLI
npx tessl i tessl/npm-openzeppelin--contracts