From a07a0b60376cde6724879e0fba42be14275d87cb Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Wed, 20 Nov 2024 07:59:17 +0100 Subject: [PATCH 1/2] improve universal and libraries tests and coverage --- .../test/libraries/Encoding.t.sol | 29 +++++++++++ .../test/universal/SafeSend.t.sol | 48 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 packages/contracts-bedrock/test/universal/SafeSend.t.sol diff --git a/packages/contracts-bedrock/test/libraries/Encoding.t.sol b/packages/contracts-bedrock/test/libraries/Encoding.t.sol index a301fdd97b3a6..277cce328dcdd 100644 --- a/packages/contracts-bedrock/test/libraries/Encoding.t.sol +++ b/packages/contracts-bedrock/test/libraries/Encoding.t.sol @@ -71,6 +71,18 @@ contract Encoding_Test is CommonTest { assertEq(legacyEncoding, bedrockEncoding); } + /// @dev Tests that encodeCrossDomainMessage reverts if version is greater than 1. + function testFuzz_encodeCrossDomainMessage_versionGreaterThanOne_reverts(uint256 nonce) external { + // nonce >> 240 must be greater than 1 + uint256 minInvalidNonce = (uint256(type(uint240).max) + 1) * 2; + nonce = bound(nonce, minInvalidNonce, type(uint256).max); + + EncodingContract encoding = new EncodingContract(); + + vm.expectRevert(bytes("Encoding: unknown cross domain message version")); + encoding.encodeCrossDomainMessage(nonce, address(this), address(this), 1, 100, hex""); + } + /// @dev Tests deposit transaction encoding. function testDiff_encodeDepositTransaction_succeeds( address _from, @@ -94,3 +106,20 @@ contract Encoding_Test is CommonTest { assertEq(txn, _txn); } } + +contract EncodingContract { + function encodeCrossDomainMessage( + uint256 nonce, + address sender, + address target, + uint256 value, + uint256 gasLimit, + bytes memory data + ) + external + pure + returns (bytes memory) + { + return Encoding.encodeCrossDomainMessage(nonce, sender, target, value, gasLimit, data); + } +} diff --git a/packages/contracts-bedrock/test/universal/SafeSend.t.sol b/packages/contracts-bedrock/test/universal/SafeSend.t.sol new file mode 100644 index 0000000000000..e032b22dd0d31 --- /dev/null +++ b/packages/contracts-bedrock/test/universal/SafeSend.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { console } from "forge-std/console.sol"; +import { SafeSend } from "src/universal/SafeSend.sol"; +import { CommonTest } from "test/setup/CommonTest.sol"; + +contract SafeSendTest is CommonTest { + /// @notice Tests that sending to an EOA succeeds. + function test_send_toEOA_succeeds() public { + assertNotEq(alice, address(0)); + assertNotEq(bob, address(0)); + assertEq(bob.code.length, 0); + + vm.deal(alice, 100 ether); + + uint256 aliceBalanceBefore = alice.balance; + uint256 bobBalanceBefore = bob.balance; + + vm.prank(alice); + SafeSend safeSend = new SafeSend{ value: 100 ether }(payable(bob)); + + assertEq(address(safeSend).code.length, 0); + assertEq(address(safeSend).balance, 0); + assertEq(alice.balance, aliceBalanceBefore - 100 ether); + assertEq(bob.balance, bobBalanceBefore + 100 ether); + } + + /// @notice Tests that sending to a contract succeeds without executing the + /// contract's code. + function test_send_toContract_succeeds() public { + // etch reverting code into bob + vm.etch(bob, hex"fe"); + vm.deal(alice, 100 ether); + + uint256 aliceBalanceBefore = alice.balance; + uint256 bobBalanceBefore = bob.balance; + + vm.prank(alice); + SafeSend safeSend = new SafeSend{ value: 100 ether }(payable(bob)); + console.log(address(safeSend)); + + assertEq(address(safeSend).code.length, 0); + assertEq(address(safeSend).balance, 0); + assertEq(alice.balance, aliceBalanceBefore - 100 ether); + assertEq(bob.balance, bobBalanceBefore + 100 ether); + } +} From 24c7e09762fac94e4ebfefb36b1f8be726954c9f Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Wed, 20 Nov 2024 08:11:26 +0100 Subject: [PATCH 2/2] fixes --- packages/contracts-bedrock/test/universal/SafeSend.t.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/contracts-bedrock/test/universal/SafeSend.t.sol b/packages/contracts-bedrock/test/universal/SafeSend.t.sol index e032b22dd0d31..9b2f930fd1341 100644 --- a/packages/contracts-bedrock/test/universal/SafeSend.t.sol +++ b/packages/contracts-bedrock/test/universal/SafeSend.t.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { console } from "forge-std/console.sol"; import { SafeSend } from "src/universal/SafeSend.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; @@ -38,7 +37,6 @@ contract SafeSendTest is CommonTest { vm.prank(alice); SafeSend safeSend = new SafeSend{ value: 100 ether }(payable(bob)); - console.log(address(safeSend)); assertEq(address(safeSend).code.length, 0); assertEq(address(safeSend).balance, 0);