Skip to content

Add Account framework docs and guides #5660

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 110 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
f5544fd
Add Account framework
ernestognw May 2, 2025
40dfd20
Add missing mocks
ernestognw May 2, 2025
0bcc521
Adding missing hardhat config
ernestognw May 2, 2025
7e75026
up
ernestognw May 2, 2025
5fb074c
Remove unnecessary files for mocks
ernestognw May 2, 2025
e5df541
Remove more unnecessary mock files
ernestognw May 2, 2025
5ad9788
replace hardcoded links
ernestognw May 2, 2025
7090f67
lockfile
ernestognw May 2, 2025
c4af1d7
update ethers
ernestognw May 2, 2025
aa8f29b
add missing interface
ernestognw May 2, 2025
415c00d
Add changesets
ernestognw May 2, 2025
f60aa3a
up
ernestognw May 2, 2025
087a844
up
ernestognw May 2, 2025
79629b7
up
ernestognw May 2, 2025
f47cab7
up
ernestognw May 2, 2025
8f58197
up
ernestognw May 2, 2025
ecede7f
up
ernestognw May 2, 2025
68bd96a
up
ernestognw May 2, 2025
d5cb119
chore: empty commit
ernestognw May 2, 2025
6a0ae8a
change read permissions
ernestognw May 2, 2025
a49a157
Update lucky-donuts-scream.md
ernestognw May 2, 2025
a634278
Update clean-ways-push.md
ernestognw May 2, 2025
8b6501a
Update tame-bears-mix.md
ernestognw May 2, 2025
39a1026
reset package-lock.json
ernestognw May 2, 2025
71a6b25
up
ernestognw May 2, 2025
35d4a12
up
ernestognw May 2, 2025
a95705b
reset dependencies
ernestognw May 2, 2025
90509bd
reset dependencies
ernestognw May 2, 2025
10f40d7
reset dependencies
ernestognw May 2, 2025
36fb044
lint
ernestognw May 2, 2025
f534243
Add ERC7913 signers and utilities
ernestognw May 2, 2025
c0e5e45
Add Account framework docs and guides
ernestognw May 2, 2025
7e10f80
Attempt to fix tests
ernestognw May 2, 2025
c6ed868
up
ernestognw May 2, 2025
b87c8e2
Merge branch 'master' into feature/account-abstraction
ernestognw May 2, 2025
f6d07c2
adjust action.yml
ernestognw May 2, 2025
cfa2392
up
ernestognw May 2, 2025
9a8e63f
Merge branch 'master' into feature/account-abstraction
ernestognw May 2, 2025
3a90091
lint
ernestognw May 2, 2025
bdec803
lint
ernestognw May 2, 2025
73c12c7
Merge branch 'master' into feature/account-abstraction
ernestognw May 2, 2025
1c97739
Test ethers 6.13.6-beta.1
ernestognw May 2, 2025
6b1bbd8
up
ernestognw May 2, 2025
7764515
up
ernestognw May 2, 2025
19fe4c5
up
ernestognw May 2, 2025
11c42c3
checks
ernestognw May 2, 2025
be68753
up
ernestognw May 2, 2025
f0a1155
build in slither
ernestognw May 2, 2025
c42a7fd
Update build command
ernestognw May 2, 2025
6e576ca
compile hardhat too
ernestognw May 2, 2025
593e879
revert slither changes
ernestognw May 2, 2025
c3f39a1
Remove package-lock.json to skip installing dependencies
ernestognw May 2, 2025
db76c3b
up
ernestognw May 2, 2025
8eebff0
Add @custom:stateless tag
ernestognw May 3, 2025
65fa7de
update upgradeable.patch
ernestognw May 3, 2025
abac3bd
fix conflicts
ernestognw May 3, 2025
7d120b9
rollback <package-version>
ernestognw May 3, 2025
02eccc1
update upgradeable.patch
ernestognw May 3, 2025
c39d5f5
Tweak workflows
ernestognw May 3, 2025
54f632a
Use Solidity 0.8.27 as default and set default EVM to prague
ernestognw May 3, 2025
58c794e
Adjust ERC2771Forwarder gas to avoid GasFloorMoreThanGasLimit
ernestognw May 3, 2025
6a60523
Remove console.log
ernestognw May 3, 2025
80edba8
Add EnumerableSetExtended and EnumerableMapExtended
ernestognw May 2, 2025
29c48d9
Fix lint and enable formatting after generation
ernestognw May 3, 2025
fae0a67
Add ERC7913 signers and utilities
ernestognw May 2, 2025
c6b299e
Merge branch 'feature/erc7913' into docs/account
ernestognw May 3, 2025
e412bd9
Add EnumerableSetExtended and EnumerableMapExtended
ernestognw May 2, 2025
f7f64ee
Add changeset and fix linting
ernestognw May 3, 2025
2c33b49
Merge branch 'master' into docs/account
ernestognw May 8, 2025
b0b70eb
Merge branch 'master' into feature/enumerable-extended
ernestognw Jun 2, 2025
b695659
Remove TODOs
ernestognw Jun 2, 2025
5c4fb88
Reset package-lock
ernestognw Jun 2, 2025
8f32638
Revert run.js
ernestognw Jun 2, 2025
b12ca61
Merge Enumerable{Set,Map}Extended into Enumerable{Set,Map}
Amxx Jun 2, 2025
45fa35f
Update scripts/generate/templates/Enumerable.opts.js
Amxx Jun 2, 2025
bec8059
clarification
Amxx Jun 2, 2025
0d7f9d0
speedup generation with selective linter
Amxx Jun 2, 2025
2376a45
update documentation
Amxx Jun 2, 2025
1e35eab
Merge master
ernestognw Jun 2, 2025
c275c03
Remove unnecesary code
ernestognw Jun 2, 2025
5975d79
Remove Bytes32x2
ernestognw Jun 2, 2025
9356599
Update .changeset/pink-dolls-shop.md
ernestognw Jun 2, 2025
86c2cb8
Remove unnecessary _hashes
ernestognw Jun 2, 2025
6898230
Simplify
ernestognw Jun 2, 2025
4e2bc70
Improve changesets
ernestognw Jun 2, 2025
2a1f503
remove unecessary import
Amxx Jun 2, 2025
326c466
Use Arrays.sol
ernestognw Jun 2, 2025
52ac908
Merge branch 'feature/enumerable-extended' into feature/erc7913
ernestognw Jun 3, 2025
6725618
up
ernestognw Jun 3, 2025
0cce4d5
up
ernestognw Jun 3, 2025
5c45ff0
Merge branch 'master' into feature/erc7913
Amxx Jun 3, 2025
80d8bd5
Merge branch 'master' into feature/erc7913
ernestognw Jun 3, 2025
30f3bfa
cleanup
ernestognw Jun 3, 2025
eab64f8
Remove EnumerableSetExtended usage
ernestognw Jun 3, 2025
e3dcc2b
Add tests
ernestognw Jun 3, 2025
3ac675d
Add changesets
ernestognw Jun 3, 2025
b20b017
Merge branch 'master' into feature/erc7913
ernestognw Jun 4, 2025
804ceea
Organize
ernestognw Jun 4, 2025
d0f5961
Review
ernestognw Jun 4, 2025
98108d9
Increase SignatureChecker's pragma
ernestognw Jun 4, 2025
906a805
Merge branch 'master' into docs/account
ernestognw Jun 4, 2025
1bfa65c
Fix
ernestognw Jun 4, 2025
1a9c074
Remove
ernestognw Jun 4, 2025
4135626
Merge branch 'feature/erc7913' into docs/account
ernestognw Jun 4, 2025
e1ffe05
Pragma consistency
ernestognw Jun 4, 2025
7070e39
Merge branch 'feature/erc7913' into docs/account
ernestognw Jun 4, 2025
709493e
Fix compilation
ernestognw Jun 4, 2025
91aeb92
Increase SignatureChecker minimum pragma to 0.8.24
ernestognw Jun 4, 2025
a1ca133
Update mocks
ernestognw Jun 4, 2025
6491896
Merge branch 'master' into docs/account
ernestognw Jun 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/nice-rings-wish.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---

