Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat: add 7702 compatible semi modular account #288

Merged
merged 2 commits into from
Nov 15, 2024
Merged

Conversation

fangting-alchemy
Copy link
Collaborator

Motivation

Support EIP-7702 EOA delegation with semi modular account.

Solution

Default fallback signer to address(this) aka EOA address for 7702 EOA account.

Copy link

octane-security-app bot commented Nov 11, 2024

Summary by Octane

New Contracts

  • SemiModularAccount7702.sol: The smart contract implements a semi-modular account for EIP-7702 EOAs, with an immutable default signer and disallows upgrades.

Updated Contracts

  • ModularAccountBase.sol: Added virtual to the upgradeToAndCall function, enabling it to be overridden in derived contracts.

🔗 Commit Hash: 024b620

Copy link

github-actions bot commented Nov 11, 2024

Contract sizes:

 | Contract                      | Runtime Size (B) | Initcode Size (B) | Runtime Margin (B) | Initcode Margin (B) |
 |-------------------------------|------------------|-------------------|--------------------|---------------------|
 | AccountFactory                |            5,921 |             6,386 |             18,655 |              42,766 |
 | AllowlistModule               |            9,553 |             9,580 |             15,023 |              39,572 |
 | ExecutionInstallDelegate      |            5,714 |             5,760 |             18,862 |              43,392 |
-| ModularAccount                |           21,975 |            28,804 |              2,601 |              20,348 |
-| NativeFunctionDelegate        |              560 |               587 |             24,016 |              48,565 |
+| ModularAccount                |           21,975 |            28,678 |              2,601 |              20,474 |
+| NativeFunctionDelegate        |              434 |               461 |             24,142 |              48,691 |
 | NativeTokenLimitModule        |            4,449 |             4,476 |             20,127 |              44,676 |
 | PaymasterGuardModule          |            1,845 |             1,872 |             22,731 |              47,280 |
-| SemiModularAccountBytecode    |           23,358 |            30,187 |              1,218 |              18,965 |
-| SemiModularAccountStorageOnly |           23,852 |            30,681 |                724 |              18,471 |
+| SemiModularAccount7702        |           22,795 |            29,491 |              1,781 |              19,661 |
+| SemiModularAccountBytecode    |           23,277 |            29,980 |              1,299 |              19,172 |
+| SemiModularAccountStorageOnly |           23,771 |            30,474 |                805 |              18,678 |
 | SingleSignerValidationModule  |            3,646 |             3,673 |             20,930 |              45,479 |
 | TimeRangeModule               |            2,000 |             2,027 |             22,576 |              47,125 |
 | WebAuthnValidationModule      |            7,854 |             7,881 |             16,722 |              41,271 |

Code coverage:

