Skip to content

Commit 8969277

Browse files
committed
fix:run forge fmt
1 parent e9cae25 commit 8969277

File tree

7 files changed

+161
-110
lines changed

7 files changed

+161
-110
lines changed

script/DeployMinimal.s.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@ contract DeployMinimal is Script {
2020
vm.stopBroadcast();
2121
return (helperConfig, minimalAccount);
2222
}
23-
}
23+
}

script/HelperConfig.s.sol

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.24;
33

4-
import {Script,console2} from "forge-std/Script.sol";
4+
import {Script, console2} from "forge-std/Script.sol";
55
import {EntryPoint} from "lib/account-abstraction/contracts/core/EntryPoint.sol";
66
import {ERC20Mock} from "@openzeppelin/contracts/mocks/token/ERC20Mock.sol";
77

8-
contract HelperConfig is Script{
8+
contract HelperConfig is Script {
99
error HelperConfig__InvalidChainId();
1010

11-
struct NetworkConfig{
11+
struct NetworkConfig {
1212
address entryPoint;
1313
address usdc;
1414
address account;
1515
}
16+
1617
uint256 constant ETH_MAINNET_CHAIN_ID = 1;
1718
uint256 constant ETH_SEPOLIA_CHAIN_ID = 11155111;
1819
uint256 constant ZKSYNC_SEPOLIA_CHAIN_ID = 300;
1920
uint256 constant LOCAL_CHAIN_ID = 31337;
2021

21-
address constant BURNER_WALLET =0x7653816f9a95083b726F30ACf6bAb6c6A20447F4;
22+
address constant BURNER_WALLET = 0x7653816f9a95083b726F30ACf6bAb6c6A20447F4;
2223
uint256 constant ARBITRUM_MAINNET_CHAIN_ID = 42_161;
2324
uint256 constant ZKSYNC_MAINNET_CHAIN_ID = 324;
2425

25-
address constant ANVIL_DEFAULT_ACCOUNT =0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266;
26+
address constant ANVIL_DEFAULT_ACCOUNT = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266;
2627
NetworkConfig public localNetworkConfig;
2728
mapping(uint256 chainId => NetworkConfig) public networkConfigs;
2829

29-
constructor() {
30+
constructor() {
3031
networkConfigs[ETH_SEPOLIA_CHAIN_ID] = getEthSepoliaConfig();
3132
networkConfigs[ETH_MAINNET_CHAIN_ID] = getEthMainnetConfig();
3233
networkConfigs[ZKSYNC_MAINNET_CHAIN_ID] = getZkSyncConfig();
@@ -46,6 +47,7 @@ contract HelperConfig is Script{
4647
revert HelperConfig__InvalidChainId();
4748
}
4849
}
50+
4951
function getEthMainnetConfig() public pure returns (NetworkConfig memory) {
5052
// This is v7
5153
return NetworkConfig({
@@ -54,7 +56,8 @@ contract HelperConfig is Script{
5456
account: BURNER_WALLET
5557
});
5658
}
57-
function getEthSepoliaConfig() public pure returns (NetworkConfig memory) {
59+
60+
function getEthSepoliaConfig() public pure returns (NetworkConfig memory) {
5861
return NetworkConfig({
5962
entryPoint: 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789,
6063
usdc: 0x53844F9577C2334e541Aec7Df7174ECe5dF1fCf0, // Update with your own mock token
@@ -103,5 +106,4 @@ contract HelperConfig is Script{
103106
NetworkConfig({entryPoint: address(entryPoint), usdc: address(erc20Mock), account: ANVIL_DEFAULT_ACCOUNT});
104107
return localNetworkConfig;
105108
}
106-
107-
}
109+
}

script/SendPackedUserOp.s.sol

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.24;
33

4-
import {Script,console2} from "forge-std/Script.sol";
4+
import {Script, console2} from "forge-std/Script.sol";
55
import {PackedUserOperation} from "lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol";
66
import {HelperConfig} from "./HelperConfig.s.sol";
77
import {IEntryPoint} from "lib/account-abstraction/contracts/interfaces/IEntryPoint.sol";
@@ -10,30 +10,35 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
1010
import {MinimalAccount} from "../src/ethereum/MinimalAccount.sol";
1111
import {DevOpsTools} from "lib/foundry-devops/src/DevOpsTools.sol";
1212

13-
contract SendPackedUserOp is Script{
13+
contract SendPackedUserOp is Script {
1414
using MessageHashUtils for bytes32;
1515

16-
address constant RANDOM_APPROVER= 0x70997970C51812dc3A010C7d01b50e0d17dc79C8;
16+
address constant RANDOM_APPROVER = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8;
1717

18-
function run() public{
19-
HelperConfig helperConfig=new HelperConfig();
20-
address to=helperConfig.getConfig().usdc;
21-
uint256 value=0;
22-
address minimalAccountAddress=DevOpsTools.get_most_recent_deployment("MinimalAccount",block.chainid);
23-
bytes memory functionData=abi.encodeWithSelector(IERC20.approve.selector,RANDOM_APPROVER,1e18);
24-
bytes memory executeCalldata=abi.encodeWithSelector(MinimalAccount.execute.selector,to,value,functionData);
25-
PackedUserOperation memory userOp=generateSignedUserOperation(executeCalldata,helperConfig.getConfig(),minimalAccountAddress);
26-
PackedUserOperation[] memory ops=new PackedUserOperation[](1);
27-
ops[0]=userOp;
18+
function run() public {
19+
HelperConfig helperConfig = new HelperConfig();
20+
address to = helperConfig.getConfig().usdc;
21+
uint256 value = 0;
22+
address minimalAccountAddress = DevOpsTools.get_most_recent_deployment("MinimalAccount", block.chainid);
23+
bytes memory functionData = abi.encodeWithSelector(IERC20.approve.selector, RANDOM_APPROVER, 1e18);
24+
bytes memory executeCalldata = abi.encodeWithSelector(MinimalAccount.execute.selector, to, value, functionData);
25+
PackedUserOperation memory userOp =
26+
generateSignedUserOperation(executeCalldata, helperConfig.getConfig(), minimalAccountAddress);
27+
PackedUserOperation[] memory ops = new PackedUserOperation[](1);
28+
ops[0] = userOp;
2829

2930
vm.startBroadcast();
30-
IEntryPoint(helperConfig.getConfig().entryPoint).handleOps(ops,payable(helperConfig.getConfig().account));
31+
IEntryPoint(helperConfig.getConfig().entryPoint).handleOps(ops, payable(helperConfig.getConfig().account));
3132
vm.stopBroadcast();
3233
}
3334

34-
function generateSignedUserOperation(bytes memory callData,HelperConfig.NetworkConfig memory config,address minimalAccount) public view returns(PackedUserOperation memory){
35-
uint256 nonce=vm.getNonce(minimalAccount)-1;
36-
PackedUserOperation memory userOp=_generateUnsignedUserOperation(callData,minimalAccount,nonce);
35+
function generateSignedUserOperation(
36+
bytes memory callData,
37+
HelperConfig.NetworkConfig memory config,
38+
address minimalAccount
39+
) public view returns (PackedUserOperation memory) {
40+
uint256 nonce = vm.getNonce(minimalAccount) - 1;
41+
PackedUserOperation memory userOp = _generateUnsignedUserOperation(callData, minimalAccount, nonce);
3742
bytes32 userOpHash = IEntryPoint(config.entryPoint).getUserOpHash(userOp);
3843
bytes32 digest = userOpHash.toEthSignedMessageHash();
3944
uint8 v;
@@ -48,7 +53,8 @@ contract SendPackedUserOp is Script{
4853
userOp.signature = abi.encodePacked(r, s, v); // Note the order
4954
return userOp;
5055
}
51-
function _generateUnsignedUserOperation(bytes memory callData, address sender, uint256 nonce)
56+
57+
function _generateUnsignedUserOperation(bytes memory callData, address sender, uint256 nonce)
5258
internal
5359
pure
5460
returns (PackedUserOperation memory)
@@ -69,4 +75,4 @@ contract SendPackedUserOp is Script{
6975
signature: hex""
7076
});
7177
}
72-
}
78+
}

src/ethereum/MinimalAccount.sol

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,74 @@ import {PackedUserOperation} from "lib/account-abstraction/contracts/interfaces/
66
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
77
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
88
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
9-
import {SIG_VALIDATION_FAILED,SIG_VALIDATION_SUCCESS} from "lib/account-abstraction/contracts/core/Helpers.sol";
9+
import {SIG_VALIDATION_FAILED, SIG_VALIDATION_SUCCESS} from "lib/account-abstraction/contracts/core/Helpers.sol";
1010
import {IEntryPoint} from "lib/account-abstraction/contracts/interfaces/IEntryPoint.sol";
1111

12-
contract MinimalAccount is IAccount, Ownable{
12+
contract MinimalAccount is IAccount, Ownable {
1313
error MinimalAccount__NotFromEntryPoint();
1414
error MinimalAccount__NotFromEntryPointOrOwner();
1515
error MinimalAccount__CallFailed(bytes);
1616

1717
IEntryPoint private immutable i_entrypoint;
1818

1919
modifier requireFromEntryPoint() {
20-
if(msg.sender!=address(i_entrypoint)){
20+
if (msg.sender != address(i_entrypoint)) {
2121
revert MinimalAccount__NotFromEntryPoint();
2222
}
2323
_;
2424
}
2525

2626
modifier requireFromEntryPointOrOwner() {
27-
if(msg.sender!=address(i_entrypoint) && msg.sender!=owner()){
27+
if (msg.sender != address(i_entrypoint) && msg.sender != owner()) {
2828
revert MinimalAccount__NotFromEntryPointOrOwner();
2929
}
3030
_;
3131
}
3232

33-
constructor(address entrypoint) Ownable(msg.sender){
33+
constructor(address entrypoint) Ownable(msg.sender) {
3434
i_entrypoint = IEntryPoint(entrypoint);
3535
}
3636

3737
receive() external payable {}
3838

39-
function execute(address to,uint256 value,bytes calldata functiondata) external requireFromEntryPointOrOwner{
40-
(bool success, bytes memory result)=to.call{value:value}(functiondata);
41-
if(!success){
39+
function execute(address to, uint256 value, bytes calldata functiondata) external requireFromEntryPointOrOwner {
40+
(bool success, bytes memory result) = to.call{value: value}(functiondata);
41+
if (!success) {
4242
revert MinimalAccount__CallFailed(result);
4343
}
4444
}
4545

46-
function validateUserOp(PackedUserOperation calldata userOp,bytes32 userOpHash,uint256 missingAccountFunds) external requireFromEntryPoint returns (uint256 validationData){
47-
validationData=_validateSignature(userOp,userOpHash);
46+
function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)
47+
external
48+
requireFromEntryPoint
49+
returns (uint256 validationData)
50+
{
51+
validationData = _validateSignature(userOp, userOpHash);
4852
_payPrefund(missingAccountFunds);
4953
}
50-
function _validateSignature(PackedUserOperation calldata userOp,bytes32 userOpHash) internal view returns (uint256 validationData){
51-
bytes32 ethSignedMessageHash=MessageHashUtils.toEthSignedMessageHash(userOpHash);
52-
address signer=ECDSA.recover(ethSignedMessageHash,userOp.signature);
53-
if(signer!=owner()){
54+
55+
function _validateSignature(PackedUserOperation calldata userOp, bytes32 userOpHash)
56+
internal
57+
view
58+
returns (uint256 validationData)
59+
{
60+
bytes32 ethSignedMessageHash = MessageHashUtils.toEthSignedMessageHash(userOpHash);
61+
address signer = ECDSA.recover(ethSignedMessageHash, userOp.signature);
62+
if (signer != owner()) {
5463
return SIG_VALIDATION_FAILED;
5564
} else {
5665
return SIG_VALIDATION_SUCCESS;
5766
}
58-
5967
}
60-
function _payPrefund(uint256 missingAccountFunds) internal{
61-
if(missingAccountFunds!=0){
62-
(bool success,)=payable(msg.sender).call{value:missingAccountFunds,gas:type(uint256).max}("");
68+
69+
function _payPrefund(uint256 missingAccountFunds) internal {
70+
if (missingAccountFunds != 0) {
71+
(bool success,) = payable(msg.sender).call{value: missingAccountFunds, gas: type(uint256).max}("");
6372
(success);
6473
}
6574
}
66-
function getEntryPoint() external view returns(address){
75+
76+
function getEntryPoint() external view returns (address) {
6777
return address(i_entrypoint);
6878
}
69-
}
79+
}

0 commit comments

Comments
 (0)