`ERC7913P256Verifier` and `ERC7913RSAVerifier`: Ready to use ERC-7913 verifiers that implement key verification for P256 (secp256r1) and RSA keys.
5 changes: 5 additions & 0 deletions .changeset/public-crabs-heal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---

`MultiSignerERC7913Weighted`: Extension of `MultiSignerERC7913` that supports assigning different weights to each signer, enabling more flexible governance schemes.
5 changes: 5 additions & 0 deletions .changeset/quiet-kiwis-feel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---

`SignerERC7913`: Abstract signer that verifies signatures using the ERC-7913 workflow.
5 changes: 5 additions & 0 deletions .changeset/social-walls-obey.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---

`MultiSignerERC7913`: Implementation of `AbstractSigner` that supports multiple ERC-7913 signers with a threshold-based signature verification system.
5 changes: 5 additions & 0 deletions .changeset/sour-pens-shake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---

`SignatureChecker`: Add support for ERC-7913 signatures alongside existing ECDSA and ERC-1271 signature verification.
17 changes: 17 additions & 0 deletions contracts/interfaces/IERC7913.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
* @dev Signature verifier interface.
*/
interface IERC7913SignatureVerifier {
/**
* @dev Verifies `signature` as a valid signature of `hash` by `key`.
*
* MUST return the bytes4 magic value IERC7913SignatureVerifier.verify.selector if the signature is valid.
* SHOULD return 0xffffffff or revert if the signature is not valid.
* SHOULD return 0xffffffff or revert if the key is empty
*/
function verify(bytes calldata key, bytes32 hash, bytes calldata signature) external view returns (bytes4);
}
58 changes: 58 additions & 0 deletions contracts/mocks/account/AccountMock.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ import {SignerECDSA} from "../../utils/cryptography/signers/SignerECDSA.sol";
import {SignerP256} from "../../utils/cryptography/signers/SignerP256.sol";
import {SignerRSA} from "../../utils/cryptography/signers/SignerRSA.sol";
import {SignerERC7702} from "../../utils/cryptography/signers/SignerERC7702.sol";
import {SignerERC7913} from "../../utils/cryptography/signers/SignerERC7913.sol";
import {MultiSignerERC7913} from "../../utils/cryptography/signers/MultiSignerERC7913.sol";
import {MultiSignerERC7913Weighted} from "../../utils/cryptography/signers/MultiSignerERC7913Weighted.sol";