File % Lines % Statements % Branches % Funcs
src/account/AccountBase.sol 100.00% (8/8) 100.00% (7/7) 100.00% (2/2) 100.00% (4/4)
src/account/AccountStorageInitializable.sol 100.00% (19/19) 100.00% (26/26) 100.00% (5/5) 100.00% (2/2)
src/account/ModularAccount.sol 100.00% (2/2) 100.00% (2/2) 100.00% (0/0) 100.00% (2/2)
src/account/ModularAccountBase.sol 98.99% (294/297) 96.30% (364/378) 77.59% (45/58) 97.30% (36/37)
src/account/ModularAccountView.sol 100.00% (24/24) 100.00% (28/28) 100.00% (2/2) 100.00% (4/4)
src/account/ModuleManagerInternals.sol 95.08% (58/61) 96.20% (76/79) 62.50% (5/8) 100.00% (3/3)
src/account/SemiModularAccount7702.sol 0.00% (0/6) 0.00% (0/6) 0.00% (0/1) 0.00% (0/3)
src/account/SemiModularAccountBase.sol 88.71% (55/62) 92.13% (82/89) 66.67% (10/15) 100.00% (15/15)
src/account/SemiModularAccountBytecode.sol 100.00% (6/6) 100.00% (7/7) 100.00% (1/1) 100.00% (2/2)
src/account/SemiModularAccountStorageOnly.sol 80.00% (4/5) 83.33% (5/6) 100.00% (0/0) 50.00% (1/2)
src/account/TokenReceiver.sol 33.33% (1/3) 33.33% (1/3) 100.00% (0/0) 33.33% (1/3)
src/factory/AccountFactory.sol 75.56% (34/45) 80.33% (49/61) 50.00% (3/6) 60.00% (9/15)
src/helpers/ExecutionInstallDelegate.sol 92.59% (50/54) 92.96% (66/71) 40.00% (2/5) 100.00% (7/7)
src/helpers/NativeFunctionDelegate.sol 100.00% (16/16) 100.00% (30/30) 100.00% (0/0) 100.00% (1/1)
src/libraries/ExecutionLib.sol 99.64% (276/277) 98.89% (268/271) 90.91% (30/33) 100.00% (24/24)
src/libraries/KnownSelectorsLib.sol 100.00% (16/16) 100.00% (34/34) 100.00% (0/0) 100.00% (2/2)
src/libraries/LinkedListSetLib.sol 94.00% (47/50) 96.25% (77/80) 66.67% (4/6) 100.00% (8/8)
src/libraries/MemManagementLib.sol 100.00% (54/54) 100.00% (70/70) 100.00% (0/0) 100.00% (12/12)
src/libraries/ModuleInstallCommonsLib.sol 57.14% (8/14) 42.11% (8/19) 75.00% (3/4) 100.00% (3/3)
src/modules/ModuleBase.sol 100.00% (13/13) 94.12% (16/17) 100.00% (2/2) 100.00% (3/3)
src/modules/permissions/AllowlistModule.sol 86.05% (74/86) 85.71% (96/112) 78.26% (18/23) 50.00% (9/18)
src/modules/permissions/NativeTokenLimitModule.sol 90.91% (40/44) 93.22% (55/59) 100.00% (13/13) 66.67% (8/12)
src/modules/permissions/PaymasterGuardModule.sol 83.33% (10/12) 82.35% (14/17) 66.67% (2/3) 71.43% (5/7)
src/modules/permissions/TimeRangeModule.sol 83.33% (10/12) 80.00% (16/20) 100.00% (1/1) 75.00% (6/8)
src/modules/validation/SingleSignerValidationModule.sol 92.00% (23/25) 81.58% (31/38) 62.50% (5/8) 90.00% (9/10)
src/modules/validation/WebAuthnValidationModule.sol 61.11% (11/18) 66.67% (18/27) 100.00% (3/3) 60.00% (6/10)
Total 93.82% (1153/1229) 92.87% (1446/1557) 78.39% (156/199) 83.87% (182/217)

Copy link

octane-security-app bot commented Nov 11, 2024

Overview

Vulnerabilities found: 1                                                                                

Detailed findings

src/account/ModularAccountBase.sol


🔗 Commit Hash: 024b620
🛡️ Octane Dashboard: All vulnerabilities

@jaypaik jaypaik changed the title feat: add 7702 compitable semi modular account feat: add 7702 compatable semi modular account Nov 12, 2024
@jaypaik jaypaik changed the title feat: add 7702 compatable semi modular account feat: add 7702 compatible semi modular account Nov 12, 2024
/// @notice An implementation of a semi-modular account which reads the signer as the address(this).
/// @dev Inherits SemiModularAccountBase. This account can be used as the delegate contract of an EOA with
/// EIP-7702, where address(this) (aka the EOA address) is the default fallback signer.
contract SemiModularAccount7702 is SemiModularAccountBase {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Discussed offline, but documenting here for alignment]

Only callout here is that ModularAccountBase has the upgradeToAndCall function which doesn't make sense for the 7702 flow. If we want to tidy things up a bit and reduce an external function, we can probably pull this function out into another base class and exclude it here. Is this worth it? cc @alchemyplatform/contractoors .

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, since we're not using any proxy layer, this makes sense. I wonder if it's worth the added "extra hops"

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would just be a tiny bit code saved on 7702 SMAs. Require duplicated impl on both MA and other SMAs.
We could disable the upgrade for SMA7702 though. Updated.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

@fangting-alchemy fangting-alchemy merged commit 9642850 into develop Nov 15, 2024
6 checks passed
@fangting-alchemy fangting-alchemy deleted the 7702 branch November 15, 2024 19:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants