diff --git a/packages/common/src/ai/descriptions/solidity.ts b/packages/common/src/ai/descriptions/solidity.ts index f6438fdd3..ba8254aae 100644 --- a/packages/common/src/ai/descriptions/solidity.ts +++ b/packages/common/src/ai/descriptions/solidity.ts @@ -10,6 +10,8 @@ export const solidityPrompts = { RWA: 'Make a real-world asset token that uses the ERC-20 standard. Experimental, some features are not audited and are subject to change.', Account: 'Make an account contract that follows the ERC-4337 standard. Experimental, some features are not audited and are subject to change.', + ERC7579: + 'Make an account module contract that follows the ERC-7579 standard. Experimental, some features are not audited and are subject to change.', Governor: 'Make a contract to implement governance, such as for a DAO.', Custom: 'Make a custom smart contract.', }; @@ -95,3 +97,30 @@ export const solidityGovernorDescriptions = { storage: 'Enable storage of proposal details and enumerability of proposals', settings: 'Allow governance to update voting settings (delay, period, proposal threshold)', }; + +export const solidityERC7579Descriptions = { + validator: { + signature: + 'Whether the account supports signature validation via ERC-7913, enabling cryptographic verification of user operations.', + multisig: { + weighted: + 'Whether the multisig validator supports weighted signatures, allowing each signer to have a different voting weight for flexible threshold schemes.', + confirmation: + 'Whether the multisig validator requires explicit confirmation (e.g., EIP-712 signature) from each signer when adding them to the multisig module.', + }, + _description: `The validator module for the account. Options: + - signature: Whether the account supports signature validation via ERC-7913, enabling cryptographic verification of user operations. + - multisig: The multisig validator module. + - weighted: Whether the multisig validator supports weighted signatures, allowing each signer to have a different voting weight for flexible threshold schemes. + - confirmation: Whether the multisig validator requires explicit confirmation (e.g., EIP-712 signature) from each signer when adding them to the multisig module. + `, + }, + executor: { + delayed: 'Whether the executor module supports delayed or scheduled execution of operations.', + _description: `The executor module for the account. Options: + - delayed: Whether the executor module supports delayed or scheduled execution of operations.`, + }, + hook: 'Whether the account supports hooks, which are modules that can execute custom logic before and/or after account operations.', + fallback: + 'Whether the account supports fallback handlers, which can extend the fallback functionality of the account and handle calls to unknown functions.', +}; diff --git a/packages/core/solidity/CHANGELOG.md b/packages/core/solidity/CHANGELOG.md index fd5023179..0248ef0e3 100644 --- a/packages/core/solidity/CHANGELOG.md +++ b/packages/core/solidity/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Unreleased + +- Add `erc7579` contract types for ERC-7579 modules. ## 0.6.0 (2025-06-20) diff --git a/packages/core/solidity/README.md b/packages/core/solidity/README.md index bb4177bbf..43746d2f8 100644 --- a/packages/core/solidity/README.md +++ b/packages/core/solidity/README.md @@ -22,7 +22,7 @@ The following contract types are supported: - `governor` - `custom` -Note that `stablecoin`, `realWorldAsset`, and `account` are experimental and may be subject to change. +Note that `stablecoin`, `realWorldAsset`, `account`, and `erc7579` are experimental and may be subject to change. Each contract type has functions/constants as defined below. @@ -45,6 +45,9 @@ function print(opts?: StablecoinOptions): string function print(opts?: AccountOptions): string ``` ```js +function print(opts?: ERC7579Options): string +``` +```js function print(opts?: GovernorOptions): string ``` ```js @@ -69,6 +72,9 @@ const defaults: Required const defaults: Required ``` ```js +const defaults: Required +``` +```js const defaults: Required ``` ```js diff --git a/packages/core/solidity/package.json b/packages/core/solidity/package.json index 804075fab..241890979 100644 --- a/packages/core/solidity/package.json +++ b/packages/core/solidity/package.json @@ -23,8 +23,8 @@ }, "devDependencies": { "@openzeppelin/community-contracts": "https://github.com/OpenZeppelin/openzeppelin-community-contracts", - "@openzeppelin/contracts": "^5.3.0", - "@openzeppelin/contracts-upgradeable": "^5.3.0", + "@openzeppelin/contracts": "^5.4.0-rc.1", + "@openzeppelin/contracts-upgradeable": "^5.4.0-rc.1", "@types/node": "^20.0.0", "@types/semver": "^7.5.7", "ava": "^6.0.0", diff --git a/packages/core/solidity/src/account.test.ts.md b/packages/core/solidity/src/account.test.ts.md index da256f549..e66fd8fbd 100644 --- a/packages/core/solidity/src/account.test.ts.md +++ b/packages/core/solidity/src/account.test.ts.md @@ -14,7 +14,7 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ ␊ contract CustomAccount is Account, EIP712, ERC7739 {␊ constructor() EIP712("CustomAccount", "1") {}␊ @@ -74,7 +74,7 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ ␊ contract CustomAccountERC7739 is Account, EIP712, ERC7739 {␊ constructor() EIP712("CustomAccountERC7739", "1") {}␊ @@ -102,7 +102,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ ␊ contract CustomAccountERC721Holder is Account, EIP712, ERC7739, ERC721Holder {␊ constructor() EIP712("CustomAccountERC721Holder", "1") {}␊ @@ -130,7 +130,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ ␊ contract CustomAccountERC1155Holder is Account, EIP712, ERC7739, ERC1155Holder {␊ constructor() EIP712("CustomAccountERC1155Holder", "1") {}␊ @@ -159,7 +159,7 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ ␊ contract CustomAccountERC721HolderERC1155Holder is Account, EIP712, ERC7739, ERC721Holder, ERC1155Holder {␊ constructor() EIP712("CustomAccountERC721HolderERC1155Holder", "1") {}␊ @@ -186,7 +186,7 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, ERC7821 {␊ @@ -224,7 +224,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, AccountERC7579 {␊ @@ -300,7 +300,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, AccountERC7579 {␊ @@ -342,7 +342,7 @@ Generated by [AVA](https://avajs.dev). import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, AccountERC7579Hooked {␊ @@ -382,8 +382,8 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract CustomAccountWithSignerERC7702 is Account, EIP712, ERC7739, SignerERC7702 {␊ constructor() EIP712("CustomAccount with SignerERC7702", "1") {}␊ @@ -400,7 +400,7 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract CustomAccountWithSignerERC7702ERC1271 is Account, IERC1271, SignerERC7702 {␊ function isValidSignature(bytes32 hash, bytes calldata signature)␊ @@ -424,8 +424,8 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract CustomAccountWithSignerERC7702ERC7739 is Account, EIP712, ERC7739, SignerERC7702 {␊ constructor() EIP712("CustomAccount with SignerERC7702ERC7739", "1") {}␊ @@ -443,8 +443,8 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract CustomAccountWithSignerERC7702ERC721Holder is Account, EIP712, ERC7739, SignerERC7702, ERC721Holder {␊ constructor() EIP712("CustomAccount with SignerERC7702ERC721Holder", "1") {}␊ @@ -462,8 +462,8 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract CustomAccountWithSignerERC7702ERC1155Holder is Account, EIP712, ERC7739, SignerERC7702, ERC1155Holder {␊ constructor() EIP712("CustomAccount with SignerERC7702ERC1155Holder", "1") {}␊ @@ -482,8 +482,8 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract CustomAccountWithSignerERC7702ERC721HolderERC1155Holder is Account, EIP712, ERC7739, SignerERC7702, ERC721Holder, ERC1155Holder {␊ constructor()␊ @@ -502,9 +502,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, SignerERC7702, ERC7821 {␊ constructor() EIP712("MyAccount", "1") {}␊ @@ -528,13 +528,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, AccountERC7579, SignerERC7702 {␊ constructor() EIP712("MyAccount", "1") {}␊ @@ -584,12 +584,12 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract MyAccount is Account, IERC1271, AccountERC7579, SignerERC7702 {␊ // The following functions are overrides required by Solidity.␊ @@ -634,13 +634,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, AccountERC7579, SignerERC7702 {␊ constructor() EIP712("MyAccount", "1") {}␊ @@ -690,14 +690,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol";␊ + import {SignerERC7702} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol";␊ ␊ contract MyAccount is Account, EIP712, ERC7739, AccountERC7579Hooked, SignerERC7702 {␊ constructor() EIP712("MyAccount", "1") {}␊ @@ -749,9 +749,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerECDSA is Initializable, Account, EIP712, ERC7739, SignerECDSA {␊ @@ -776,7 +776,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerECDSAERC1271 is Initializable, Account, IERC1271, SignerECDSA {␊ @@ -809,9 +809,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerECDSAERC7739 is Initializable, Account, EIP712, ERC7739, SignerECDSA {␊ @@ -836,9 +836,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerECDSAERC721Holder is Initializable, Account, EIP712, ERC7739, SignerECDSA, ERC721Holder {␊ @@ -863,9 +863,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerECDSAERC1155Holder is Initializable, Account, EIP712, ERC7739, SignerECDSA, ERC1155Holder {␊ @@ -891,9 +891,9 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerECDSAERC721HolderERC1155Holder is Initializable, Account, EIP712, ERC7739, SignerECDSA, ERC721Holder, ERC1155Holder {␊ @@ -919,10 +919,10 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, SignerECDSA, ERC7821 {␊ @@ -953,14 +953,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579, SignerECDSA {␊ @@ -1017,13 +1017,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, IERC1271, AccountERC7579, SignerECDSA {␊ @@ -1077,14 +1077,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579, SignerECDSA {␊ @@ -1141,15 +1141,15 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol";␊ + import {SignerECDSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579Hooked, SignerECDSA {␊ @@ -1208,9 +1208,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerP256 is Initializable, Account, EIP712, ERC7739, SignerP256 {␊ @@ -1235,7 +1235,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerP256ERC1271 is Initializable, Account, IERC1271, SignerP256 {␊ @@ -1268,9 +1268,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerP256ERC7739 is Initializable, Account, EIP712, ERC7739, SignerP256 {␊ @@ -1295,9 +1295,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerP256ERC721Holder is Initializable, Account, EIP712, ERC7739, SignerP256, ERC721Holder {␊ @@ -1322,9 +1322,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerP256ERC1155Holder is Initializable, Account, EIP712, ERC7739, SignerP256, ERC1155Holder {␊ @@ -1350,9 +1350,9 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerP256ERC721HolderERC1155Holder is Initializable, Account, EIP712, ERC7739, SignerP256, ERC721Holder, ERC1155Holder {␊ @@ -1378,10 +1378,10 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, SignerP256, ERC7821 {␊ @@ -1412,14 +1412,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579, SignerP256 {␊ @@ -1476,13 +1476,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, IERC1271, AccountERC7579, SignerP256 {␊ @@ -1536,14 +1536,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579, SignerP256 {␊ @@ -1600,15 +1600,15 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol";␊ + import {SignerP256} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579Hooked, SignerP256 {␊ @@ -1667,9 +1667,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerRSA is Initializable, Account, EIP712, ERC7739, SignerRSA {␊ @@ -1694,7 +1694,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerRSAERC1271 is Initializable, Account, IERC1271, SignerRSA {␊ @@ -1727,9 +1727,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerRSAERC7739 is Initializable, Account, EIP712, ERC7739, SignerRSA {␊ @@ -1754,9 +1754,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerRSAERC721Holder is Initializable, Account, EIP712, ERC7739, SignerRSA, ERC721Holder {␊ @@ -1781,9 +1781,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerRSAERC1155Holder is Initializable, Account, EIP712, ERC7739, SignerRSA, ERC1155Holder {␊ @@ -1809,9 +1809,9 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerRSAERC721HolderERC1155Holder is Initializable, Account, EIP712, ERC7739, SignerRSA, ERC721Holder, ERC1155Holder {␊ @@ -1837,10 +1837,10 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, SignerRSA, ERC7821 {␊ @@ -1871,14 +1871,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579, SignerRSA {␊ @@ -1935,13 +1935,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, IERC1271, AccountERC7579, SignerRSA {␊ @@ -1995,14 +1995,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579, SignerRSA {␊ @@ -2059,15 +2059,15 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ - import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol";␊ + import {SignerRSA} from "@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, AccountERC7579Hooked, SignerRSA {␊ @@ -2126,9 +2126,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisig is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913 {␊ @@ -2169,7 +2169,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigERC1271 is Initializable, Account, IERC1271, MultiSignerERC7913 {␊ @@ -2218,9 +2218,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigERC7739 is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913 {␊ @@ -2261,9 +2261,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigERC721Holder is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913, ERC721Holder {␊ @@ -2304,9 +2304,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigERC1155Holder is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913, ERC1155Holder {␊ @@ -2348,9 +2348,9 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigERC721HolderERC1155Holder is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913, ERC721Holder, ERC1155Holder {␊ @@ -2392,10 +2392,10 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913, ERC7821 {␊ @@ -2442,13 +2442,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -2522,12 +2522,12 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -2598,13 +2598,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -2678,14 +2678,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -2761,9 +2761,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigWeighted is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913Weighted {␊ @@ -2812,7 +2812,7 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigWeightedERC1271 is Initializable, Account, IERC1271, MultiSignerERC7913Weighted {␊ @@ -2869,9 +2869,9 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigWeightedERC7739 is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913Weighted {␊ @@ -2922,9 +2922,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigWeightedERC721Holder is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913Weighted, ERC721Holder {␊ @@ -2975,9 +2975,9 @@ Generated by [AVA](https://avajs.dev). import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigWeightedERC1155Holder is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913Weighted, ERC1155Holder {␊ @@ -3029,9 +3029,9 @@ Generated by [AVA](https://avajs.dev). import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";␊ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract CustomAccountWithSignerMultisigWeightedERC721HolderERC1155Holder is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913Weighted, ERC721Holder, ERC1155Holder {␊ @@ -3081,10 +3081,10 @@ Generated by [AVA](https://avajs.dev). ␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {ERC7821} from "@openzeppelin/community-contracts/account/extensions/ERC7821.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ contract MyAccount is Initializable, Account, EIP712, ERC7739, MultiSignerERC7913Weighted, ERC7821 {␊ @@ -3139,14 +3139,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -3228,13 +3228,13 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -3313,14 +3313,14 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ @@ -3402,15 +3402,15 @@ Generated by [AVA](https://avajs.dev). // Compatible with OpenZeppelin Contracts ^5.0.0␊ pragma solidity ^0.8.27;␊ ␊ - import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol";␊ + import {AbstractSigner} from "@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {Account} from "@openzeppelin/community-contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/community-contracts/account/extensions/AccountERC7579Hooked.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ - import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol";␊ + import {ERC7739} from "@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ - import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol";␊ - import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol";␊ + import {MultiSignerERC7913} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ + import {MultiSignerERC7913Weighted} from "@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ diff --git a/packages/core/solidity/src/account.test.ts.snap b/packages/core/solidity/src/account.test.ts.snap index 13cd60956..1a32ab2ba 100644 Binary files a/packages/core/solidity/src/account.test.ts.snap and b/packages/core/solidity/src/account.test.ts.snap differ diff --git a/packages/core/solidity/src/account.ts b/packages/core/solidity/src/account.ts index da79a0809..7cd13866a 100644 --- a/packages/core/solidity/src/account.ts +++ b/packages/core/solidity/src/account.ts @@ -97,7 +97,7 @@ function addSignatureValidation(c: ContractBuilder, opts: AccountOptions) { case 'ERC7739': c.addParent({ name: 'ERC7739', - path: '@openzeppelin/community-contracts/utils/cryptography/ERC7739.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/ERC7739.sol', }); break; case 'ERC1271': @@ -224,7 +224,7 @@ function overrideRawSignatureValidation(c: ContractBuilder, opts: AccountOptions if (opts.signer && opts.ERC7579Modules) { c.addImportOnly({ name: 'AbstractSigner', - path: '@openzeppelin/community-contracts/utils/cryptography/AbstractSigner.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/AbstractSigner.sol', }); c.addOverride({ name: 'AbstractSigner' }, signerFunctions._rawSignatureValidation); c.addOverride({ name: 'AccountERC7579' }, signerFunctions._rawSignatureValidation); diff --git a/packages/core/solidity/src/api.ts b/packages/core/solidity/src/api.ts index 15e0532f8..597e5ae36 100644 --- a/packages/core/solidity/src/api.ts +++ b/packages/core/solidity/src/api.ts @@ -25,6 +25,8 @@ import { } from './stablecoin'; import type { AccountOptions } from './account'; import { printAccount, defaults as accountDefaults } from './account'; +import type { ERC7579Options } from './erc7579'; +import { printERC7579, defaults as erc7579Defaults } from './erc7579'; import type { GovernorOptions } from './governor'; import { printGovernor, @@ -64,6 +66,7 @@ export type ERC1155 = WizardContractAPI & AccessControlAPI & AccessControlAPI; export type RealWorldAsset = WizardContractAPI & AccessControlAPI; export type Account = WizardContractAPI; +export type ERC7579 = WizardContractAPI; export type Governor = WizardContractAPI & AccessControlAPI; export type Custom = WizardContractAPI & AccessControlAPI; @@ -91,6 +94,10 @@ export const account: Account = { print: printAccount, defaults: accountDefaults, }; +export const erc7579: ERC7579 = { + print: printERC7579, + defaults: erc7579Defaults, +}; export const realWorldAsset: RealWorldAsset = { print: printStablecoin, defaults: stablecoinDefaults, diff --git a/packages/core/solidity/src/build-generic.ts b/packages/core/solidity/src/build-generic.ts index 5a6ca4057..47485c1eb 100644 --- a/packages/core/solidity/src/build-generic.ts +++ b/packages/core/solidity/src/build-generic.ts @@ -13,6 +13,8 @@ import { buildGovernor } from './governor'; import type { Contract } from './contract'; import { buildAccount } from './account'; import type { AccountOptions } from './account'; +import { buildERC7579 } from './erc7579'; +import type { ERC7579Options } from './erc7579'; export interface KindedOptions { ERC20: { kind: 'ERC20' } & ERC20Options; @@ -21,6 +23,7 @@ export interface KindedOptions { Stablecoin: { kind: 'Stablecoin' } & StablecoinOptions; RealWorldAsset: { kind: 'RealWorldAsset' } & StablecoinOptions; Account: { kind: 'Account' } & AccountOptions; + ERC7579: { kind: 'ERC7579' } & ERC7579Options; Governor: { kind: 'Governor' } & GovernorOptions; Custom: { kind: 'Custom' } & CustomOptions; } @@ -47,6 +50,9 @@ export function buildGeneric(opts: GenericOptions): Contract { case 'Account': return buildAccount(opts); + case 'ERC7579': + return buildERC7579(opts); + case 'Governor': return buildGovernor(opts); diff --git a/packages/core/solidity/src/erc7579.ts b/packages/core/solidity/src/erc7579.ts new file mode 100644 index 000000000..b502e0abc --- /dev/null +++ b/packages/core/solidity/src/erc7579.ts @@ -0,0 +1,435 @@ +import { ContractBuilder } from './contract'; +import type { Contract } from './contract'; +import { printContract } from './print'; +import { defaults as commonDefaults, withCommonDefaults, type CommonOptions } from './common-options'; +import { defineFunctions } from './utils/define-functions'; +import { requireAccessControl, setAccessControl } from './set-access-control'; + +export const defaults: Required = { + ...commonDefaults, + name: 'MyERC7579Module', + validator: false, + executor: false, + hook: false, + fallback: false, + access: commonDefaults.access, +} as const; + +export type ERC7579MultisigType = { + weighted: boolean; + confirmation: boolean; +}; + +export type ERC7579ValidatorType = { + signature: boolean; + multisig: ERC7579MultisigType; +}; + +export type ERC7579ExecutorType = { + delayed: boolean; +}; + +export interface ERC7579Options extends CommonOptions { + name: string; + validator?: ERC7579ValidatorType | false; + executor?: ERC7579ExecutorType | false; + hook: boolean; + fallback: boolean; +} + +function withDefaults(opts: ERC7579Options): Required { + return { + ...withCommonDefaults(opts), + name: opts.name ?? defaults.name, + validator: opts.validator ?? defaults.validator, + executor: opts.executor ?? defaults.executor, + hook: opts.hook ?? defaults.hook, + fallback: opts.fallback ?? defaults.fallback, + }; +} + +export function printERC7579(opts: ERC7579Options = defaults): string { + return printContract(buildERC7579(opts)); +} + +export function buildERC7579(opts: ERC7579Options): Contract { + const allOpts = withDefaults(opts); + + const c = new ContractBuilder(allOpts.name); + + addParents(c, allOpts); + overrideIsModuleType(c, allOpts); + overrideValidation(c, allOpts); + addInstallFns(c, allOpts); + + return c; +} + +function overrideIsModuleType(c: ContractBuilder, opts: ERC7579Options): void { + const fn = functions.isModuleType; + c.addOverride({ name: 'IERC7579Module' }, fn); + + if (opts.executor) { + c.addOverride({ name: 'ERC7579Executor' }, fn); + } + + if (opts.validator) { + c.addOverride({ name: 'ERC7579Validator' }, fn); + } + + if (opts.hook) { + c.addOverride({ name: 'IERC7579Hook' }, fn); + } + + if (opts.fallback) { + // c.addOverride({ name: 'IERC7579Module' }, fn); + } + + const implementedIn = ['ERC7579Executor', 'ERC7579Validator']; + const contractFn = c.functions.find(f => f.name === 'isModuleType')!; + const allOverrides = Array.from(contractFn?.override.values() ?? []).map(v => v.name); + const implementedOverrides = allOverrides.filter(type => implementedIn.includes(type)); + const unimplementedOverrides = allOverrides.filter(type => !implementedIn.includes(type)); + + if (!implementedOverrides.length && !unimplementedOverrides.length) { + c.setFunctionBody(['return false;'], fn); + } else if (!implementedOverrides.length && unimplementedOverrides.length === 1) { + const importedType = unimplementedOverrides[0]! === 'IERC7579Hook' ? 'MODULE_TYPE_HOOK' : 'MODULE_TYPE_FALLBACK'; + c.setFunctionBody([`return ${fn.args[0]!.name} == ${importedType};`], fn); + } else if (implementedOverrides.length == 1 && !unimplementedOverrides.length) { + c.setFunctionBody([`return ${implementedOverrides[0]!}.isModuleType(${fn.args[0]!.name})`], fn); + } else { + const body: string[] = []; + for (const type of implementedOverrides) { + body.push(`bool is${type} = ${type}.isModuleType(${fn.args[0]!.name});`); + } + for (const type of unimplementedOverrides) { + const importedType = type === 'IERC7579Hook' ? 'MODULE_TYPE_HOOK' : 'MODULE_TYPE_FALLBACK'; + c.addImportOnly({ + name: importedType, + path: '@openzeppelin/contracts/interfaces/draft-IERC7579.sol', + }); + body.push(`bool is${type} = ${fn.args[0]!.name} == ${importedType};`); + } + body.push(`return ${allOverrides.map(type => `is${type}`).join(' || ')};`); + c.setFunctionBody(body, fn); + } +} + +function addParents(c: ContractBuilder, opts: ERC7579Options): void { + c.addParent({ + name: 'IERC7579Module', + path: '@openzeppelin/contracts/interfaces/draft-IERC7579.sol', + }); + + if (opts.executor) { + c.addParent({ + name: 'ERC7579Executor', + path: '@openzeppelin/community-contracts/account/modules/ERC7579Executor.sol', + }); + + if (opts.executor.delayed) { + c.addParent({ + name: 'ERC7579DelayedExecutor', + path: '@openzeppelin/community-contracts/account/modules/ERC7579DelayedExecutor.sol', + }); + } + } + + if (opts.validator) { + c.addParent({ + name: 'ERC7579Validator', + path: '@openzeppelin/community-contracts/account/modules/ERC7579Validator.sol', + }); + + if (opts.validator.signature) { + c.addParent({ + name: 'ERC7579Signature', + path: '@openzeppelin/community-contracts/account/modules/ERC7579Signature.sol', + }); + } + + if (opts.validator.multisig) { + c.addParent({ + name: 'ERC7579Multisig', + path: '@openzeppelin/community-contracts/account/modules/ERC7579Multisig.sol', + }); + + if (opts.validator.multisig.weighted) { + c.addParent({ + name: 'ERC7579MultisigWeighted', + path: '@openzeppelin/community-contracts/account/modules/ERC7579MultisigWeighted.sol', + }); + } + + if (opts.validator.multisig.confirmation) { + c.addParent({ + name: 'ERC7579MultisigConfirmation', + path: '@openzeppelin/community-contracts/account/modules/ERC7579MultisigConfirmation.sol', + }); + } + } + } + + if (opts.hook) { + c.addParent({ + name: 'IERC7579Hook', + path: '@openzeppelin/contracts/interfaces/draft-IERC7579.sol', + }); + } + + if (opts.fallback) { + // noop + } +} + +function overrideValidation(c: ContractBuilder, opts: ERC7579Options): void { + if (opts.access) setAccessControl(c, opts.access); + if (opts.executor) { + const delayed = opts.executor.delayed; // Delayed ensures single execution per operation. + const fn = delayed ? functions._validateSchedule : functions._validateExecution; + c.addOverride(c, fn); + c.setFunctionComments( + ['/// @dev Data is encoded as `[uint16(executionCalldatalLength), executionCalldata, signature]`'], + fn, + ); + if (opts.validator) { + c.addParent( + { + name: 'EIP712', + path: '@openzeppelin/contracts/utils/cryptography/EIP712.sol', + }, + [opts.name, '1'], + ); + c.addParent({ + name: 'Nonces', + path: '@openzeppelin/contracts/utils/Nonces.sol', + }); + c.addVariable( + `bytes32 public constant EXECUTION_TYPEHASH = keccak256("Execute(address account,bytes32 salt,${!delayed ? 'uint256 nonce,' : ''}bytes32 mode,bytes executionCalldata)");`, + ); + const body = [ + `uint16 executionCalldataLength = uint16(bytes2(${fn.args[3]!.name}[0:2])); // First 2 bytes are the length`, + `bytes calldata executionCalldata = ${fn.args[3]!.name}[2:2 + executionCalldataLength]; // Next bytes are the calldata`, + `bytes32 typeHash = _hashTypedDataV4(keccak256(abi.encode(EXECUTION_TYPEHASH, ${fn.args[0]!.name}, ${fn.args[1]!.name},${!delayed ? ` _useNonce(${fn.args[0]!.name}),` : ''} ${fn.args[2]!.name}, executionCalldata)));`, + ]; + const conditions = [ + `_rawERC7579Validation(${fn.args[0]!.name}, typeHash, ${fn.args[3]!.name}[2 + executionCalldataLength:])`, + ]; + switch (opts.access) { + case 'ownable': + conditions.unshift('msg.sender == owner()'); + break; + case 'roles': { + const roleOwner = 'executor'; + const roleId = 'EXECUTOR_ROLE'; + c.addVariable(`bytes32 public constant ${roleId} = keccak256("${roleId}");`); + c.addConstructorArgument({ type: 'address', name: roleOwner }); + c.addConstructorCode(`_grantRole(${roleId}, ${roleOwner});`); + conditions.unshift(`hasRole(${roleId}, msg.sender)`); + break; + } + case 'managed': + c.addImportOnly({ + name: 'AuthorityUtils', + path: `@openzeppelin/contracts/access/manager/AuthorityUtils.sol`, + }); + body.push( + `(bool immediate, ) = AuthorityUtils.canCallWithDelay(authority(), msg.sender, address(this), bytes4(msg.data[0:4]));`, + ); + conditions.unshift('immediate'); + break; + default: + } + body.push(`require(${conditions.join(' || ')});`); + if (!delayed) body.push(`return executionCalldata;`); + c.setFunctionBody(body, fn); + } else if (opts.access) { + requireAccessControl(c, fn, opts.access, 'EXECUTOR', 'executor'); + } else { + c.setFunctionBody( + [ + `// Slice \`${fn.args[3]!.name}\` to build custom authorization based on calldata`, + `return ${fn.args[3]!.name}; // Use raw ${fn.args[3]!.name} as execution calldata`, + ], + fn, + ); + } + } + if (opts.validator) { + const isValidFn = functions.isValidSignatureWithSender; + const fnSuper = `super.${isValidFn.name}(${isValidFn.args.map(a => a.name).join(', ')})`; + c.addOverride(c, isValidFn); + + if (!opts.validator.multisig && opts.validator.signature) { + c.setFunctionBody(['return false;'], functions._rawERC7579Validation); + } + + switch (opts.access) { + case 'ownable': + c.addImportOnly({ name: 'IERC1271', path: '@openzeppelin/contracts/interfaces/IERC1271.sol' }); + c.setFunctionBody( + [`return owner() == ${isValidFn.args[0]!.name} ? IERC1271.isValidSignature.selector : ${fnSuper};`], + isValidFn, + ); + break; + case 'roles': { + const roleOwner = 'erc1271ValidSender'; + const roleId = 'ERC1271_VALID_SENDER_ROLE'; + c.addVariable(`bytes32 public constant ${roleId} = keccak256("${roleId}");`); + c.addConstructorArgument({ type: 'address', name: roleOwner }); + c.addConstructorCode(`_grantRole(${roleId}, ${roleOwner});`); + c.setFunctionBody([`return hasRole(${roleId}, ${isValidFn.args[0]!.name}) || ${fnSuper};`], isValidFn); + break; + } + case 'managed': + c.addImportOnly({ + name: 'AuthorityUtils', + path: `@openzeppelin/contracts/access/manager/AuthorityUtils.sol`, + }); + c.setFunctionBody( + [ + `(bool immediate, ) = AuthorityUtils.canCallWithDelay(authority(), ${isValidFn.args[0]!.name}, address(this), bytes4(msg.data[0:4]));`, + `return immediate || ${fnSuper};`, + ], + isValidFn, + ); + break; + default: + } + } +} + +function addInstallFns(c: ContractBuilder, opts: ERC7579Options): void { + if (opts.validator && opts.validator.signature) { + c.addOverride({ name: 'ERC7579Signature' }, functions.onInstall); + c.addOverride({ name: 'ERC7579Signature' }, functions.onUninstall); + } + + if (opts.validator && opts.validator.multisig) { + const name = opts.validator.multisig.weighted ? 'ERC7579MultisigWeighted' : 'ERC7579Multisig'; + c.addOverride({ name }, functions.onInstall); + c.addOverride({ name }, functions.onUninstall); + } + + if (opts.executor && opts.executor.delayed) { + c.addOverride({ name: 'ERC7579DelayedExecutor' }, functions.onInstall); + c.addOverride({ name: 'ERC7579DelayedExecutor' }, functions.onUninstall); + } + + const onInstallFn = c.functions.find(f => f.name === 'onInstall'); + const allOnInstallOverrides = Array.from(onInstallFn?.override.values() ?? []).map(c => c.name); + buildOnInstallFn(c, allOnInstallOverrides); + + const onUninstallFn = c.functions.find(f => f.name === 'onUninstall'); + const allOnUninstallOverrides = Array.from(onUninstallFn?.override.values() ?? []).map(c => c.name); + buildOnUninstallFn(c, allOnUninstallOverrides); +} + +function buildOnInstallFn(c: ContractBuilder, overrides: string[]) { + const fn = functions.onInstall; + if (!overrides.length) { + c.setFunctionBody(['// Use `data` to initialize'], fn); + } + // overrides.length == 1 will use super by default + else if (overrides.length >= 2) { + const body: string[] = []; + let lengthOffset = '0'; + let comment = '/// @dev Data is encoded as `['; + + for (const [i, name] of overrides.entries()) { + const argsName = `args${name}`; + const lengthName = `${argsName}Length`; + const argsOffset = !i ? '2' : `${lengthOffset} + 2`; + const restOffset = `${argsOffset} + ${lengthName}`; + comment += `uint16(${lengthName}), ${argsName}`; + body.push( + `uint16 ${lengthName} = uint16(bytes2(${fn.args[0]!.name}[${lengthOffset}:${argsOffset}])); // First 2 bytes are the length`, + `bytes calldata ${argsName} = ${fn.args[0]!.name}[${argsOffset}:${restOffset}]; // Next bytes are the args`, + `${name}.onInstall(${argsName});`, + ); + if (i != overrides.length - 1) { + body.push(''); + comment += ', '; + } + lengthOffset = restOffset; + } + c.setFunctionComments([`${comment}]`], fn); + c.setFunctionBody(body, fn); + } +} + +function buildOnUninstallFn(c: ContractBuilder, overrides: string[]) { + const fn = functions.onUninstall; + if (!overrides.length) { + c.setFunctionBody(['// Use `data` to deinitialize'], fn); + } + // overrides.length == 1 will use super by default + else if (overrides.length >= 2) { + c.addImportOnly({ name: 'Calldata', path: '@openzeppelin/contracts/utils/Calldata.sol' }); + const body: string[] = []; + for (const name of overrides) { + body.push(`${name}.onUninstall(Calldata.emptyBytes());`); + } + c.setFunctionBody(body, fn); + } +} + +const functions = { + ...defineFunctions({ + _validateExecution: { + kind: 'internal' as const, + args: [ + { name: 'account', type: 'address' }, + { name: 'salt', type: 'bytes32' }, + { name: 'mode', type: 'bytes32' }, + { name: 'data', type: 'bytes calldata' }, + ], + returns: ['bytes calldata'], + }, + _validateSchedule: { + kind: 'internal' as const, + mutability: 'view', + args: [ + { name: 'account', type: 'address' }, + { name: 'salt', type: 'bytes32' }, + { name: 'mode', type: 'bytes32' }, + { name: 'data', type: 'bytes calldata' }, + ], + }, + isValidSignatureWithSender: { + kind: 'public' as const, + mutability: 'view', + args: [ + { name: 'sender', type: 'address' }, + { name: 'hash', type: 'bytes32' }, + { name: 'signature', type: 'bytes calldata' }, + ], + returns: ['bytes4'], + }, + _rawERC7579Validation: { + kind: 'internal' as const, + mutability: 'view', + args: [ + { name: 'account', type: 'address' }, + { name: 'hash', type: 'bytes32' }, + { name: 'signature', type: 'bytes calldata' }, + ], + returns: ['bool'], + }, + isModuleType: { + kind: 'public' as const, + mutability: 'pure', + args: [{ name: 'moduleTypeId', type: 'uint256' }], + returns: ['bool'], + }, + onInstall: { + kind: 'public' as const, + args: [{ name: 'data', type: 'bytes calldata' }], + }, + onUninstall: { + kind: 'public' as const, + args: [{ name: 'data', type: 'bytes calldata' }], + }, + }), +}; diff --git a/packages/core/solidity/src/generate/erc7579.ts b/packages/core/solidity/src/generate/erc7579.ts new file mode 100644 index 000000000..7c5d641c1 --- /dev/null +++ b/packages/core/solidity/src/generate/erc7579.ts @@ -0,0 +1,31 @@ +import type { ERC7579Options } from '../erc7579'; +import { accessOptions } from '../set-access-control'; +import { infoOptions } from '../set-info'; +import { generateAlternatives } from './alternatives'; + +const erc7579 = { + name: ['MyERC7579'], + validator: [ + { + signature: false, + multisig: { + weighted: false, + confirmation: false, + }, + }, + ] as const, + executor: [ + { + delayed: false, + }, + ] as const, + hook: [false] as const, + fallback: [false] as const, + access: accessOptions, + upgradeable: [false] as const, + info: infoOptions, +}; + +export function* generateERC7579Options(): Generator> { + yield* generateAlternatives(erc7579); +} diff --git a/packages/core/solidity/src/generate/sources.ts b/packages/core/solidity/src/generate/sources.ts index c80ad5789..63a3fcc1b 100644 --- a/packages/core/solidity/src/generate/sources.ts +++ b/packages/core/solidity/src/generate/sources.ts @@ -7,6 +7,7 @@ import { generateERC721Options } from './erc721'; import { generateERC1155Options } from './erc1155'; import { generateStablecoinOptions } from './stablecoin'; import { generateAccountOptions } from './account'; +import { generateERC7579Options } from './erc7579'; import { generateGovernorOptions } from './governor'; import { generateCustomOptions } from './custom'; import type { GenericOptions, KindedOptions } from '../build-generic'; @@ -57,6 +58,12 @@ export function* generateOptions(kind?: Kind): Generator { } } + if (!kind || kind === 'ERC7579') { + for (const kindOpts of generateERC7579Options()) { + yield { kind: 'ERC7579', ...kindOpts }; + } + } + if (!kind || kind === 'Governor') { for (const kindOpts of generateGovernorOptions()) { yield { kind: 'Governor', ...kindOpts }; diff --git a/packages/core/solidity/src/index.ts b/packages/core/solidity/src/index.ts index 209c432c3..a1551b70f 100644 --- a/packages/core/solidity/src/index.ts +++ b/packages/core/solidity/src/index.ts @@ -19,7 +19,7 @@ export { OptionsError } from './error'; export type { Kind } from './kind'; export { sanitizeKind } from './kind'; -export { erc20, erc721, erc1155, stablecoin, realWorldAsset, account, governor, custom } from './api'; +export { erc20, erc721, erc1155, stablecoin, realWorldAsset, account, erc7579, governor, custom } from './api'; export { compatibleContractsSemver } from './utils/version'; @@ -28,5 +28,6 @@ export type { ERC721Options } from './erc721'; export type { ERC1155Options } from './erc1155'; export type { StablecoinOptions } from './stablecoin'; export type { AccountOptions } from './account'; +export type { ERC7579Options } from './erc7579'; export type { GovernorOptions } from './governor'; export type { CustomOptions } from './custom'; diff --git a/packages/core/solidity/src/kind.ts b/packages/core/solidity/src/kind.ts index 7e1ea1f52..fdfbbcb95 100644 --- a/packages/core/solidity/src/kind.ts +++ b/packages/core/solidity/src/kind.ts @@ -20,6 +20,7 @@ function isKind(value: Kind | T): value is Kind { case 'Stablecoin': case 'RealWorldAsset': case 'Account': + case 'ERC7579': case 'Governor': case 'Custom': return true; diff --git a/packages/core/solidity/src/signer.ts b/packages/core/solidity/src/signer.ts index 09e2cd111..5b6348b9f 100644 --- a/packages/core/solidity/src/signer.ts +++ b/packages/core/solidity/src/signer.ts @@ -49,27 +49,27 @@ export function addSigner(c: ContractBuilder, signer: SignerOptions): void { export const signers = { ERC7702: { name: 'SignerERC7702', - path: '@openzeppelin/community-contracts/utils/cryptography/SignerERC7702.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/SignerERC7702.sol', }, ECDSA: { name: 'SignerECDSA', - path: '@openzeppelin/community-contracts/utils/cryptography/SignerECDSA.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/SignerECDSA.sol', }, P256: { name: 'SignerP256', - path: '@openzeppelin/community-contracts/utils/cryptography/SignerP256.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/SignerP256.sol', }, RSA: { name: 'SignerRSA', - path: '@openzeppelin/community-contracts/utils/cryptography/SignerRSA.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/SignerRSA.sol', }, Multisig: { name: 'MultiSignerERC7913', - path: '@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913.sol', }, MultisigWeighted: { name: 'MultiSignerERC7913Weighted', - path: '@openzeppelin/community-contracts/utils/cryptography/MultiSignerERC7913Weighted.sol', + path: '@openzeppelin/community-contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol', }, }; diff --git a/packages/mcp/src/solidity/schemas.ts b/packages/mcp/src/solidity/schemas.ts index 617f2fb25..8ebb57c74 100644 --- a/packages/mcp/src/solidity/schemas.ts +++ b/packages/mcp/src/solidity/schemas.ts @@ -9,6 +9,7 @@ import { solidityGovernorDescriptions, solidityAccountDescriptions, solidityStablecoinDescriptions, + solidityERC7579Descriptions, } from '@openzeppelin/wizard-common'; import type { KindedOptions } from '@openzeppelin/wizard'; @@ -26,6 +27,7 @@ function _typeAssertions() { RealWorldAsset: z.object(rwaSchema).parse({}), Account: z.object(accountSchema).parse({}), Governor: z.object(governorSchema).parse({}), + ERC7579: z.object(erc7579Schema).parse({}), Custom: z.object(customSchema).parse({}), }; } @@ -112,7 +114,7 @@ export const stablecoinSchema = { export const rwaSchema = stablecoinSchema; export const accountSchema = { - name: z.string().describe('The name of the account contract'), + name: z.string().describe(commonDescriptions.name), signatureValidation: z .literal(false) .or(z.literal('ERC1271')) @@ -173,6 +175,24 @@ export const governorSchema = { info: commonSchema.info, } as const satisfies z.ZodRawShape; +export const erc7579Schema = { + name: z.string().describe(commonDescriptions.name), + validator: z.object({ + signature: z.boolean().describe(solidityERC7579Descriptions.validator.signature), + multisig: z.object({ + weighted: z.boolean().describe(solidityERC7579Descriptions.validator.multisig.weighted), + confirmation: z.boolean().describe(solidityERC7579Descriptions.validator.multisig.confirmation), + }), + }), + executor: z.object({ + delayed: z.boolean().describe(solidityERC7579Descriptions.executor.delayed), + }), + hook: z.boolean().describe(solidityERC7579Descriptions.hook), + fallback: z.boolean().describe(solidityERC7579Descriptions.fallback), + access: commonSchema.access, + info: commonSchema.info, +} as const satisfies z.ZodRawShape; + export const customSchema = { name: z.string().describe(commonDescriptions.name), pausable: z.boolean().optional().describe(commonDescriptions.pausable), diff --git a/packages/mcp/src/solidity/tools.ts b/packages/mcp/src/solidity/tools.ts index 932d6e4f0..184c8e440 100644 --- a/packages/mcp/src/solidity/tools.ts +++ b/packages/mcp/src/solidity/tools.ts @@ -1,5 +1,6 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { registerSolidityAccount } from './tools/account.js'; +import { registerSolidityERC7579 } from './tools/erc7579.js'; import { registerSolidityCustom } from './tools/custom.js'; import { registerSolidityERC20 } from './tools/erc20.js'; import { registerSolidityERC721 } from './tools/erc721.js'; @@ -22,6 +23,7 @@ function getRegisterFunctions(server: McpServer): SolidityToolRegisterFunctions Stablecoin: () => registerSolidityStablecoin(server), RealWorldAsset: () => registerSolidityRWA(server), Account: () => registerSolidityAccount(server), + ERC7579: () => registerSolidityERC7579(server), Governor: () => registerSolidityGovernor(server), Custom: () => registerSolidityCustom(server), }; diff --git a/packages/mcp/src/solidity/tools/erc7579.test.ts b/packages/mcp/src/solidity/tools/erc7579.test.ts new file mode 100644 index 000000000..6c3935117 --- /dev/null +++ b/packages/mcp/src/solidity/tools/erc7579.test.ts @@ -0,0 +1,77 @@ +import type { TestFn, ExecutionContext } from 'ava'; +import _test from 'ava'; +import type { RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { registerSolidityERC7579 } from './erc7579'; +import type { DeepRequired } from '../../helpers.test'; +import { testMcpInfo, assertAPIEquivalence } from '../../helpers.test'; +import type { ERC7579Options } from '@openzeppelin/wizard'; +import { erc7579 } from '@openzeppelin/wizard'; +import { erc7579Schema } from '../schemas'; +import { z } from 'zod'; + +interface Context { + tool: RegisteredTool; + schema: z.ZodObject; +} + +const test = _test as TestFn; + +test.before(t => { + t.context.tool = registerSolidityERC7579(new McpServer(testMcpInfo)); + t.context.schema = z.object(erc7579Schema); +}); + +function assertHasAllSupportedFields( + t: ExecutionContext, + params: DeepRequired>, +) { + // omit fields that are not included in the schema but are in ERC7579Options + const _: DeepRequired> = params; + t.pass(); +} + +test('basic', async t => { + const params: z.infer = { + name: 'MyERC7579Module', + validator: { + signature: false, + multisig: { + weighted: false, + confirmation: false, + }, + }, + executor: { + delayed: false, + }, + hook: false, + fallback: false, + }; + await assertAPIEquivalence(t, params, erc7579.print); +}); + +test('all', async t => { + const params: DeepRequired> = { + name: 'MyERC7579Module', + validator: { + signature: true, + multisig: { + weighted: true, + confirmation: true, + }, + }, + executor: { + delayed: true, + }, + hook: true, + fallback: true, + access: 'roles', + info: { + license: 'MIT', + securityContact: 'security@example.com', + }, + }; + + assertHasAllSupportedFields(t, params); + await assertAPIEquivalence(t, params, erc7579.print); +}); diff --git a/packages/mcp/src/solidity/tools/erc7579.ts b/packages/mcp/src/solidity/tools/erc7579.ts new file mode 100644 index 000000000..a7914a4ec --- /dev/null +++ b/packages/mcp/src/solidity/tools/erc7579.ts @@ -0,0 +1,32 @@ +import type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js'; +import type { ERC7579Options } from '@openzeppelin/wizard'; +import { erc7579 } from '@openzeppelin/wizard'; +import { safePrintSolidityCodeBlock, makeDetailedPrompt } from '../../utils'; +import { erc7579Schema } from '../schemas'; +import { solidityPrompts } from '@openzeppelin/wizard-common'; + +export function registerSolidityERC7579(server: McpServer): RegisteredTool { + return server.tool( + 'solidity-erc7579', + makeDetailedPrompt(solidityPrompts.ERC7579), + erc7579Schema, + async ({ name, validator, executor, hook, fallback, info }) => { + const opts: ERC7579Options = { + name, + validator, + executor, + hook, + fallback, + info, + }; + return { + content: [ + { + type: 'text', + text: safePrintSolidityCodeBlock(() => erc7579.print(opts)), + }, + ], + }; + }, + ); +} diff --git a/packages/ui/api/ai-assistant/function-definitions/solidity.ts b/packages/ui/api/ai-assistant/function-definitions/solidity.ts index 00df94474..e52431b83 100644 --- a/packages/ui/api/ai-assistant/function-definitions/solidity.ts +++ b/packages/ui/api/ai-assistant/function-definitions/solidity.ts @@ -9,7 +9,10 @@ import { solidityERC1155Descriptions, solidityStablecoinDescriptions, solidityGovernorDescriptions, + solidityERC7579Descriptions, } from '../../../../common/src/ai/descriptions/solidity.ts'; +import type { ERC7579ExecutorType, ERC7579ValidatorType } from '../../../../core/solidity/dist/erc7579.js'; +import type { AiFunctionCallAnyOf, TypeFor } from '../types/helpers.ts'; export const solidityERC20AIFunctionDefinition = { name: 'ERC20', @@ -233,6 +236,67 @@ export const solidityAccountAIFunctionDefinition = { }, } as const satisfies AiFunctionDefinition<'solidity', 'Account'>; +export const solidityERC7579AIFunctionDefinition = { + name: 'ERC7579', + description: solidityPrompts.ERC7579, + parameters: { + type: 'object', + properties: { + ...addFunctionPropertiesFrom(commonFunctionDescription, ['name', 'info', 'access']), + validator: { + anyOf: [ + { type: 'boolean', enum: [false] } as TypeFor<'boolean', false>, + { + type: 'object', + properties: { + signature: { type: 'boolean', description: solidityERC7579Descriptions.validator.signature }, + multisig: { + type: 'object', + properties: { + weighted: { type: 'boolean', description: solidityERC7579Descriptions.validator.multisig.weighted }, + confirmation: { + type: 'boolean', + description: solidityERC7579Descriptions.validator.multisig.confirmation, + }, + }, + additionalProperties: false, + }, + }, + additionalProperties: false, + } as TypeFor<'object', ERC7579ValidatorType>, + ] as AiFunctionCallAnyOf, + description: solidityERC7579Descriptions.validator._description, + }, + // executor: { + // anyOf: [ + // { type: 'boolean', enum: [false] } as TypeFor<'boolean', false>, + // { + // type: 'object', + // properties: { + // delayed: { + // type: 'boolean', + // description: solidityERC7579Descriptions.executor.delayed, + // }, + // }, + // additionalProperties: false, + // } as TypeFor<'object', ERC7579ExecutorType>, + // ] as AiFunctionCallAnyOf, + // description: solidityERC7579Descriptions.executor._description, + // }, + hook: { + type: 'boolean', + description: solidityERC7579Descriptions.hook, + }, + fallback: { + type: 'boolean', + description: solidityERC7579Descriptions.fallback, + }, + }, + required: ['name', 'hook', 'fallback'], + additionalProperties: false, + }, +} as const satisfies AiFunctionDefinition<'solidity', 'ERC7579'>; + export const solidityGovernorAIFunctionDefinition = { name: 'Governor', description: solidityPrompts.Governor, diff --git a/packages/ui/api/ai-assistant/types/helpers.ts b/packages/ui/api/ai-assistant/types/helpers.ts index 8b747c316..dde15597d 100644 --- a/packages/ui/api/ai-assistant/types/helpers.ts +++ b/packages/ui/api/ai-assistant/types/helpers.ts @@ -32,15 +32,17 @@ type MembersOf = K extends 'boolean' ? Extract : K extends 'number' ? Extract - : never; + : K extends 'object' + ? Extract + : never; type BooleanEnum = [false] | [true] | [false, true] | [true, false]; type EnumFor = K extends 'boolean' ? BooleanEnum : Permutation>; -type TypeFor = { +export type TypeFor = { type: K; - enum: EnumFor; + enum: K extends 'object' ? undefined : EnumFor; }; type Wrap = { __wrapped: T }; diff --git a/packages/ui/api/ai-assistant/types/languages.ts b/packages/ui/api/ai-assistant/types/languages.ts index 076b08e0f..15a649ca7 100644 --- a/packages/ui/api/ai-assistant/types/languages.ts +++ b/packages/ui/api/ai-assistant/types/languages.ts @@ -27,6 +27,7 @@ export type LanguagesContractsOptions = { RealWorldAsset: Omit & { upgradeable?: false }; Account: Omit & { upgradeable?: false; access?: false }; Governor: Omit & { access?: false }; + ERC7579: Omit & { upgradeable?: false }; }; cairo: CairoKindedOptions; cairoAlpha: CairoAlphaKindedOptions; diff --git a/packages/ui/src/common/styles/global.css b/packages/ui/src/common/styles/global.css index be16ae5f4..d59531c17 100644 --- a/packages/ui/src/common/styles/global.css +++ b/packages/ui/src/common/styles/global.css @@ -87,12 +87,16 @@ input[type='number'] { display: flex; flex-direction: column; - & > * { + & > *:not(.checkbox-group) { display: flex; align-items: center; padding: var(--size-2); } + & > .checkbox-group { + margin-left: 1rem; + } + input { margin-right: var(--size-2); } diff --git a/packages/ui/src/solidity/AccessControlSection.svelte b/packages/ui/src/solidity/AccessControlSection.svelte index 35ec01511..c72ea7188 100644 --- a/packages/ui/src/solidity/AccessControlSection.svelte +++ b/packages/ui/src/solidity/AccessControlSection.svelte @@ -6,6 +6,7 @@ export let access: Access; export let required: boolean; + export let disabled: boolean | undefined; let defaultValueWhenEnabled: 'ownable' | 'roles' | 'managed' = 'ownable'; let wasRequired = required; @@ -35,6 +36,7 @@ helpContent="Restrict who can access the functions of a contract or when they can do it." helpLink="https://docs.openzeppelin.com/contracts/api/access" {required} + {disabled} >