abstract contract AccountMock is Account, ERC7739, ERC7821, ERC721Holder, ERC1155Holder {
/// Validates a user operation with a boolean signature.
Expand Down Expand Up @@ -136,3 +139,58 @@ abstract contract AccountERC7579HookedMock is AccountERC7579Hooked {
_installModule(MODULE_TYPE_VALIDATOR, validator, initData);
}
}

abstract contract AccountMultiSignerMock is Account, MultiSignerERC7913, ERC7739, ERC7821, ERC721Holder, ERC1155Holder {
constructor(bytes[] memory signers, uint256 threshold) {
_addSigners(signers);
_setThreshold(threshold);
}

/// @inheritdoc ERC7821
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}

abstract contract AccountERC7913Mock is Account, SignerERC7913, ERC7739, ERC7821, ERC721Holder, ERC1155Holder {
constructor(bytes memory _signer) {
_setSigner(_signer);
}

/// @inheritdoc ERC7821
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}

abstract contract AccountMultiSignerWeightedMock is
Account,
MultiSignerERC7913Weighted,
ERC7739,
ERC7821,
ERC721Holder,
ERC1155Holder
{
constructor(bytes[] memory signers, uint256[] memory weights, uint256 threshold) {
_addSigners(signers);
_setSignerWeights(signers, weights);
_setThreshold(threshold);
}

/// @inheritdoc ERC7821
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}
20 changes: 20 additions & 0 deletions contracts/mocks/docs/account/MyAccountERC7702.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// contracts/MyAccountERC7702.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {Account} from "../../../account/Account.sol";
import {ERC721Holder} from "../../../token/ERC721/utils/ERC721Holder.sol";
import {ERC1155Holder} from "../../../token/ERC1155/utils/ERC1155Holder.sol";
import {ERC7821} from "../../../account/extensions/ERC7821.sol";
import {SignerERC7702} from "../../../utils/cryptography/signers/SignerERC7702.sol";

contract MyAccountERC7702 is Account, SignerERC7702, ERC7821, ERC721Holder, ERC1155Holder {
/// @dev Allows the entry point as an authorized executor.
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}
30 changes: 30 additions & 0 deletions contracts/mocks/docs/account/MyAccountERC7913.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// contracts/MyAccountERC7913.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

import {Account} from "../../../account/Account.sol";
import {EIP712} from "../../../utils/cryptography/EIP712.sol";
import {ERC721Holder} from "../../../token/ERC721/utils/ERC721Holder.sol";
import {ERC1155Holder} from "../../../token/ERC1155/utils/ERC1155Holder.sol";
import {ERC7739} from "../../../utils/cryptography/signers/ERC7739.sol";
import {ERC7821} from "../../../account/extensions/ERC7821.sol";
import {Initializable} from "../../../proxy/utils/Initializable.sol";
import {SignerERC7913} from "../../../utils/cryptography/signers/SignerERC7913.sol";

contract MyAccountERC7913 is Account, SignerERC7913, ERC7739, ERC7821, ERC721Holder, ERC1155Holder, Initializable {
constructor() EIP712("MyAccount7913", "1") {}

function initialize(bytes memory signer) public initializer {
_setSigner(signer);
}

/// @dev Allows the entry point as an authorized executor.
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}
51 changes: 51 additions & 0 deletions contracts/mocks/docs/account/MyAccountMultiSigner.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// contracts/MyAccountERC7913.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.27;

import {Account} from "../../../account/Account.sol";
import {EIP712} from "../../../utils/cryptography/EIP712.sol";
import {ERC721Holder} from "../../../token/ERC721/utils/ERC721Holder.sol";
import {ERC1155Holder} from "../../../token/ERC1155/utils/ERC1155Holder.sol";
import {ERC7739} from "../../../utils/cryptography/signers/ERC7739.sol";
import {ERC7821} from "../../../account/extensions/ERC7821.sol";
import {Initializable} from "../../../proxy/utils/Initializable.sol";
import {MultiSignerERC7913} from "../../../utils/cryptography/signers/MultiSignerERC7913.sol";

contract MyAccountMultiSigner is
Account,
MultiSignerERC7913,
ERC7739,
ERC7821,
ERC721Holder,
ERC1155Holder,
Initializable
{
constructor() EIP712("MyAccountMultiSigner", "1") {}

function initialize(bytes[] memory signers, uint256 threshold) public initializer {
_addSigners(signers);
_setThreshold(threshold);
}

function addSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
_addSigners(signers);
}

function removeSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
_removeSigners(signers);
}

function setThreshold(uint256 threshold) public onlyEntryPointOrSelf {
_setThreshold(threshold);
}

/// @dev Allows the entry point as an authorized executor.
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}
56 changes: 56 additions & 0 deletions contracts/mocks/docs/account/MyAccountMultiSignerWeighted.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// contracts/MyAccountERC7913.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.27;

import {Account} from "../../../account/Account.sol";
import {EIP712} from "../../../utils/cryptography/EIP712.sol";
import {ERC721Holder} from "../../../token/ERC721/utils/ERC721Holder.sol";
import {ERC1155Holder} from "../../../token/ERC1155/utils/ERC1155Holder.sol";
import {ERC7739} from "../../../utils/cryptography/signers/ERC7739.sol";
import {ERC7821} from "../../../account/extensions/ERC7821.sol";
import {Initializable} from "../../../proxy/utils/Initializable.sol";
import {MultiSignerERC7913Weighted} from "../../../utils/cryptography/signers/MultiSignerERC7913Weighted.sol";

contract MyAccountMultiSignerWeighted is
Account,
MultiSignerERC7913Weighted,
ERC7739,
ERC7821,
ERC721Holder,
ERC1155Holder,
Initializable
{
constructor() EIP712("MyAccountMultiSignerWeighted", "1") {}

function initialize(bytes[] memory signers, uint256[] memory weights, uint256 threshold) public initializer {
_addSigners(signers);
_setSignerWeights(signers, weights);
_setThreshold(threshold);
}

function addSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
_addSigners(signers);
}

function removeSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
_removeSigners(signers);
}

function setThreshold(uint256 threshold) public onlyEntryPointOrSelf {
_setThreshold(threshold);
}

function setSignerWeights(bytes[] memory signers, uint256[] memory weights) public onlyEntryPointOrSelf {
_setSignerWeights(signers, weights);
}

/// @dev Allows the entry point as an authorized executor.
function _erc7821AuthorizedExecutor(
address caller,
bytes32 mode,
bytes calldata executionData
) internal view virtual override returns (bool) {
return caller == address(entryPoint()) || super._erc7821AuthorizedExecutor(caller, mode, executionData);
}
}
47 changes: 47 additions & 0 deletions contracts/mocks/docs/account/MyFactoryAccount.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// contracts/MyFactoryAccount.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import {Clones} from "../../../proxy/Clones.sol";
import {Address} from "../../../utils/Address.sol";

