Commit 61e3695e authored by Andreas Bigger's avatar Andreas Bigger

tests: expand l1 standard bridge testing :test_tube:

parent 8f7a9bc3
...@@ -92,10 +92,10 @@ L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() ( ...@@ -92,10 +92,10 @@ L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 16093) L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 16093)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 17593) L1ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 17593)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 323814) L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 323814)
L1StandardBridge_DepositERC20To_Test:test_depositERC20To_succeeds() (gas: 579798) L1StandardBridge_DepositERC20To_Test:test_depositERC20To_succeeds() (gas: 623962)
L1StandardBridge_DepositERC20_Test:test_depositERC20_succeeds() (gas: 573786) L1StandardBridge_DepositERC20_Test:test_depositERC20_succeeds() (gas: 621641)
L1StandardBridge_DepositERC20_TestFail:test_depositERC20_notEoa_reverts() (gas: 22320) L1StandardBridge_DepositERC20_TestFail:test_depositERC20_notEoa_reverts() (gas: 22320)
L1StandardBridge_DepositETHTo_Test:test_depositETHTo_succeeds() (gas: 324712) L1StandardBridge_DepositETHTo_Test:test_depositETHTo_succeeds() (gas: 358463)
L1StandardBridge_DepositETH_Test:test_depositETH_succeeds() (gas: 401286) L1StandardBridge_DepositETH_Test:test_depositETH_succeeds() (gas: 401286)
L1StandardBridge_DepositETH_TestFail:test_depositETH_notEoa_reverts() (gas: 40780) L1StandardBridge_DepositETH_TestFail:test_depositETH_notEoa_reverts() (gas: 40780)
L1StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH() (gas: 48661) L1StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH() (gas: 48661)
......
...@@ -168,6 +168,9 @@ contract L1StandardBridge_DepositETHTo_Test is Bridge_Initializer { ...@@ -168,6 +168,9 @@ contract L1StandardBridge_DepositETHTo_Test is Bridge_Initializer {
// - ETH ends up in the optimismPortal // - ETH ends up in the optimismPortal
function test_depositETHTo_succeeds() external { function test_depositETHTo_succeeds() external {
assertEq(address(op).balance, 0); assertEq(address(op).balance, 0);
uint256 nonce = L1Messenger.messageNonce();
uint256 version = 0; // Internal constant in the OptimismPortal: DEPOSIT_VERSION
address l1MessengerAliased = AddressAliasHelper.applyL1ToL2Alias(address(L1Messenger));
vm.expectEmit(true, true, true, true); vm.expectEmit(true, true, true, true);
emit ETHDepositInitiated(alice, bob, 600, hex"dead"); emit ETHDepositInitiated(alice, bob, 600, hex"dead");
...@@ -181,6 +184,14 @@ contract L1StandardBridge_DepositETHTo_Test is Bridge_Initializer { ...@@ -181,6 +184,14 @@ contract L1StandardBridge_DepositETHTo_Test is Bridge_Initializer {
abi.encodeWithSelector(L1Bridge.depositETHTo.selector, bob, 1000, hex"dead") abi.encodeWithSelector(L1Bridge.depositETHTo.selector, bob, 1000, hex"dead")
); );
bytes memory message = abi.encodeWithSelector(
StandardBridge.finalizeBridgeETH.selector,
alice,
bob,
600,
hex"dead"
);
// the L1 bridge should call // the L1 bridge should call
// L1CrossDomainMessenger.sendMessage // L1CrossDomainMessenger.sendMessage
vm.expectCall( vm.expectCall(
...@@ -188,19 +199,53 @@ contract L1StandardBridge_DepositETHTo_Test is Bridge_Initializer { ...@@ -188,19 +199,53 @@ contract L1StandardBridge_DepositETHTo_Test is Bridge_Initializer {
abi.encodeWithSelector( abi.encodeWithSelector(
CrossDomainMessenger.sendMessage.selector, CrossDomainMessenger.sendMessage.selector,
address(L2Bridge), address(L2Bridge),
abi.encodeWithSelector( message,
StandardBridge.finalizeBridgeETH.selector,
alice,
bob,
600,
hex"dead"
),
1000 1000
) )
); );
// TODO: assert on OptimismPortal being called bytes memory innerMessage = abi.encodeWithSelector(
// and the event being emitted correctly CrossDomainMessenger.relayMessage.selector,
nonce,
address(L1Bridge),
address(L2Bridge),
600,
1000,
message
);
uint64 baseGas = L1Messenger.baseGas(message, 1000);
vm.expectCall(
address(op),
abi.encodeWithSelector(
OptimismPortal.depositTransaction.selector,
address(L2Messenger),
600,
baseGas,
false,
innerMessage
)
);
bytes memory opaqueData = abi.encodePacked(
uint256(600),
uint256(600),
baseGas,
false,
innerMessage
);
// OptimismPortal emits a TransactionDeposited event on `depositTransaction` call
vm.expectEmit(true, true, true, true);
emit TransactionDeposited(l1MessengerAliased, address(L2Messenger), version, opaqueData);
// SentMessage event emitted by the CrossDomainMessenger
vm.expectEmit(true, true, true, true);
emit SentMessage(address(L2Bridge), address(L1Bridge), message, nonce, 1000);
// SentMessageExtension1 event emitted by the CrossDomainMessenger
vm.expectEmit(true, true, true, true);
emit SentMessageExtension1(address(L1Bridge), 600);
// deposit eth to bob // deposit eth to bob
vm.prank(alice, alice); vm.prank(alice, alice);
...@@ -219,26 +264,94 @@ contract L1StandardBridge_DepositERC20_Test is Bridge_Initializer { ...@@ -219,26 +264,94 @@ contract L1StandardBridge_DepositERC20_Test is Bridge_Initializer {
// - calls optimismPortal.depositTransaction // - calls optimismPortal.depositTransaction
// - only callable by EOA // - only callable by EOA
function test_depositERC20_succeeds() external { function test_depositERC20_succeeds() external {
uint256 nonce = L1Messenger.messageNonce();
uint256 version = 0; // Internal constant in the OptimismPortal: DEPOSIT_VERSION
address l1MessengerAliased = AddressAliasHelper.applyL1ToL2Alias(address(L1Messenger));
vm.expectEmit(true, true, true, true); vm.expectEmit(true, true, true, true);
emit ERC20DepositInitiated(address(L1Token), address(L2Token), alice, alice, 100, hex""); emit ERC20DepositInitiated(address(L1Token), address(L2Token), alice, alice, 100, hex"");
// Deal Alice's ERC20 State
deal(address(L1Token), alice, 100000, true); deal(address(L1Token), alice, 100000, true);
vm.prank(alice); vm.prank(alice);
L1Token.approve(address(L1Bridge), type(uint256).max); L1Token.approve(address(L1Bridge), type(uint256).max);
// The L1Bridge should transfer alice's tokens // The L1Bridge should transfer alice's tokens to itself
// to itself
vm.expectCall( vm.expectCall(
address(L1Token), address(L1Token),
abi.encodeWithSelector(ERC20.transferFrom.selector, alice, address(L1Bridge), 100) abi.encodeWithSelector(ERC20.transferFrom.selector, alice, address(L1Bridge), 100)
); );
// TODO: optimismPortal.depositTransaction call + event bytes memory message = abi.encodeWithSelector(
StandardBridge.finalizeBridgeERC20.selector,
address(L2Token),
address(L1Token),
alice,
alice,
100,
hex""
);
// the L1 bridge should call L1CrossDomainMessenger.sendMessage
vm.expectCall(
address(L1Messenger),
abi.encodeWithSelector(
CrossDomainMessenger.sendMessage.selector,
address(L2Bridge),
message,
10000
)
);
bytes memory innerMessage = abi.encodeWithSelector(
CrossDomainMessenger.relayMessage.selector,
nonce,
address(L1Bridge),
address(L2Bridge),
0,
10000,
message
);
uint64 baseGas = L1Messenger.baseGas(message, 10000);
vm.expectCall(
address(op),
abi.encodeWithSelector(
OptimismPortal.depositTransaction.selector,
address(L2Messenger),
0,
baseGas,
false,
innerMessage
)
);
bytes memory opaqueData = abi.encodePacked(
uint256(0),
uint256(0),
baseGas,
false,
innerMessage
);
// ERC20 Deposit Initiated event emitted by the StandardBridge Contract
vm.expectEmit(true, true, true, true);
emit ERC20BridgeInitiated(address(L1Token), address(L2Token), alice, alice, 100, hex"");
// OptimismPortal emits a TransactionDeposited event on `depositTransaction` call
vm.expectEmit(true, true, true, true);
emit TransactionDeposited(l1MessengerAliased, address(L2Messenger), version, opaqueData);
// SentMessage event emitted by the CrossDomainMessenger
vm.expectEmit(true, true, true, true);
emit SentMessage(address(L2Bridge), address(L1Bridge), message, nonce, 10000);
// SentMessageExtension1 event emitted by the CrossDomainMessenger
vm.expectEmit(true, true, true, true);
emit SentMessageExtension1(address(L1Bridge), 0);
vm.prank(alice); vm.prank(alice);
L1Bridge.depositERC20(address(L1Token), address(L2Token), 100, 10000, hex""); L1Bridge.depositERC20(address(L1Token), address(L2Token), 100, 10000, hex"");
assertEq(L1Bridge.deposits(address(L1Token), address(L2Token)), 100); assertEq(L1Bridge.deposits(address(L1Token), address(L2Token)), 100);
} }
} }
...@@ -261,12 +374,80 @@ contract L1StandardBridge_DepositERC20To_Test is Bridge_Initializer { ...@@ -261,12 +374,80 @@ contract L1StandardBridge_DepositERC20To_Test is Bridge_Initializer {
// - calls optimismPortal.depositTransaction // - calls optimismPortal.depositTransaction
// - callable by a contract // - callable by a contract
function test_depositERC20To_succeeds() external { function test_depositERC20To_succeeds() external {
uint256 nonce = L1Messenger.messageNonce();
uint256 version = 0; // Internal constant in the OptimismPortal: DEPOSIT_VERSION
address l1MessengerAliased = AddressAliasHelper.applyL1ToL2Alias(address(L1Messenger));
bytes memory message = abi.encodeWithSelector(
StandardBridge.finalizeBridgeERC20.selector,
address(L2Token),
address(L1Token),
alice,
bob,
1000,
hex""
);
// the L1 bridge should call L1CrossDomainMessenger.sendMessage
vm.expectCall(
address(L1Messenger),
abi.encodeWithSelector(
CrossDomainMessenger.sendMessage.selector,
address(L2Bridge),
message,
10000
)
);
bytes memory innerMessage = abi.encodeWithSelector(
CrossDomainMessenger.relayMessage.selector,
nonce,
address(L1Bridge),
address(L2Bridge),
0,
10000,
message
);
uint64 baseGas = L1Messenger.baseGas(message, 10000);
vm.expectCall(
address(op),
abi.encodeWithSelector(
OptimismPortal.depositTransaction.selector,
address(L2Messenger),
0,
baseGas,
false,
innerMessage
)
);
bytes memory opaqueData = abi.encodePacked(
uint256(0),
uint256(0),
baseGas,
false,
innerMessage
);
vm.expectEmit(true, true, true, true); vm.expectEmit(true, true, true, true);
emit ERC20DepositInitiated(address(L1Token), address(L2Token), alice, bob, 1000, hex""); emit ERC20DepositInitiated(address(L1Token), address(L2Token), alice, bob, 1000, hex"");
vm.expectEmit(true, true, true, true); vm.expectEmit(true, true, true, true);
emit ERC20BridgeInitiated(address(L1Token), address(L2Token), alice, bob, 1000, hex""); emit ERC20BridgeInitiated(address(L1Token), address(L2Token), alice, bob, 1000, hex"");
// OptimismPortal emits a TransactionDeposited event on `depositTransaction` call
vm.expectEmit(true, true, true, true);
emit TransactionDeposited(l1MessengerAliased, address(L2Messenger), version, opaqueData);
// SentMessage event emitted by the CrossDomainMessenger
vm.expectEmit(true, true, true, true);
emit SentMessage(address(L2Bridge), address(L1Bridge), message, nonce, 10000);
// SentMessageExtension1 event emitted by the CrossDomainMessenger
vm.expectEmit(true, true, true, true);
emit SentMessageExtension1(address(L1Bridge), 0);
deal(address(L1Token), alice, 100000, true); deal(address(L1Token), alice, 100000, true);
vm.prank(alice); vm.prank(alice);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment