Skip to content

Use dynamic contracts 1.2.4 #518

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

Merged
merged 4 commits into from
Oct 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions contracts/extension/upgradeable/AccountPermissions.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
);

modifier onlyAdmin() virtual {
require(isAdmin(msg.sender), "AccountPermissions: caller is not an admin");
require(isAdmin(msg.sender), "caller is not an admin");
_;
}

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

require(
_req.reqValidityStartTimestamp <= block.timestamp && block.timestamp < _req.reqValidityEndTimestamp,
"AccountPermissions: invalid request validity period"
"invalid request validity period"
);

(bool success, address signer) = verifySignerPermissionRequest(_req, _signature);
require(success, "AccountPermissions: invalid signature");
require(success, "invalid signature");

_accountPermissionsStorage().allSigners.add(targetSigner);
_accountPermissionsStorage().executed[_req.uid] = true;
Expand Down
2 changes: 1 addition & 1 deletion contracts/prebuilts/account/dynamic/DynamicAccount.sol
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ contract DynamicAccount is AccountCore, BaseRouter {
//////////////////////////////////////////////////////////////*/

/// @dev Returns whether all relevant permission and other checks are met before any upgrade.
function isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
function _isAuthorizedCallToUpgrade() internal view virtual override returns (bool) {
return isAdmin(msg.sender);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ contract ManagedAccountFactory is BaseAccountFactory, ContractMetadata, Permissi
}

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

Expand Down
12 changes: 0 additions & 12 deletions contracts/prebuilts/account/utils/AccountCore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
_setAdmin(_defaultAdmin, true);
}

/*///////////////////////////////////////////////////////////////
Events
//////////////////////////////////////////////////////////////*/

event EntrypointOverride(IEntryPoint entrypointOverride);

/*///////////////////////////////////////////////////////////////
View functions
//////////////////////////////////////////////////////////////*/
Expand All @@ -81,11 +75,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
return entrypointContract;
}

/// @notice Returns the balance of the account in Entrypoint.
function getDeposit() public view returns (uint256) {
return entryPoint().balanceOf(address(this));
}

/// @notice Returns whether a signer is authorized to perform transactions using the wallet.
function isValidSigner(address _signer, UserOperation calldata _userOp) public view virtual returns (bool) {
// First, check if the signer is an admin.
Expand Down Expand Up @@ -159,7 +148,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc
/// @notice Overrides the Entrypoint contract being used.
function setEntrypointOverride(IEntryPoint _entrypointOverride) public virtual onlyAdmin {
AccountCoreStorage.data().entrypointOverride = address(_entrypointOverride);
emit EntrypointOverride(_entrypointOverride);
}

/*///////////////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ contract BurnToClaimDropERC721 is
//////////////////////////////////////////////////////////////*/

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ contract EvolvingNFT is
}

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

Expand Down
6 changes: 3 additions & 3 deletions src/test/smart-wallet/Account.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -529,15 +529,15 @@ contract SimpleAccountTest is BaseTest {

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

assertEq(SimpleAccount(payable(account)).getDeposit(), 0);
assertEq(EntryPoint(entrypoint).balanceOf(account), 0);

vm.prank(accountAdmin);
SimpleAccount(payable(account)).addDeposit{ value: 1000 }();
assertEq(SimpleAccount(payable(account)).getDeposit(), 1000);
assertEq(EntryPoint(entrypoint).balanceOf(account), 1000);

vm.prank(accountAdmin);
SimpleAccount(payable(account)).withdrawDepositTo(payable(accountSigner), 500);
assertEq(SimpleAccount(payable(account)).getDeposit(), 500);
assertEq(EntryPoint(entrypoint).balanceOf(account), 500);
}

/*///////////////////////////////////////////////////////////////
Expand Down
58 changes: 55 additions & 3 deletions src/test/smart-wallet/DynamicAccount.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,58 @@ contract DynamicAccountTest is BaseTest {
Test: creating an account
//////////////////////////////////////////////////////////////*/

/// @dev benchmark test for deployment gas cost
function test_deploy_dynamicAccount() public {
// Setting up default extension.
IExtension.Extension memory defaultExtension;

defaultExtension.metadata = IExtension.ExtensionMetadata({
name: "AccountExtension",
metadataURI: "ipfs://AccountExtension",
implementation: address(new AccountExtension())
});

defaultExtension.functions = new IExtension.ExtensionFunction[](7);

defaultExtension.functions[0] = IExtension.ExtensionFunction(
AccountExtension.supportsInterface.selector,
"supportsInterface(bytes4)"
);
defaultExtension.functions[1] = IExtension.ExtensionFunction(
AccountExtension.execute.selector,
"execute(address,uint256,bytes)"
);
defaultExtension.functions[2] = IExtension.ExtensionFunction(
AccountExtension.executeBatch.selector,
"executeBatch(address[],uint256[],bytes[])"
);
defaultExtension.functions[3] = IExtension.ExtensionFunction(
ERC721Holder.onERC721Received.selector,
"onERC721Received(address,address,uint256,bytes)"
);
defaultExtension.functions[4] = IExtension.ExtensionFunction(
ERC1155Holder.onERC1155Received.selector,
"onERC1155Received(address,address,uint256,uint256,bytes)"
);
defaultExtension.functions[5] = IExtension.ExtensionFunction(
bytes4(0), // Selector for `receive()` function.
"receive()"
);
defaultExtension.functions[6] = IExtension.ExtensionFunction(
AccountExtension.isValidSignature.selector,
"isValidSignature(bytes32,bytes)"
);

IExtension.Extension[] memory extensions = new IExtension.Extension[](1);
extensions[0] = defaultExtension;

// deploy account factory
DynamicAccountFactory factory = new DynamicAccountFactory(
IEntryPoint(payable(address(entrypoint))),
extensions
);
}

/// @dev Create an account by directly calling the factory.
function test_state_createAccount_viaFactory() public {
vm.expectEmit(true, true, false, true);
Expand Down Expand Up @@ -590,15 +642,15 @@ contract DynamicAccountTest is BaseTest {

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

assertEq(SimpleAccount(payable(account)).getDeposit(), 0);
assertEq(EntryPoint(entrypoint).balanceOf(account), 0);

vm.prank(accountAdmin);
SimpleAccount(payable(account)).addDeposit{ value: 1000 }();
assertEq(SimpleAccount(payable(account)).getDeposit(), 1000);
assertEq(EntryPoint(entrypoint).balanceOf(account), 1000);

vm.prank(accountAdmin);
SimpleAccount(payable(account)).withdrawDepositTo(payable(accountSigner), 500);
assertEq(SimpleAccount(payable(account)).getDeposit(), 500);
assertEq(EntryPoint(entrypoint).balanceOf(account), 500);
}

/*///////////////////////////////////////////////////////////////
Expand Down
59 changes: 56 additions & 3 deletions src/test/smart-wallet/ManagedAccount.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,59 @@ contract ManagedAccountTest is BaseTest {
numberContract = new Number();
}

/// @dev benchmark test for deployment gas cost
function test_deploy_managedAccount() public {
// Setting up default extension.
IExtension.Extension memory defaultExtension;

defaultExtension.metadata = IExtension.ExtensionMetadata({
name: "AccountExtension",
metadataURI: "ipfs://AccountExtension",
implementation: address(new AccountExtension())
});

defaultExtension.functions = new IExtension.ExtensionFunction[](7);

defaultExtension.functions[0] = IExtension.ExtensionFunction(
AccountExtension.supportsInterface.selector,
"supportsInterface(bytes4)"
);
defaultExtension.functions[1] = IExtension.ExtensionFunction(
AccountExtension.execute.selector,
"execute(address,uint256,bytes)"
);
defaultExtension.functions[2] = IExtension.ExtensionFunction(
AccountExtension.executeBatch.selector,
"executeBatch(address[],uint256[],bytes[])"
);
defaultExtension.functions[3] = IExtension.ExtensionFunction(
ERC721Holder.onERC721Received.selector,
"onERC721Received(address,address,uint256,bytes)"
);
defaultExtension.functions[4] = IExtension.ExtensionFunction(
ERC1155Holder.onERC1155Received.selector,
"onERC1155Received(address,address,uint256,uint256,bytes)"
);
defaultExtension.functions[5] = IExtension.ExtensionFunction(
bytes4(0), // Selector for `receive()` function.
"receive()"
);
defaultExtension.functions[6] = IExtension.ExtensionFunction(
AccountExtension.isValidSignature.selector,
"isValidSignature(bytes32,bytes)"
);

IExtension.Extension[] memory extensions = new IExtension.Extension[](1);
extensions[0] = defaultExtension;

// deploy account factory
vm.prank(factoryDeployer);
ManagedAccountFactory factory = new ManagedAccountFactory(
IEntryPoint(payable(address(entrypoint))),
extensions
);
}

/*///////////////////////////////////////////////////////////////
Test: creating an account
//////////////////////////////////////////////////////////////*/
Expand Down Expand Up @@ -593,15 +646,15 @@ contract ManagedAccountTest is BaseTest {

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

assertEq(SimpleAccount(payable(account)).getDeposit(), 0);
assertEq(EntryPoint(entrypoint).balanceOf(account), 0);

vm.prank(accountAdmin);
SimpleAccount(payable(account)).addDeposit{ value: 1000 }();
assertEq(SimpleAccount(payable(account)).getDeposit(), 1000);
assertEq(EntryPoint(entrypoint).balanceOf(account), 1000);

vm.prank(accountAdmin);
SimpleAccount(payable(account)).withdrawDepositTo(payable(accountSigner), 500);
assertEq(SimpleAccount(payable(account)).getDeposit(), 500);
assertEq(EntryPoint(entrypoint).balanceOf(account), 500);
}

/*///////////////////////////////////////////////////////////////
Expand Down