diff --git a/optimism/devnet.go b/optimism/devnet.go index 3220827ea7..8dc9057e69 100644 --- a/optimism/devnet.go +++ b/optimism/devnet.go @@ -519,18 +519,13 @@ func StartSequencerDevnet(ctx context.Context, d *Devnet, params *SequencerDevne d.AddOpBatcher(0, 0, 0) d.AddOpProposer(0, 0, 0) - block, err := d.L1Client(0).BlockByNumber(ctx, nil) - if err != nil { - return err - } - expHeight := uint64(time.Now().Sub(time.Unix(int64(block.Time()), 0)).Seconds() / 2) - if err := WaitBlock(ctx, d.L2Client(0), expHeight); err != nil { - return err - } - d.InitBindingsL1(0) d.InitBindingsL2(0) + if err := WaitBlock(ctx, d.L1Client(0), 2); err != nil { + return err + } + return nil } diff --git a/optimism/helper.go b/optimism/helper.go index 286a0462d7..4270aad4b2 100644 --- a/optimism/helper.go +++ b/optimism/helper.go @@ -4,16 +4,19 @@ import ( "bytes" "context" "errors" + "io" + "io/ioutil" + "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/hive/hivesim" - "io" - "io/ioutil" - "time" ) +var ErrTransactionFailed = errors.New("transaction failed") + func BytesFile(name string, data []byte) hivesim.StartOption { return hivesim.WithDynamicFile(name, func() (io.ReadCloser, error) { return ioutil.NopCloser(bytes.NewReader(data)), nil @@ -74,16 +77,20 @@ func WaitReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash defer ticker.Stop() for { receipt, err := client.TransactionReceipt(ctx, hash) - if receipt != nil && err == nil { - return receipt, nil - } else if err != nil && !errors.Is(err, ethereum.NotFound) { + if errors.Is(err, ethereum.NotFound) { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-ticker.C: + continue + } + } + if err != nil { return nil, err } - - select { - case <-ctx.Done(): - return nil, ctx.Err() - case <-ticker.C: + if receipt.Status == types.ReceiptStatusFailed { + return receipt, ErrTransactionFailed } + return receipt, nil } } diff --git a/simulators/optimism/l1ops/deposit_tests.go b/simulators/optimism/l1ops/deposit_tests.go index bacaca334f..b18584623d 100644 --- a/simulators/optimism/l1ops/deposit_tests.go +++ b/simulators/optimism/l1ops/deposit_tests.go @@ -52,7 +52,11 @@ func contractPortalDepositTest(t *hivesim.T, env *optimism.TestEnv) { require.NoError(t, err) l1Opts := l1Vault.KeyedTransactor(depositor) - l1Opts.Value = big.NewInt(0.1 * params.Ether) + l1Opts.Value = big.NewInt(0.5 * params.Ether) + // Set a high gas limit to prevent reverts. The gas limit + // can sometimes be off by a bit as a result of the resource + // metering code. + l1Opts.GasLimit = 3_000_000 portal := env.Devnet.Bindings.BindingsL1.OptimismPortal tx, err := portal.DepositTransaction(l1Opts, common.Address{}, common.Big0, 1_000_000, true, deployTx.Data()) @@ -83,6 +87,11 @@ func doDeposit(t *hivesim.T, env *optimism.TestEnv, depositor common.Address, mi l1Vault := env.Devnet.L1Vault opts := l1Vault.KeyedTransactor(depositor) opts.Value = mintAmount + + // Set a high gas limit to prevent reverts. The gas limit + // can sometimes be off by a bit as a result of the resource + // metering code. + opts.GasLimit = 3_000_000 tx, err := depositContract.DepositTransaction(opts, depositor, common.Big0, 1_000_000, false, nil) require.NoError(t, err) receipt, err := optimism.WaitReceipt(env.TimeoutCtx(time.Minute), l1, tx.Hash()) @@ -91,9 +100,8 @@ func doDeposit(t *hivesim.T, env *optimism.TestEnv, depositor common.Address, mi 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()) + _, err = optimism.WaitReceipt(env.TimeoutCtx(45*time.Second), l2, tx.Hash()) require.NoError(t, err) - require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) } func awaitDeposit(t *hivesim.T, env *optimism.TestEnv, tx *types.Transaction, l1, l2 *ethclient.Client) *types.Receipt { @@ -104,6 +112,5 @@ func awaitDeposit(t *hivesim.T, env *optimism.TestEnv, tx *types.Transaction, l1 tx = types.NewTx(reconstructedDep) receipt, err = optimism.WaitReceipt(env.TimeoutCtx(45*time.Second), l2, tx.Hash()) require.NoError(t, err) - require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) return receipt }