/**
* @dev A factory contract to create accounts on demand.
*/
contract MyFactoryAccount {
using Clones for address;
using Address for address;

address private immutable _impl;

constructor(address impl_) {
_impl = impl_;
}

/// @dev Predict the address of the account
function predictAddress(bytes32 salt, bytes calldata callData) public view returns (address, bytes32) {
bytes32 calldataSalt = _saltedCallData(salt, callData);
return (_impl.predictDeterministicAddress(calldataSalt, address(this)), calldataSalt);
}

/// @dev Create clone accounts on demand
function cloneAndInitialize(bytes32 salt, bytes calldata callData) public returns (address) {
return _cloneAndInitialize(salt, callData);
}

/// @dev Create clone accounts on demand and return the address. Uses `callData` to initialize the clone.
function _cloneAndInitialize(bytes32 salt, bytes calldata callData) internal returns (address) {
(address predicted, bytes32 _calldataSalt) = predictAddress(salt, callData);
if (predicted.code.length == 0) {
_impl.cloneDeterministic(_calldataSalt);
predicted.functionCall(callData);
}
return predicted;
}

function _saltedCallData(bytes32 salt, bytes calldata callData) internal pure returns (bytes32) {
// Scope salt to the callData to avoid front-running the salt with a different callData
return keccak256(abi.encodePacked(salt, callData));
}
}
37 changes: 37 additions & 0 deletions contracts/mocks/utils/cryptography/ERC7913VerifierMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import {IERC7913SignatureVerifier} from "../../../../contracts/interfaces/IERC7913.sol";

contract ERC7913VerifierMock is IERC7913SignatureVerifier {
// Store valid keys and their corresponding signatures
mapping(bytes32 => bool) private _validKeys;
mapping(bytes32 => mapping(bytes32 => bool)) private _validSignatures;

constructor() {
// For testing purposes, we'll consider a specific key as valid
bytes32 validKeyHash = keccak256(abi.encodePacked("valid_key"));
_validKeys[validKeyHash] = true;
}

function verify(bytes calldata key, bytes32 /* hash */, bytes calldata signature) external pure returns (bytes4) {
// For testing purposes, we'll only accept specific key/signature combinations
if (_isKnownSigner1(key, signature) || _isKnownSigner2(key, signature)) {
return IERC7913SignatureVerifier.verify.selector;
}
return 0xffffffff;
}

function _isKnownSigner1(bytes calldata key, bytes calldata signature) internal pure returns (bool) {
return
keccak256(key) == keccak256(abi.encodePacked("valid_key_1")) &&
keccak256(signature) == keccak256(abi.encodePacked("valid_signature_1"));
}

function _isKnownSigner2(bytes calldata key, bytes calldata signature) internal pure returns (bool) {
return
keccak256(key) == keccak256(abi.encodePacked("valid_key_2")) &&
keccak256(signature) == keccak256(abi.encodePacked("valid_signature_2"));
}
}
14 changes: 14 additions & 0 deletions contracts/utils/cryptography/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ A collection of contracts and libraries that implement various signature validat
* {ERC7739}: An abstract contract to validate signatures following the rehashing scheme from {ERC7739Utils}.
* {SignerECDSA}, {SignerP256}, {SignerRSA}: Implementations of an {AbstractSigner} with specific signature validation algorithms.
* {SignerERC7702}: Implementation of {AbstractSigner} that validates signatures using the contract's own address as the signer, useful for delegated accounts following EIP-7702.
* {SignerERC7913}, {MultiSignerERC7913}, {MultiSignerERC7913Weighted}: Implementations of {AbstractSigner} that validate signatures based on ERC-7913. Including a simple and weighted multisignature scheme.
* {ERC7913P256Verifier}, {ERC7913RSAVerifier}: Ready to use ERC-7913 signature verifiers for P256 and RSA keys.

== Utils

Expand Down Expand Up @@ -51,3 +53,15 @@ A collection of contracts and libraries that implement various signature validat
{{SignerRSA}}

{{SignerERC7702}}

{{SignerERC7913}}

{{MultiSignerERC7913}}

{{MultiSignerERC7913Weighted}}

== Verifiers

{{ERC7913P256Verifier}}

{{ERC7913RSAVerifier}}
Loading
Loading