Skip to content

Commit c1c1583

Browse files
authored
Use dynamic contracts 1.2.4 (#518)
* Use dynamic contracts 1.2.4 * Changes to get DynamicAccount within size limit * Add benchmark test for deployment gas cost
1 parent 781a781 commit c1c1583

File tree

10 files changed

+123
-30
lines changed

10 files changed

+123
-30
lines changed

contracts/extension/upgradeable/AccountPermissions.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
4545
);
4646

4747
modifier onlyAdmin() virtual {
48-
require(isAdmin(msg.sender), "AccountPermissions: caller is not an admin");
48+
require(isAdmin(msg.sender), "caller is not an admin");
4949
_;
5050
}
5151

@@ -61,15 +61,15 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
6161
/// @notice Sets the permissions for a given signer.
6262
function setPermissionsForSigner(SignerPermissionRequest calldata _req, bytes calldata _signature) external {
6363
address targetSigner = _req.signer;
64-
require(!isAdmin(targetSigner), "AccountPermissions: signer is already an admin");
64+
require(!isAdmin(targetSigner), "signer is already an admin");
6565

6666
require(
6767
_req.reqValidityStartTimestamp <= block.timestamp && block.timestamp < _req.reqValidityEndTimestamp,
68-
"AccountPermissions: invalid request validity period"
68+
"invalid request validity period"
6969
);
7070

7171
(bool success, address signer) = verifySignerPermissionRequest(_req, _signature);
72-
require(success, "AccountPermissions: invalid signature");
72+
require(success, "invalid signature");
7373

7474
_accountPermissionsStorage().allSigners.add(targetSigner);
7575
_accountPermissionsStorage().executed[_req.uid] = true;

contracts/prebuilts/account/dynamic/DynamicAccount.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ contract DynamicAccount is AccountCore, BaseRouter {
4242
//////////////////////////////////////////////////////////////*/
4343

4444
/// @dev Returns whether all relevant permission and other checks are met before any upgrade.
45-
function isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
45+
function _isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
4646
return isAdmin(msg.sender);
4747
}
4848
}

contracts/prebuilts/account/managed/ManagedAccountFactory.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ contract ManagedAccountFactory is BaseAccountFactory, ContractMetadata, Permissi
5252
}
5353

5454
/// @dev Returns whether all relevant permission and other checks are met before any upgrade.
55-
function isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
55+
function _isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
5656
return hasRole(keccak256("EXTENSION_ROLE"), msg.sender);
5757
}
5858

contracts/prebuilts/account/utils/AccountCore.sol

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
6262
_setAdmin(_defaultAdmin, true);
6363
}
6464

65-
/*///////////////////////////////////////////////////////////////
66-
Events
67-
//////////////////////////////////////////////////////////////*/
68-
69-
event EntrypointOverride(IEntryPoint entrypointOverride);
70-
7165
/*///////////////////////////////////////////////////////////////
7266
View functions
7367
//////////////////////////////////////////////////////////////*/
@@ -81,11 +75,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
8175
return entrypointContract;
8276
}
8377

84-
/// @notice Returns the balance of the account in Entrypoint.
85-
function getDeposit() public view returns (uint256) {
86-
return entryPoint().balanceOf(address(this));
87-
}
88-
8978
/// @notice Returns whether a signer is authorized to perform transactions using the wallet.
9079
function isValidSigner(address _signer, UserOperation calldata _userOp) public view virtual returns (bool) {
9180
// First, check if the signer is an admin.
@@ -159,7 +148,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
159148
/// @notice Overrides the Entrypoint contract being used.
160149
function setEntrypointOverride(IEntryPoint _entrypointOverride) public virtual onlyAdmin {
161150
AccountCoreStorage.data().entrypointOverride = address(_entrypointOverride);
162-
emit EntrypointOverride(_entrypointOverride);
163151
}
164152

165153
/*///////////////////////////////////////////////////////////////

contracts/prebuilts/unaudited/burn-to-claim-drop/BurnToClaimDropERC721.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ contract BurnToClaimDropERC721 is
114114
//////////////////////////////////////////////////////////////*/
115115

116116
/// @dev Returns whether all relevant permission and other checks are met before any upgrade.
117-
function isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
117+
function _isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
118118
return _hasRole(keccak256("EXTENSION_ROLE"), msg.sender);
119119
}
120120

contracts/prebuilts/unaudited/evolving-nfts/EvolvingNFT.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ contract EvolvingNFT is
8989
}
9090

9191
/// @dev Returns whether all relevant permission and other checks are met before any upgrade.
92-
function isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
92+
function _isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
9393
return _hasRole(EXTENSION_ROLE, msg.sender);
9494
}
9595

src/test/smart-wallet/Account.t.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,15 +529,15 @@ contract SimpleAccountTest is BaseTest {
529529

530530
address account = accountFactory.getAddress(accountAdmin, bytes(""));
531531

532-
assertEq(SimpleAccount(payable(account)).getDeposit(), 0);
532+
assertEq(EntryPoint(entrypoint).balanceOf(account), 0);
533533

534534
vm.prank(accountAdmin);
535535
SimpleAccount(payable(account)).addDeposit{ value: 1000 }();
536-
assertEq(SimpleAccount(payable(account)).getDeposit(), 1000);
536+
assertEq(EntryPoint(entrypoint).balanceOf(account), 1000);
537537

538538
vm.prank(accountAdmin);
539539
SimpleAccount(payable(account)).withdrawDepositTo(payable(accountSigner), 500);
540-
assertEq(SimpleAccount(payable(account)).getDeposit(), 500);
540+
assertEq(EntryPoint(entrypoint).balanceOf(account), 500);
541541
}
542542

543543
/*///////////////////////////////////////////////////////////////

src/test/smart-wallet/DynamicAccount.t.sol

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,58 @@ contract DynamicAccountTest is BaseTest {
245245
Test: creating an account
246246
//////////////////////////////////////////////////////////////*/
247247

248+
/// @dev benchmark test for deployment gas cost
249+
function test_deploy_dynamicAccount() public {
250+
// Setting up default extension.
251+
IExtension.Extension memory defaultExtension;
252+
253+
defaultExtension.metadata = IExtension.ExtensionMetadata({
254+
name: "AccountExtension",
255+
metadataURI: "ipfs://AccountExtension",
256+
implementation: address(new AccountExtension())
257+
});
258+
259+
defaultExtension.functions = new IExtension.ExtensionFunction[](7);
260+
261+
defaultExtension.functions[0] = IExtension.ExtensionFunction(
262+
AccountExtension.supportsInterface.selector,
263+
"supportsInterface(bytes4)"
264+
);
265+
defaultExtension.functions[1] = IExtension.ExtensionFunction(
266+
AccountExtension.execute.selector,
267+
"execute(address,uint256,bytes)"
268+
);
269+
defaultExtension.functions[2] = IExtension.ExtensionFunction(
270+
AccountExtension.executeBatch.selector,
271+
"executeBatch(address[],uint256[],bytes[])"
272+
);
273+
defaultExtension.functions[3] = IExtension.ExtensionFunction(
274+
ERC721Holder.onERC721Received.selector,
275+
"onERC721Received(address,address,uint256,bytes)"
276+
);
277+
defaultExtension.functions[4] = IExtension.ExtensionFunction(
278+
ERC1155Holder.onERC1155Received.selector,
279+
"onERC1155Received(address,address,uint256,uint256,bytes)"
280+
);
281+
defaultExtension.functions[5] = IExtension.ExtensionFunction(
282+
bytes4(0), // Selector for `receive()` function.
283+
"receive()"
284+
);
285+
defaultExtension.functions[6] = IExtension.ExtensionFunction(
286+
AccountExtension.isValidSignature.selector,
287+
"isValidSignature(bytes32,bytes)"
288+
);
289+
290+
IExtension.Extension[] memory extensions = new IExtension.Extension[](1);
291+
extensions[0] = defaultExtension;
292+
293+
// deploy account factory
294+
DynamicAccountFactory factory = new DynamicAccountFactory(
295+
IEntryPoint(payable(address(entrypoint))),
296+
extensions
297+
);
298+
}
299+
248300
/// @dev Create an account by directly calling the factory.
249301
function test_state_createAccount_viaFactory() public {
250302
vm.expectEmit(true, true, false, true);
@@ -590,15 +642,15 @@ contract DynamicAccountTest is BaseTest {
590642

591643
address account = accountFactory.getAddress(accountAdmin, bytes(""));
592644

593-
assertEq(SimpleAccount(payable(account)).getDeposit(), 0);
645+
assertEq(EntryPoint(entrypoint).balanceOf(account), 0);
594646

595647
vm.prank(accountAdmin);
596648
SimpleAccount(payable(account)).addDeposit{ value: 1000 }();
597-
assertEq(SimpleAccount(payable(account)).getDeposit(), 1000);
649+
assertEq(EntryPoint(entrypoint).balanceOf(account), 1000);
598650

599651
vm.prank(accountAdmin);
600652
SimpleAccount(payable(account)).withdrawDepositTo(payable(accountSigner), 500);
601-
assertEq(SimpleAccount(payable(account)).getDeposit(), 500);
653+
assertEq(EntryPoint(entrypoint).balanceOf(account), 500);
602654
}
603655

604656
/*///////////////////////////////////////////////////////////////

src/test/smart-wallet/ManagedAccount.t.sol

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,59 @@ contract ManagedAccountTest is BaseTest {
243243
numberContract = new Number();
244244
}
245245

246+
/// @dev benchmark test for deployment gas cost
247+
function test_deploy_managedAccount() public {
248+
// Setting up default extension.
249+
IExtension.Extension memory defaultExtension;
250+
251+
defaultExtension.metadata = IExtension.ExtensionMetadata({
252+
name: "AccountExtension",
253+
metadataURI: "ipfs://AccountExtension",
254+
implementation: address(new AccountExtension())
255+
});
256+
257+
defaultExtension.functions = new IExtension.ExtensionFunction[](7);
258+
259+
defaultExtension.functions[0] = IExtension.ExtensionFunction(
260+
AccountExtension.supportsInterface.selector,
261+
"supportsInterface(bytes4)"
262+
);
263+
defaultExtension.functions[1] = IExtension.ExtensionFunction(
264+
AccountExtension.execute.selector,
265+
"execute(address,uint256,bytes)"
266+
);
267+
defaultExtension.functions[2] = IExtension.ExtensionFunction(
268+
AccountExtension.executeBatch.selector,
269+
"executeBatch(address[],uint256[],bytes[])"
270+
);
271+
defaultExtension.functions[3] = IExtension.ExtensionFunction(
272+
ERC721Holder.onERC721Received.selector,
273+
"onERC721Received(address,address,uint256,bytes)"
274+
);
275+
defaultExtension.functions[4] = IExtension.ExtensionFunction(
276+
ERC1155Holder.onERC1155Received.selector,
277+
"onERC1155Received(address,address,uint256,uint256,bytes)"
278+
);
279+
defaultExtension.functions[5] = IExtension.ExtensionFunction(
280+
bytes4(0), // Selector for `receive()` function.
281+
"receive()"
282+
);
283+
defaultExtension.functions[6] = IExtension.ExtensionFunction(
284+
AccountExtension.isValidSignature.selector,
285+
"isValidSignature(bytes32,bytes)"
286+
);
287+
288+
IExtension.Extension[] memory extensions = new IExtension.Extension[](1);
289+
extensions[0] = defaultExtension;
290+
291+
// deploy account factory
292+
vm.prank(factoryDeployer);
293+
ManagedAccountFactory factory = new ManagedAccountFactory(
294+
IEntryPoint(payable(address(entrypoint))),
295+
extensions
296+
);
297+
}
298+
246299
/*///////////////////////////////////////////////////////////////
247300
Test: creating an account
248301
//////////////////////////////////////////////////////////////*/
@@ -593,15 +646,15 @@ contract ManagedAccountTest is BaseTest {
593646

594647
address account = accountFactory.getAddress(accountAdmin, bytes(""));
595648

596-
assertEq(SimpleAccount(payable(account)).getDeposit(), 0);
649+
assertEq(EntryPoint(entrypoint).balanceOf(account), 0);
597650

598651
vm.prank(accountAdmin);
599652
SimpleAccount(payable(account)).addDeposit{ value: 1000 }();
600-
assertEq(SimpleAccount(payable(account)).getDeposit(), 1000);
653+
assertEq(EntryPoint(entrypoint).balanceOf(account), 1000);
601654

602655
vm.prank(accountAdmin);
603656
SimpleAccount(payable(account)).withdrawDepositTo(payable(accountSigner), 500);
604-
assertEq(SimpleAccount(payable(account)).getDeposit(), 500);
657+
assertEq(EntryPoint(entrypoint).balanceOf(account), 500);
605658
}
606659

607660
/*///////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)