diff --git a/src/account/SemiModularAccount.sol b/src/account/SemiModularAccount.sol index a72a3603..de8dd87f 100644 --- a/src/account/SemiModularAccount.sol +++ b/src/account/SemiModularAccount.sol @@ -92,7 +92,7 @@ contract SemiModularAccount is ReferenceModularAccount { } /// @inheritdoc IModularAccount - function accountId() external pure override returns (string memory) { + function accountId() external pure virtual override returns (string memory) { return "erc6900.reference-semi-modular-account.0.8.0"; } @@ -177,6 +177,7 @@ contract SemiModularAccount is ReferenceModularAccount { function _retrieveFallbackSignerUnchecked(SemiModularAccountStorage storage _storage) internal view + virtual returns (address) { address storageFallbackSigner = _storage.fallbackSigner; diff --git a/src/account/SemiModularAccount7702.sol b/src/account/SemiModularAccount7702.sol new file mode 100644 index 00000000..6ad09d7a --- /dev/null +++ b/src/account/SemiModularAccount7702.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.20; + +import {IModularAccount} from "../interfaces/IModularAccount.sol"; +import {SemiModularAccount} from "./SemiModularAccount.sol"; +import {IEntryPoint} from "@eth-infinitism/account-abstraction/interfaces/IEntryPoint.sol"; + +contract SemiModularAccount7702 is SemiModularAccount { + constructor(IEntryPoint anEntryPoint) SemiModularAccount(anEntryPoint) {} + + /// @inheritdoc IModularAccount + function accountId() external pure virtual override returns (string memory) { + return "erc6900.reference-semi-modular-account-7702.0.8.0"; + } + + /// @dev If the fallback signer is set in storage, ignore the 7702 signer. + function _retrieveFallbackSignerUnchecked(SemiModularAccountStorage storage _storage) + internal + view + override + returns (address) + { + address storageFallbackSigner = _storage.fallbackSigner; + if (storageFallbackSigner != address(0)) { + return storageFallbackSigner; + } + + // To support 7702, we default to address(this) as the fallback signer. + return address(this); + } +}