Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
61e3695e
Commit
61e3695e
authored
Jan 17, 2023
by
Andreas Bigger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tests: expand l1 standard bridge testing :test_tube:
parent
8f7a9bc3
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
198 additions
and
17 deletions
+198
-17
.gas-snapshot
packages/contracts-bedrock/.gas-snapshot
+3
-3
L1StandardBridge.t.sol
...s/contracts-bedrock/contracts/test/L1StandardBridge.t.sol
+195
-14
No files found.
packages/contracts-bedrock/.gas-snapshot
View file @
61e3695e
...
@@ -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: 3
24712
)
L1StandardBridge_DepositETHTo_Test:test_depositETHTo_succeeds() (gas: 3
58463
)
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)
...
...
packages/contracts-bedrock/contracts/test/L1StandardBridge.t.sol
View file @
61e3695e
...
@@ -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);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment