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

fix: ModularAccountBase cleanup, coverage, custom error types #257

Merged
merged 1 commit into from
Oct 16, 2024

Conversation

adamegyed
Copy link
Contributor

Motivation

Cleanup pass on ModularAccountBase.sol.

During this pass, discovered that we lack custom errors for UO and Sig validation module functions.

Solution

  • Add a script to get sizes
  • Expand test coverage for MABase
  • Remove duplicate error definitions
  • Simplify error definitions in MABase
  • Add custom errors for all module functions in ExecutionLib.

@adamegyed adamegyed requested a review from a team October 16, 2024 18:05
Copy link

octane-security-app bot commented Oct 16, 2024

Summary by Octane

New Contracts

  • MockInterface.sol: The smart contract defines an interface called MockInterface with a single function doSomething() that can be called externally.
  • MockRevertingConstructor.sol: A smart contract with a constructor that always reverts, preventing deployment.

Updated Contracts

  • ModularAccountBase.sol: Key changes involve simplifying error handling by removing specific parameters and streamlining the validation process using ModuleEntity for improved modularity.
  • ExecutionLib.sol: Added dedicated error handlers for various validation functions and hooks, improving error specificity using _revertModuleFunction() to handle reverts.

🔗 Commit Hash: 2530de6

Copy link

github-actions bot commented Oct 16, 2024

Contract sizes:

 | Contract                      | Size (B) | Margin (B) |
 |-------------------------------|----------|------------|
 | AccountFactory                |    4,814 |     19,762 |
 | AllowlistModule               |    9,230 |     15,346 |
-| ModularAccount                |   25,167 |       -591 |
+| ModularAccount                |   25,293 |       -717 |
 | NativeTokenLimitModule        |    4,714 |     19,862 |
 | PaymasterGuardModule          |    1,797 |     22,779 |
-| SemiModularAccountBytecode    |   27,775 |     -3,199 |
-| SemiModularAccountStorageOnly |   28,293 |     -3,717 |
+| SemiModularAccountBytecode    |   27,912 |     -3,336 |
+| SemiModularAccountStorageOnly |   28,430 |     -3,854 |
 | SingleSignerValidationModule  |    4,300 |     20,276 |
 | TimeRangeModule               |    2,000 |     22,576 |
 | WebAuthnValidationModule      |    7,854 |     16,722 |

Code coverage:

File % Lines % Statements % Branches % Funcs
src/account/AccountStorageInitializable.sol 100.00% (19/19) 100.00% (26/26) 100.00% (5/5) 100.00% (2/2)
src/account/BaseAccount.sol 100.00% (8/8) 100.00% (7/7) 100.00% (2/2) 100.00% (4/4)
src/account/ModularAccount.sol 100.00% (1/1) 100.00% (1/1) 100.00% (0/0) 100.00% (2/2)
src/account/ModularAccountBase.sol 99.00% (298/301) 96.31% (365/379) 77.97% (46/59) 100.00% (38/38)
src/account/ModularAccountView.sol 100.00% (22/22) 100.00% (25/25) 100.00% (2/2) 100.00% (2/2)
src/account/ModuleManagerInternals.sol 89.15% (115/129) 88.24% (150/170) 52.94% (9/17) 100.00% (12/12)
src/account/SemiModularAccountBase.sol 86.89% (53/61) 90.70% (78/86) 66.67% (10/15) 94.12% (16/17)
src/account/SemiModularAccountBytecode.sol 100.00% (5/5) 100.00% (6/6) 100.00% (1/1) 50.00% (1/2)
src/account/SemiModularAccountStorageOnly.sol 100.00% (4/4) 100.00% (5/5) 100.00% (0/0) 100.00% (2/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 70.59% (24/34) 76.09% (35/46) 40.00% (2/5) 58.33% (7/12)
src/libraries/ERC7739ReplaySafeWrapperLib.sol 85.88% (73/85) 85.87% (79/92) 66.67% (2/3) 87.50% (7/8)
src/libraries/ExecutionLib.sol 98.89% (267/270) 98.11% (259/264) 84.38% (27/32) 100.00% (23/23)
src/libraries/KnownSelectorsLib.sol 100.00% (29/29) 100.00% (64/64) 100.00% (0/0) 100.00% (3/3)
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/SemiModularKnownSelectorsLib.sol 100.00% (5/5) 100.00% (10/10) 100.00% (0/0) 100.00% (1/1)
src/modules/BaseModule.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 87.80% (36/41) 89.66% (52/58) 88.89% (8/9) 54.55% (6/11)
src/modules/permissions/PaymasterGuardModule.sol 90.00% (9/10) 86.67% (13/15) 100.00% (2/2) 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.08% (30/37) 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.46% (1201/1285) 92.53% (1499/1620) 76.41% (149/195) 84.86% (185/218)

Comment on lines +92 to +101
error SignatureValidationInvalid(ModuleEntity validationFunction);
error UserOpValidationInvalid(ModuleEntity validationFunction);
error UnexpectedAggregator(ModuleEntity validationFunction, address aggregator);
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why are theseModuleEntity while the execution lib errors below are unpacked?

Also nit: Mind sorting this entire block of errors? (see CreateFailed at the bottom)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Last I tested, this was both cheaper and smaller in codesize, but let me re-test to be sure.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ok it is actually ever so slightly less codesize - updated!

This comment was marked as resolved.

uint32 errorSelector;

assembly ("memory-safe") {
selectorUsed := and(mload(add(buffer, 0x4)), 0xffffffff)
Copy link
Contributor

Choose a reason for hiding this comment

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

clever way to load the first 4 bytes of 0x20!

// - entity Id
// - revert data

assembly ("memory-safe") {
Copy link
Contributor

Choose a reason for hiding this comment

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

Is it possible to do

revert(abi.encodeWithselector(this.error.selector, ...)

If so, are we sure it'd be cheaper to do this?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If we do that, then we'd have to call the high-level function collectRevertData first, and the abi.encode... expression would copy that memory over to the new memory with the data for the revert. I believe this saves on both gas and codesize due to that added copy.

Copy link
Contributor

Choose a reason for hiding this comment

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

gotcha, lgtm!

Copy link
Contributor

@Zer0dot Zer0dot left a comment

Choose a reason for hiding this comment

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

small comment, lgtm

@adamegyed adamegyed force-pushed the adam/mabase-cleanup branch from e6933ab to 1987ab5 Compare October 16, 2024 20:58
test: expand test coverage for MABase

refactor: remove duplicate error definitions

refactor: simplify error types in MABase

feat: custom errors for all module functions

feat: change error param to moduleentity

fix: reorder errors

style: fix import formatting
@adamegyed adamegyed force-pushed the adam/mabase-cleanup branch from 1987ab5 to 2530de6 Compare October 16, 2024 21:39
@adamegyed adamegyed merged commit eea68dc into develop Oct 16, 2024
6 checks passed
@adamegyed adamegyed deleted the adam/mabase-cleanup branch October 16, 2024 21:44
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