Skip to content

Commit 76d5304

Browse files
authored
♻️ Make fallback payable (ethereum#651)
1 parent 1489ddc commit 76d5304

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

.gas-snapshot

+16-15
Original file line numberDiff line numberDiff line change
@@ -221,27 +221,28 @@ ERC2981Test:testRoyaltyOverflowCheckDifferential(uint256,uint256) (runs: 256, μ
221221
ERC2981Test:testSetAndGetRoyaltyInfo(uint256) (runs: 256, μ: 107629, ~: 104801)
222222
ERC2981Test:test__codesize() (gas: 8419)
223223
ERC4337FactoryTest:testDeploy() (gas: 112614)
224-
ERC4337FactoryTest:testDeploy(uint256) (runs: 256, μ: 135780, ~: 135781)
225-
ERC4337FactoryTest:testDeployDeterministic(uint256) (runs: 256, μ: 132593, ~: 137159)
224+
ERC4337FactoryTest:testDeploy(uint256) (runs: 256, μ: 135779, ~: 135788)
225+
ERC4337FactoryTest:testDeployDeterministic(uint256) (runs: 256, μ: 131474, ~: 137165)
226226
ERC4337FactoryTest:testDeployDeterministicRevertWithDeploymentFailed() (gas: 96883638)
227-
ERC4337FactoryTest:test__codesize() (gas: 11343)
227+
ERC4337FactoryTest:test__codesize() (gas: 11330)
228+
ERC4337Test:testCdFallback() (gas: 1178533)
228229
ERC4337Test:testDelegateExecute() (gas: 370417)
229-
ERC4337Test:testDelegateExecute(uint256) (runs: 256, μ: 353981, ~: 343995)
230+
ERC4337Test:testDelegateExecute(uint256) (runs: 256, μ: 355257, ~: 343995)
230231
ERC4337Test:testDelegateExecuteRevertsIfOwnerSlotValueChanged() (gas: 318832)
231-
ERC4337Test:testDepositFunctions() (gas: 502811)
232-
ERC4337Test:testDirectStorage() (gas: 70943)
232+
ERC4337Test:testDepositFunctions() (gas: 502817)
233+
ERC4337Test:testDirectStorage() (gas: 70965)
233234
ERC4337Test:testETHReceived() (gas: 16606)
234235
ERC4337Test:testExecute() (gas: 382275)
235236
ERC4337Test:testExecuteBatch() (gas: 691377)
236-
ERC4337Test:testExecuteBatch(uint256) (runs: 256, μ: 532071, ~: 367759)
237+
ERC4337Test:testExecuteBatch(uint256) (runs: 256, μ: 505137, ~: 367584)
237238
ERC4337Test:testInitializer() (gas: 285354)
238239
ERC4337Test:testIsValidSignature() (gas: 66115)
239240
ERC4337Test:testIsValidSignatureWrapped() (gas: 388471)
240-
ERC4337Test:testOnERC1155BatchReceived() (gas: 1393612)
241-
ERC4337Test:testOnERC1155Received() (gas: 1390956)
242-
ERC4337Test:testOnERC721Received() (gas: 1311297)
243-
ERC4337Test:testValidateUserOp() (gas: 491252)
244-
ERC4337Test:test__codesize() (gas: 44398)
241+
ERC4337Test:testOnERC1155BatchReceived() (gas: 1393588)
242+
ERC4337Test:testOnERC1155Received() (gas: 1390889)
243+
ERC4337Test:testOnERC721Received() (gas: 1311273)
244+
ERC4337Test:testValidateUserOp() (gas: 491274)
245+
ERC4337Test:test__codesize() (gas: 46551)
245246
ERC4626Test:testDepositWithNoApprovalReverts() (gas: 16371)
246247
ERC4626Test:testDepositWithNotEnoughApprovalReverts() (gas: 89884)
247248
ERC4626Test:testDifferentialFullMulDiv(uint256,uint256,uint256) (runs: 256, μ: 3336, ~: 3201)
@@ -836,9 +837,9 @@ OwnableTest:testTransferOwnership() (gas: 19467)
836837
OwnableTest:testTransferOwnership(address,bool,bool) (runs: 256, μ: 13601, ~: 12828)
837838
OwnableTest:test__codesize() (gas: 12233)
838839
ReceiverTest:testETHReceived() (gas: 9621)
839-
ReceiverTest:testOnERC1155BatchReceived() (gas: 48994)
840-
ReceiverTest:testOnERC1155Received() (gas: 46736)
841-
ReceiverTest:testOnERC721Received() (gas: 64132)
840+
ReceiverTest:testOnERC1155BatchReceived() (gas: 48975)
841+
ReceiverTest:testOnERC1155Received() (gas: 46717)
842+
ReceiverTest:testOnERC721Received() (gas: 64108)
842843
ReceiverTest:test__codesize() (gas: 3309)
843844
RedBlackTreeLibTest:testRedBlackTreeBenchUint160() (gas: 3438446)
844845
RedBlackTreeLibTest:testRedBlackTreeBenchUint256() (gas: 5850739)

src/accounts/ERC4337.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ contract ERC4337 is Ownable, UUPSUpgradeable, Receiver {
369369
/// @dev Handle token callbacks. If no token callback is triggered,
370370
/// use `LibZip.cdFallback` for generalized calldata decompression.
371371
/// If you don't need either, re-override this function.
372-
fallback() external virtual override(Receiver) receiverFallback {
372+
fallback() external payable virtual override(Receiver) receiverFallback {
373373
LibZip.cdFallback();
374374
}
375375
}

src/accounts/Receiver.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ abstract contract Receiver {
1313
receive() external payable virtual {}
1414

1515
/// @dev Fallback function with the `receiverFallback` modifier.
16-
fallback() external virtual receiverFallback {}
16+
fallback() external payable virtual receiverFallback {}
1717

1818
/// @dev Modifier for the fallback function to handle token callbacks.
1919
modifier receiverFallback() virtual {

test/ERC4337.t.sol

+32
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {MockERC1155} from "./utils/mocks/MockERC1155.sol";
1010
import {MockERC1271Wallet} from "./utils/mocks/MockERC1271Wallet.sol";
1111
import {LibClone} from "../src/utils/LibClone.sol";
1212
import {LibString} from "../src/utils/LibString.sol";
13+
import {LibZip} from "../src/utils/LibZip.sol";
1314

1415
contract Target {
1516
error TargetError(bytes data);
@@ -224,6 +225,37 @@ contract ERC4337Test is SoladyTest {
224225
assertEq(account.getDeposit(), 123 - 12);
225226
}
226227

228+
function testCdFallback() public {
229+
vm.deal(address(account), 1 ether);
230+
account.initialize(address(this));
231+
232+
vm.etch(account.entryPoint(), address(new MockEntryPoint()).code);
233+
assertEq(account.getDeposit(), 0);
234+
235+
bytes memory data = LibZip.cdCompress(abi.encodeWithSignature("addDeposit()"));
236+
(bool success,) = address(account).call{value: 123}(data);
237+
assertTrue(success);
238+
assertEq(account.getDeposit(), 123);
239+
240+
ERC4337.Call[] memory calls = new ERC4337.Call[](2);
241+
calls[0].target = address(new Target());
242+
calls[1].target = address(new Target());
243+
calls[0].value = 123;
244+
calls[1].value = 456;
245+
calls[0].data = abi.encodeWithSignature("setData(bytes)", _randomBytes(111));
246+
calls[1].data = abi.encodeWithSignature("setData(bytes)", _randomBytes(222));
247+
248+
data = LibZip.cdCompress(
249+
abi.encodeWithSignature("executeBatch((address,uint256,bytes)[])", calls)
250+
);
251+
(success,) = address(account).call(data);
252+
assertTrue(success);
253+
assertEq(Target(calls[0].target).datahash(), keccak256(_randomBytes(111)));
254+
assertEq(Target(calls[1].target).datahash(), keccak256(_randomBytes(222)));
255+
assertEq(calls[0].target.balance, 123);
256+
assertEq(calls[1].target.balance, 456);
257+
}
258+
227259
struct _TestTemps {
228260
bytes32 userOpHash;
229261
address signer;

0 commit comments

Comments
 (0)