Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions packages/contracts-bedrock/test/libraries/Encoding.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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);
}
}
46 changes: 46 additions & 0 deletions packages/contracts-bedrock/test/universal/SafeSend.t.sol
Original file line number Diff line number Diff line change
@@ -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);
}
}