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
2 changes: 1 addition & 1 deletion contracts/Failure.abi
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"inputs":[],"name":"fail","outputs":[],"stateMutability":"payable","type":"function"}]
[{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fail","outputs":[],"stateMutability":"payable","type":"function"}]
2 changes: 1 addition & 1 deletion contracts/Failure.bin
Original file line number Diff line number Diff line change
@@ -1 +1 @@
608060405234801561001057600080fd5b5061010f806100206000396000f3fe608060405260043610601c5760003560e01c8063a9cc4718146021575b600080fd5b60276029565b005b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040160599060bb565b60405180910390fd5b600082825260208201905092915050565b7f626967206661696c210000000000000000000000000000000000000000000000600082015250565b600060a76009836062565b915060b0826073565b602082019050919050565b6000602082019050818103600083015260d281609c565b905091905056fea264697066735822122068a0ae7d220da2e9f14cc48aec07eb227130c4a4ae2d89dca9c16c132f2c64fe64736f6c634300080d0033
608060405234801561001057600080fd5b50610285806100206000396000f3fe6080604052600436106100295760003560e01c806342966c681461002e578063a9cc47181461004a575b600080fd5b610048600480360381019061004391906100fa565b610054565b005b610052610084565b005b6000805a90505b825a826100689190610156565b101561007f57816100789061018a565b915061005b565b505050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b69061022f565b60405180910390fd5b600080fd5b6000819050919050565b6100d7816100c4565b81146100e257600080fd5b50565b6000813590506100f4816100ce565b92915050565b6000602082840312156101105761010f6100bf565b5b600061011e848285016100e5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610161826100c4565b915061016c836100c4565b92508282101561017f5761017e610127565b5b828203905092915050565b6000610195826100c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036101c7576101c6610127565b5b600182019050919050565b600082825260208201905092915050565b7f626967206661696c210000000000000000000000000000000000000000000000600082015250565b60006102196009836101d2565b9150610224826101e3565b602082019050919050565b600060208201905081810360008301526102488161020c565b905091905056fea264697066735822122026bd9e2efdd6d7fa97c409b84266f2549bcccc67d576b29d337f41226deeae5464736f6c634300080d0033
8 changes: 8 additions & 0 deletions contracts/Failure.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,12 @@ contract Failure {
function fail() public payable {
revert("big fail!");
}

function burn(uint256 _amount) public payable {
uint256 i = 0;
uint256 initialGas = gasleft();
while (initialGas - gasleft() < _amount) {
++i;
}
}
}
159 changes: 157 additions & 2 deletions optimism/bindings/failure.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 12 additions & 3 deletions optimism/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"errors"
"fmt"
"io"
"io/ioutil"
"time"
Expand Down Expand Up @@ -72,7 +73,15 @@ func WaitBlock(ctx context.Context, client *ethclient.Client, n uint64) error {
return nil
}

func WaitReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash) (*types.Receipt, error) {
func WaitReceiptOK(ctx context.Context, client *ethclient.Client, hash common.Hash) (*types.Receipt, error) {
return WaitReceipt(ctx, client, hash, types.ReceiptStatusSuccessful)
}

func WaitReceiptFail(ctx context.Context, client *ethclient.Client, hash common.Hash) (*types.Receipt, error) {
return WaitReceipt(ctx, client, hash, types.ReceiptStatusFailed)
}

func WaitReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash, status uint64) (*types.Receipt, error) {
ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop()
for {
Expand All @@ -88,8 +97,8 @@ func WaitReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash
if err != nil {
return nil, err
}
if receipt.Status == types.ReceiptStatusFailed {
return receipt, ErrTransactionFailed
if receipt.Status != status {
return receipt, fmt.Errorf("expected status %d, but got %d", status, receipt.Status)
}
return receipt, nil
}
Expand Down
45 changes: 25 additions & 20 deletions simulators/optimism/l1ops/deposit_tests.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func erc20RoundtripTest(t *hivesim.T, env *optimism.TestEnv) {
// Deploy the ERC20 on L1
l1Opts := l1Vault.KeyedTransactor(depositor)
l1ERC20Addr, tx, l1ERC20, err := hivebindings.DeploySimpleERC20(l1Opts, l1, big.NewInt(1_000_000), "Test L1", 18, "L1")
_, err = optimism.WaitReceipt(env.TimeoutCtx(30*time.Second), l1, tx.Hash())
_, err = optimism.WaitReceiptOK(env.TimeoutCtx(30*time.Second), l1, tx.Hash())
require.NoError(t, err)

// Deposit some ETH onto L2
Expand All @@ -114,7 +114,7 @@ func erc20RoundtripTest(t *hivesim.T, env *optimism.TestEnv) {
factory := env.Devnet.Bindings.BindingsL2.OptimismMintableERC20Factory
tx, err = factory.CreateOptimismMintableERC20(l2Opts, l1ERC20Addr, "Test L1", "L2")
require.NoError(t, err)
receipt, err := optimism.WaitReceipt(env.TimeoutCtx(30*time.Second), l2, tx.Hash())
receipt, err := optimism.WaitReceiptOK(env.TimeoutCtx(30*time.Second), l2, tx.Hash())
var creationEvent *bindings.OptimismMintableERC20FactoryOptimismMintableERC20Created
for _, log := range receipt.Logs {
if log.Topics[0] != optimismMintableERC20CreatedEvent {
Expand All @@ -139,7 +139,7 @@ func erc20RoundtripTest(t *hivesim.T, env *optimism.TestEnv) {
// approve
tx, err = l1ERC20.Approve(l1Opts, predeploys.DevL1StandardBridgeAddr, abi.MaxUint256)
require.NoError(t, err)
_, err = optimism.WaitReceipt(env.TimeoutCtx(30*time.Second), l1, tx.Hash())
_, err = optimism.WaitReceiptOK(env.TimeoutCtx(30*time.Second), l1, tx.Hash())
require.NoError(t, err)

// Remember starting L2 block to find the relay
Expand All @@ -149,7 +149,7 @@ func erc20RoundtripTest(t *hivesim.T, env *optimism.TestEnv) {
// Do the deposit
tx, err = l1SB.DepositERC20(l1Opts, l1ERC20Addr, l2ERC20Addr, big.NewInt(1000), 200_000, nil)
require.NoError(t, err)
receipt, err = optimism.WaitReceipt(env.TimeoutCtx(30*time.Second), l1, tx.Hash())
receipt, err = optimism.WaitReceiptOK(env.TimeoutCtx(30*time.Second), l1, tx.Hash())
require.NoError(t, err)
var l1SentMessage *bindings.L1CrossDomainMessengerSentMessage
for _, log := range receipt.Logs {
Expand Down Expand Up @@ -218,7 +218,7 @@ func erc20RoundtripTest(t *hivesim.T, env *optimism.TestEnv) {
// Perform the withdrawal
tx, err = l2SB.Withdraw(l2Opts, l2ERC20Addr, big.NewInt(500), 0, nil)
require.NoError(t, err)
receipt, err = optimism.WaitReceipt(env.TimeoutCtx(30*time.Second), l2, tx.Hash())
receipt, err = optimism.WaitReceiptOK(env.TimeoutCtx(30*time.Second), l2, tx.Hash())
require.NoError(t, err)

// Await finalization period
Expand Down Expand Up @@ -259,7 +259,7 @@ func erc20RoundtripTest(t *hivesim.T, env *optimism.TestEnv) {
wParams.WithdrawalProof,
)
require.NoError(t, err)
_, err = optimism.WaitReceipt(env.TimeoutCtx(time.Minute), l1, finTx.Hash())
_, err = optimism.WaitReceiptOK(env.TimeoutCtx(time.Minute), l1, finTx.Hash())
require.NoError(t, err)

// Verify L1/L2 balances
Expand Down Expand Up @@ -287,10 +287,9 @@ func failingDepositWithMintTest(t *hivesim.T, env *optimism.TestEnv) {
doDeposit(t, env, depositor, big.NewInt(0.5*params.Ether), false, nil)

// Deploy the failure contract on L2

_, deployTx, failureContract, err := hivebindings.DeployFailure(l2Opts, l2)
require.NoError(t, err)
_, err = optimism.WaitReceipt(env.TimeoutCtx(30*time.Second), l2, deployTx.Hash())
_, err = optimism.WaitReceiptOK(env.TimeoutCtx(30*time.Second), l2, deployTx.Hash())
require.NoError(t, err)

// Create the revert() call
Expand All @@ -299,38 +298,44 @@ func failingDepositWithMintTest(t *hivesim.T, env *optimism.TestEnv) {
revertTx, err := failureContract.Fail(l2Opts)
require.NoError(t, err)

// Create transaction that burns more gas on L2 than allotted
// in the deposit transaction.
l2Opts.GasLimit = 3_000_000
burnTx, err := failureContract.Burn(l2Opts, big.NewInt(2_000_000))
require.NoError(t, err)

// Create garbage data
randData := make([]byte, 32)
_, err = rand.Read(randData)
require.NoError(t, err)

testData := [][]byte{
randData,
revertTx.Data(),
testData := []*types.Transaction{
revertTx,
burnTx,
}
mintAmount := big.NewInt(0.5 * params.Ether)
opts := l1Vault.KeyedTransactor(depositor)
opts.Value = mintAmount
opts.GasLimit = 3_000_000
for _, data := range testData {
for _, testTx := range testData {
startBal, err := l2.BalanceAt(env.Ctx(), depositor, nil)
require.NoError(t, err)
tx, err := depositContract.DepositTransaction(
opts,
depositor,
*testTx.To(),
mintAmount,
1_000_000,
false,
data,
testTx.Data(),
)
require.NoError(t, err)
receipt, err := optimism.WaitReceipt(env.TimeoutCtx(time.Minute), l1, tx.Hash())
receipt, err := optimism.WaitReceiptOK(env.TimeoutCtx(time.Minute), l1, tx.Hash())
require.NoError(t, err)

reconstructedDep, err := derive.UnmarshalDepositLogEvent(receipt.Logs[0])
require.NoError(t, err, "could not reconstruct L2 deposit")
tx = types.NewTx(reconstructedDep)
_, err = optimism.WaitReceipt(env.TimeoutCtx(45*time.Second), l2, tx.Hash())
_, err = optimism.WaitReceiptFail(env.TimeoutCtx(45*time.Second), l2, tx.Hash())
require.NoError(t, err)

endBal, err := l2.BalanceAt(env.Ctx(), depositor, nil)
Expand All @@ -353,23 +358,23 @@ func doDeposit(t *hivesim.T, env *optimism.TestEnv, depositor common.Address, mi
opts.GasLimit = 3_000_000
tx, err := depositContract.DepositTransaction(opts, depositor, common.Big0, 1_000_000, isCreation, data)
require.NoError(t, err)
receipt, err := optimism.WaitReceipt(env.TimeoutCtx(time.Minute), l1, tx.Hash())
receipt, err := optimism.WaitReceiptOK(env.TimeoutCtx(time.Minute), l1, tx.Hash())
require.NoError(t, err)

reconstructedDep, err := derive.UnmarshalDepositLogEvent(receipt.Logs[0])
require.NoError(t, err, "could not reconstruct L2 deposit")
tx = types.NewTx(reconstructedDep)
_, err = optimism.WaitReceipt(env.TimeoutCtx(45*time.Second), l2, tx.Hash())
_, err = optimism.WaitReceiptOK(env.TimeoutCtx(45*time.Second), l2, tx.Hash())
require.NoError(t, err)
}

func awaitDeposit(t *hivesim.T, env *optimism.TestEnv, tx *types.Transaction, l1, l2 *ethclient.Client) *types.Receipt {
receipt, err := optimism.WaitReceipt(env.TimeoutCtx(time.Minute), l1, tx.Hash())
receipt, err := optimism.WaitReceiptOK(env.TimeoutCtx(time.Minute), l1, tx.Hash())
require.NoError(t, err)
reconstructedDep, err := derive.UnmarshalDepositLogEvent(receipt.Logs[0])
require.NoError(t, err, "could not reconstruct L2 deposit")
tx = types.NewTx(reconstructedDep)
receipt, err = optimism.WaitReceipt(env.TimeoutCtx(45*time.Second), l2, tx.Hash())
receipt, err = optimism.WaitReceiptOK(env.TimeoutCtx(45*time.Second), l2, tx.Hash())
require.NoError(t, err)
return receipt
}
Loading