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..9b2f930fd1341 --- /dev/null +++ b/packages/contracts-bedrock/test/universal/SafeSend.t.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +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)); + + assertEq(address(safeSend).code.length, 0); + assertEq(address(safeSend).balance, 0); + assertEq(alice.balance, aliceBalanceBefore - 100 ether); + assertEq(bob.balance, bobBalanceBefore + 100 ether); + } +}