@@ -23,9 +23,10 @@ contract SessionKeyValidatorTest is KernelTestBase {
2323 TestERC20 testToken;
2424 address sessionKey;
2525 uint256 sessionKeyPriv;
26+
2627 function setUp () public {
2728 (owner, ownerKey) = makeAddrAndKey ("owner " );
28- (factoryOwner, ) = makeAddrAndKey ("factoryOwner " );
29+ (factoryOwner,) = makeAddrAndKey ("factoryOwner " );
2930 (sessionKey, sessionKeyPriv) = makeAddrAndKey ("sessionKey " );
3031 entryPoint = new EntryPoint ();
3132 kernelImpl = new Kernel (entryPoint);
@@ -36,7 +37,17 @@ contract SessionKeyValidatorTest is KernelTestBase {
3637
3738 validator = new ECDSAValidator ();
3839
39- kernel = Kernel (payable (address (factory.createAccount (address (kernelImpl), abi.encodeWithSelector (KernelStorage.initialize.selector , validator, abi.encodePacked (owner)), 0 ))));
40+ kernel = Kernel (
41+ payable (
42+ address (
43+ factory.createAccount (
44+ address (kernelImpl),
45+ abi.encodeWithSelector (KernelStorage.initialize.selector , validator, abi.encodePacked (owner)),
46+ 0
47+ )
48+ )
49+ )
50+ );
4051 vm.deal (address (kernel), 1e30 );
4152 beneficiary = payable (address (makeAddr ("beneficiary " )));
4253 testToken = new TestERC20 ();
@@ -46,8 +57,16 @@ contract SessionKeyValidatorTest is KernelTestBase {
4657 function test_mode_2_no_paymaster () external {
4758 testToken.mint (address (kernel), 100e18 );
4859 TestERC20 testToken2 = new TestERC20 ();
49- UserOperation memory op =
50- entryPoint.fillUserOp (address (kernel), abi.encodeWithSelector (Kernel.execute.selector , address (testToken), 0 , abi.encodeWithSelector (ERC20 .transfer.selector , beneficiary, 100 ), Operation.Call));
60+ UserOperation memory op = entryPoint.fillUserOp (
61+ address (kernel),
62+ abi.encodeWithSelector (
63+ Kernel.execute.selector ,
64+ address (testToken),
65+ 0 ,
66+ abi.encodeWithSelector (ERC20 .transfer.selector , beneficiary, 100 ),
67+ Operation.Call
68+ )
69+ );
5170
5271 ExecuteSessionKeyValidator.ParamRule[] memory rules = new ExecuteSessionKeyValidator.ParamRule [](1 );
5372 rules[0 ] = ExecuteSessionKeyValidator.ParamRule ({
@@ -56,22 +75,28 @@ contract SessionKeyValidatorTest is KernelTestBase {
5675 param: bytes32 (uint256 (1e18 ))
5776 });
5877
59-
6078 bytes32 [] memory data = new bytes32 [](2 );
61- data[0 ] = keccak256 (abi.encode (ExecuteSessionKeyValidator.Permission ({
62- valueLimit : 0 ,
63- target: address (testToken),
64- sig: ERC20 .transfer.selector ,
65- rules: rules
66- })));
67-
68- data[1 ] = keccak256 (abi.encode (ExecuteSessionKeyValidator.Permission ({
69- valueLimit : 0 ,
70- target: address (testToken2),
71- sig: ERC20 .transfer.selector ,
72- rules: rules
73- })));
79+ data[0 ] = keccak256 (
80+ abi.encode (
81+ ExecuteSessionKeyValidator.Permission ({
82+ valueLimit: 0 ,
83+ target: address (testToken),
84+ sig: ERC20 .transfer.selector ,
85+ rules: rules
86+ })
87+ )
88+ );
7489
90+ data[1 ] = keccak256 (
91+ abi.encode (
92+ ExecuteSessionKeyValidator.Permission ({
93+ valueLimit: 0 ,
94+ target: address (testToken2),
95+ sig: ERC20 .transfer.selector ,
96+ rules: rules
97+ })
98+ )
99+ );
75100
76101 bytes32 merkleRoot = _getRoot (data);
77102 bytes memory enableData = abi.encodePacked (sessionKey, merkleRoot, uint48 (0 ), uint48 (0 ), address (0 ));
@@ -100,7 +125,7 @@ contract SessionKeyValidatorTest is KernelTestBase {
100125 entryPoint.signUserOpHash (vm, sessionKeyPriv, op),
101126 abi.encode (
102127 ExecuteSessionKeyValidator.Permission ({
103- valueLimit : 0 ,
128+ valueLimit: 0 ,
104129 target: address (testToken),
105130 sig: ERC20 .transfer.selector ,
106131 rules: rules
@@ -116,79 +141,76 @@ contract SessionKeyValidatorTest is KernelTestBase {
116141 entryPoint.handleOps (ops, beneficiary);
117142 }
118143}
119- // Following code is adapted from https://github.com/dmfxyz/murky/blob/main/src/common/MurkyBase.sol.
144+ // Following code is adapted from https://github.com/dmfxyz/murky/blob/main/src/common/MurkyBase.sol.
120145
121- function _getRoot (bytes32 [] memory data ) pure returns (bytes32 ) {
122- require (data.length > 1 );
123- while (data.length > 1 ) {
124- data = _hashLevel (data);
125- }
126- return data[0 ];
146+ function _getRoot (bytes32 [] memory data ) pure returns (bytes32 ) {
147+ require (data.length > 1 );
148+ while (data.length > 1 ) {
149+ data = _hashLevel (data);
127150 }
151+ return data[0 ];
152+ }
128153
129- function _getProof (bytes32 [] memory data , uint256 nodeIndex )
130- pure
131- returns (bytes32 [] memory )
132- {
133- require (data.length > 1 );
134-
135- bytes32 [] memory result = new bytes32 [](64 );
136- uint256 pos;
137-
138- while (data.length > 1 ) {
139- unchecked {
140- if (nodeIndex & 0x1 == 1 ) {
141- result[pos] = data[nodeIndex - 1 ];
142- } else if (nodeIndex + 1 == data.length ) {
143- result[pos] = bytes32 (0 );
144- } else {
145- result[pos] = data[nodeIndex + 1 ];
146- }
147- ++ pos;
148- nodeIndex /= 2 ;
149- }
150- data = _hashLevel (data);
151- }
152- // Resize the length of the array to fit.
153- /// @solidity memory-safe-assembly
154- assembly {
155- mstore (result, pos)
156- }
154+ function _getProof (bytes32 [] memory data , uint256 nodeIndex ) pure returns (bytes32 [] memory ) {
155+ require (data.length > 1 );
157156
158- return result ;
159- }
157+ bytes32 [] memory result = new bytes32 []( 64 ) ;
158+ uint256 pos;
160159
161- function _hashLevel (bytes32 [] memory data ) pure returns (bytes32 [] memory ) {
162- bytes32 [] memory result;
160+ while (data.length > 1 ) {
163161 unchecked {
164- uint256 length = data. length ;
165- if (length & 0x1 == 1 ) {
166- result = new bytes32 [](length / 2 + 1 );
167- result[result. length - 1 ] = _hashPair (data[length - 1 ], bytes32 (0 ) );
162+ if (nodeIndex & 0x1 == 1 ) {
163+ result[pos] = data[nodeIndex - 1 ];
164+ } else if (nodeIndex + 1 == data. length ) {
165+ result[pos ] = bytes32 (0 );
168166 } else {
169- result = new bytes32 [](length / 2 );
170- }
171- uint256 pos = 0 ;
172- for (uint256 i = 0 ; i < length - 1 ; i += 2 ) {
173- result[pos] = _hashPair (data[i], data[i + 1 ]);
174- ++ pos;
167+ result[pos] = data[nodeIndex + 1 ];
175168 }
169+ ++ pos;
170+ nodeIndex /= 2 ;
176171 }
177- return result;
172+ data = _hashLevel (data);
173+ }
174+ // Resize the length of the array to fit.
175+ /// @solidity memory-safe-assembly
176+ assembly {
177+ mstore (result, pos)
178178 }
179179
180- function _hashPair (bytes32 left , bytes32 right ) pure returns (bytes32 result ) {
181- /// @solidity memory-safe-assembly
182- assembly {
183- switch lt (left, right)
184- case 0 {
185- mstore (0x0 , right)
186- mstore (0x20 , left)
187- }
188- default {
189- mstore (0x0 , left)
190- mstore (0x20 , right)
191- }
192- result := keccak256 (0x0 , 0x40 )
180+ return result;
181+ }
182+
183+ function _hashLevel (bytes32 [] memory data ) pure returns (bytes32 [] memory ) {
184+ bytes32 [] memory result;
185+ unchecked {
186+ uint256 length = data.length ;
187+ if (length & 0x1 == 1 ) {
188+ result = new bytes32 [](length / 2 + 1 );
189+ result[result.length - 1 ] = _hashPair (data[length - 1 ], bytes32 (0 ));
190+ } else {
191+ result = new bytes32 [](length / 2 );
192+ }
193+ uint256 pos = 0 ;
194+ for (uint256 i = 0 ; i < length - 1 ; i += 2 ) {
195+ result[pos] = _hashPair (data[i], data[i + 1 ]);
196+ ++ pos;
193197 }
194198 }
199+ return result;
200+ }
201+
202+ function _hashPair (bytes32 left , bytes32 right ) pure returns (bytes32 result ) {
203+ /// @solidity memory-safe-assembly
204+ assembly {
205+ switch lt (left, right)
206+ case 0 {
207+ mstore (0x0 , right)
208+ mstore (0x20 , left)
209+ }
210+ default {
211+ mstore (0x0 , left)
212+ mstore (0x20 , right)
213+ }
214+ result := keccak256 (0x0 , 0x40 )
215+ }
216+ }
0 commit comments