Skip to content

Commit 791e8df

Browse files
authored
Revert account factory proxy deploy back to direct deploy (#578)
* Revert proxy deployable factory -> direct deploy factory * Re-add EIP-1271 udpated sig to Account
1 parent 85874e3 commit 791e8df

19 files changed

+81
-268
lines changed

contracts/prebuilts/account/dynamic/DynamicAccount.sol

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,16 @@ contract DynamicAccount is AccountCore, BaseRouter {
2424
//////////////////////////////////////////////////////////////*/
2525

2626
constructor(IEntryPoint _entrypoint, Extension[] memory _defaultExtensions)
27-
AccountCore(_entrypoint)
27+
AccountCore(_entrypoint, msg.sender)
2828
BaseRouter(_defaultExtensions)
2929
{
3030
_disableInitializers();
3131
}
3232

3333
/// @notice Initializes the smart contract wallet.
34-
function initialize(
35-
address _defaultAdmin,
36-
address _factory,
37-
bytes calldata _data
38-
) public override initializer {
34+
function initialize(address _defaultAdmin, bytes calldata _data) public override initializer {
3935
__BaseRouter_init();
40-
41-
// This is passed as data in the `_registerOnFactory()` call in `AccountExtension` / `Account`.
4236
AccountCoreStorage.data().creationSalt = _generateSalt(_defaultAdmin, _data);
43-
AccountCoreStorage.data().factory = _factory;
4437
_setAdmin(_defaultAdmin, true);
4538
}
4639

contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ pragma solidity ^0.8.12;
44
// Utils
55
import "../utils/BaseAccountFactory.sol";
66
import "@thirdweb-dev/dynamic-contracts/src/interface/IExtension.sol";
7-
import "../../../extension/upgradeable/Initializable.sol";
87

98
// Extensions
10-
import "../../../extension/upgradeable/PermissionsEnumerable.sol";
11-
import "../../../extension/upgradeable/ContractMetadata.sol";
9+
import "../../../extension/upgradeable//PermissionsEnumerable.sol";
10+
import "../../../extension/upgradeable//ContractMetadata.sol";
1211

1312
// Smart wallet implementation
1413
import { DynamicAccount, IEntryPoint } from "./DynamicAccount.sol";
@@ -22,26 +21,20 @@ import { DynamicAccount, IEntryPoint } from "./DynamicAccount.sol";
2221
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
2322
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
2423

25-
contract DynamicAccountFactory is Initializable, BaseAccountFactory, ContractMetadata, PermissionsEnumerable {
24+
contract DynamicAccountFactory is BaseAccountFactory, ContractMetadata, PermissionsEnumerable {
2625
address public constant ENTRYPOINT_ADDRESS = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789;
2726

2827
/*///////////////////////////////////////////////////////////////
2928
Constructor
3029
//////////////////////////////////////////////////////////////*/
3130

32-
constructor(IExtension.Extension[] memory _defaultExtensions)
31+
constructor(address _defaultAdmin, IExtension.Extension[] memory _defaultExtensions)
3332
BaseAccountFactory(
34-
address(new DynamicAccount(IEntryPoint(ENTRYPOINT_ADDRESS), _defaultExtensions)),
33+
payable(address(new DynamicAccount(IEntryPoint(ENTRYPOINT_ADDRESS), _defaultExtensions))),
3534
ENTRYPOINT_ADDRESS
3635
)
3736
{
38-
_disableInitializers();
39-
}
40-
41-
/// @notice Initializes the factory contract.
42-
function initialize(address _defaultAdmin, string memory _contractURI) external initializer {
4337
_setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
44-
_setupContractURI(_contractURI);
4538
}
4639

4740
/*///////////////////////////////////////////////////////////////
@@ -54,7 +47,7 @@ contract DynamicAccountFactory is Initializable, BaseAccountFactory, ContractMet
5447
address _admin,
5548
bytes calldata _data
5649
) internal override {
57-
DynamicAccount(payable(_account)).initialize(_admin, address(this), _data);
50+
DynamicAccount(payable(_account)).initialize(_admin, _data);
5851
}
5952

6053
/// @dev Returns whether contract metadata can be set in the given execution context.

contracts/prebuilts/account/managed/ManagedAccount.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ import "@thirdweb-dev/dynamic-contracts/src/core/Router.sol";
1919
import "@thirdweb-dev/dynamic-contracts/src/interface/IRouterState.sol";
2020

2121
contract ManagedAccount is AccountCore, Router, IRouterState {
22-
constructor(IEntryPoint _entrypoint) AccountCore(_entrypoint) {}
22+
constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) {}
2323

2424
/// @notice Returns the implementation contract address for a given function signature.
2525
function getImplementationForFunction(bytes4 _functionSelector) public view virtual override returns (address) {
26-
return Router(payable(AccountCoreStorage.data().factory)).getImplementationForFunction(_functionSelector);
26+
return Router(payable(factory)).getImplementationForFunction(_functionSelector);
2727
}
2828

2929
/// @notice Returns all extensions of the Router.
3030
function getAllExtensions() external view returns (Extension[] memory) {
31-
return IRouterState(payable(AccountCoreStorage.data().factory)).getAllExtensions();
31+
return IRouterState(payable(factory)).getAllExtensions();
3232
}
3333
}

contracts/prebuilts/account/managed/ManagedAccountFactory.sol

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ pragma solidity ^0.8.12;
44
// Utils
55
import "@thirdweb-dev/dynamic-contracts/src/presets/BaseRouter.sol";
66
import "../utils/BaseAccountFactory.sol";
7-
import "../../../extension/upgradeable/Initializable.sol";
87

98
// Extensions
109
import "../../../extension/upgradeable//PermissionsEnumerable.sol";
@@ -22,35 +21,25 @@ import { ManagedAccount, IEntryPoint } from "./ManagedAccount.sol";
2221
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
2322
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
2423

25-
contract ManagedAccountFactory is
26-
Initializable,
27-
BaseAccountFactory,
28-
ContractMetadata,
29-
PermissionsEnumerable,
30-
BaseRouter
31-
{
24+
contract ManagedAccountFactory is BaseAccountFactory, ContractMetadata, PermissionsEnumerable, BaseRouter {
3225
/*///////////////////////////////////////////////////////////////
3326
Constructor
3427
//////////////////////////////////////////////////////////////*/
3528

36-
constructor(IEntryPoint _entrypoint, Extension[] memory _defaultExtensions)
29+
constructor(
30+
address _defaultAdmin,
31+
IEntryPoint _entrypoint,
32+
Extension[] memory _defaultExtensions
33+
)
3734
BaseRouter(_defaultExtensions)
38-
BaseAccountFactory(address(new ManagedAccount(_entrypoint)), address(_entrypoint))
35+
BaseAccountFactory(payable(address(new ManagedAccount(_entrypoint, address(this)))), address(_entrypoint))
3936
{
40-
_disableInitializers();
41-
}
42-
43-
/// @notice Initializes the factory contract.
44-
function initialize(address _defaultAdmin, string memory _contractURI) external initializer {
4537
__BaseRouter_init();
46-
4738
_setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
4839

4940
bytes32 _extensionRole = keccak256("EXTENSION_ROLE");
5041
_setupRole(_extensionRole, _defaultAdmin);
5142
_setRoleAdmin(_extensionRole, _extensionRole);
52-
53-
_setupContractURI(_contractURI);
5443
}
5544

5645
/*///////////////////////////////////////////////////////////////
@@ -63,7 +52,7 @@ contract ManagedAccountFactory is
6352
address _admin,
6453
bytes calldata _data
6554
) internal override {
66-
ManagedAccount(payable(_account)).initialize(_admin, address(this), _data);
55+
ManagedAccount(payable(_account)).initialize(_admin, _data);
6756
}
6857

6958
/// @dev Returns whether all relevant permission and other checks are met before any upgrade.

contracts/prebuilts/account/non-upgradeable/Account.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115
3939
Constructor, Initializer, Modifiers
4040
//////////////////////////////////////////////////////////////*/
4141

42-
constructor(IEntryPoint _entrypoint) AccountCore(_entrypoint) {}
42+
constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) {}
4343

4444
/// @notice Checks whether the caller is the EntryPoint contract or the admin.
4545
modifier onlyAdminOrEntrypoint() virtual {
@@ -145,7 +145,7 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115
145145

146146
/// @dev Registers the account on the factory if it hasn't been registered yet.
147147
function _registerOnFactory() internal virtual {
148-
BaseAccountFactory factoryContract = BaseAccountFactory(AccountCoreStorage.data().factory);
148+
BaseAccountFactory factoryContract = BaseAccountFactory(factory);
149149
if (!factoryContract.isRegistered(address(this))) {
150150
factoryContract.onRegister(AccountCoreStorage.data().creationSalt);
151151
}

contracts/prebuilts/account/non-upgradeable/AccountFactory.sol

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ pragma solidity ^0.8.12;
55
import "../utils/BaseAccountFactory.sol";
66
import "../utils/BaseAccount.sol";
77
import "../../../external-deps/openzeppelin/proxy/Clones.sol";
8-
import "../../../extension/upgradeable/Initializable.sol";
98

109
// Extensions
1110
import "../../../extension/upgradeable//PermissionsEnumerable.sol";
@@ -26,19 +25,15 @@ import { Account } from "./Account.sol";
2625
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
2726
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
2827

29-
contract AccountFactory is Initializable, BaseAccountFactory, ContractMetadata, PermissionsEnumerable {
28+
contract AccountFactory is BaseAccountFactory, ContractMetadata, PermissionsEnumerable {
3029
/*///////////////////////////////////////////////////////////////
3130
Constructor
3231
//////////////////////////////////////////////////////////////*/
3332

34-
constructor(IEntryPoint _entrypoint) BaseAccountFactory(address(new Account(_entrypoint)), address(_entrypoint)) {
35-
_disableInitializers();
36-
}
37-
38-
/// @notice Initializes the factory contract.
39-
function initialize(address _defaultAdmin, string memory _contractURI) external initializer {
33+
constructor(address _defaultAdmin, IEntryPoint _entrypoint)
34+
BaseAccountFactory(address(new Account(_entrypoint, address(this))), address(_entrypoint))
35+
{
4036
_setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
41-
_setupContractURI(_contractURI);
4237
}
4338

4439
/*///////////////////////////////////////////////////////////////
@@ -51,7 +46,7 @@ contract AccountFactory is Initializable, BaseAccountFactory, ContractMetadata,
5146
address _admin,
5247
bytes calldata _data
5348
) internal override {
54-
Account(payable(_account)).initialize(_admin, address(this), _data);
49+
Account(payable(_account)).initialize(_admin, _data);
5550
}
5651

5752
/// @dev Returns whether contract metadata can be set in the given execution context.

contracts/prebuilts/account/utils/AccountCore.sol

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,39 +39,33 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
3939
State
4040
//////////////////////////////////////////////////////////////*/
4141

42+
/// @notice EIP 4337 factory for this contract.
43+
address public immutable factory;
44+
4245
/// @notice EIP 4337 Entrypoint contract.
4346
IEntryPoint private immutable entrypointContract;
4447

4548
/*///////////////////////////////////////////////////////////////
4649
Constructor, Initializer, Modifiers
4750
//////////////////////////////////////////////////////////////*/
4851

49-
constructor(IEntryPoint _entrypoint) EIP712("Account", "1") {
52+
constructor(IEntryPoint _entrypoint, address _factory) EIP712("Account", "1") {
5053
_disableInitializers();
54+
factory = _factory;
5155
entrypointContract = _entrypoint;
5256
}
5357

5458
/// @notice Initializes the smart contract wallet.
55-
function initialize(
56-
address _defaultAdmin,
57-
address _factory,
58-
bytes calldata _data
59-
) public virtual initializer {
59+
function initialize(address _defaultAdmin, bytes calldata _data) public virtual initializer {
6060
// This is passed as data in the `_registerOnFactory()` call in `AccountExtension` / `Account`.
6161
AccountCoreStorage.data().creationSalt = _generateSalt(_defaultAdmin, _data);
62-
AccountCoreStorage.data().factory = _factory;
6362
_setAdmin(_defaultAdmin, true);
6463
}
6564

6665
/*///////////////////////////////////////////////////////////////
6766
View functions
6867
//////////////////////////////////////////////////////////////*/
6968

70-
/// @notice Returns the address of the account factory.
71-
function factory() public view virtual override returns (address) {
72-
return AccountCoreStorage.data().factory;
73-
}
74-
7569
/// @notice Returns the EIP 4337 entrypoint contract.
7670
function entryPoint() public view virtual override returns (IEntryPoint) {
7771
address entrypointOverride = AccountCoreStorage.data().entrypointOverride;
@@ -241,22 +235,19 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
241235
/// @notice Makes the given account an admin.
242236
function _setAdmin(address _account, bool _isAdmin) internal virtual override {
243237
super._setAdmin(_account, _isAdmin);
244-
245-
address factoryAddr = factory();
246-
if (factoryAddr.code.length > 0) {
238+
if (factory.code.length > 0) {
247239
if (_isAdmin) {
248-
BaseAccountFactory(factoryAddr).onSignerAdded(_account, AccountCoreStorage.data().creationSalt);
240+
BaseAccountFactory(factory).onSignerAdded(_account, AccountCoreStorage.data().creationSalt);
249241
} else {
250-
BaseAccountFactory(factoryAddr).onSignerRemoved(_account, AccountCoreStorage.data().creationSalt);
242+
BaseAccountFactory(factory).onSignerRemoved(_account, AccountCoreStorage.data().creationSalt);
251243
}
252244
}
253245
}
254246

255247
/// @notice Runs after every `changeRole` run.
256248
function _afterSignerPermissionsUpdate(SignerPermissionRequest calldata _req) internal virtual override {
257-
address factoryAddr = factory();
258-
if (factoryAddr.code.length > 0) {
259-
BaseAccountFactory(factoryAddr).onSignerAdded(_req.signer, AccountCoreStorage.data().creationSalt);
249+
if (factory.code.length > 0) {
250+
BaseAccountFactory(factory).onSignerAdded(_req.signer, AccountCoreStorage.data().creationSalt);
260251
}
261252
}
262253
}

contracts/prebuilts/account/utils/AccountCoreStorage.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ library AccountCoreStorage {
99

1010
struct Data {
1111
address entrypointOverride;
12-
address factory;
1312
bytes32 creationSalt;
1413
}
1514

0 commit comments

Comments
 (0)