Commit 7642d54f authored by Adrian Sutton's avatar Adrian Sutton Committed by GitHub

op-e2e: Load logs from the receipts instead of rescanning entire chain (#8739)

Avoids flakiness if the client's event index hasn't been updated yet.
parent 90afc7af
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys" "github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/receipts"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-node/rollup/derive"
...@@ -63,17 +64,11 @@ func TestERC20BridgeDeposits(t *testing.T) { ...@@ -63,17 +64,11 @@ func TestERC20BridgeDeposits(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
tx, err = optimismMintableTokenFactory.CreateOptimismMintableERC20(l2Opts, weth9Address, "L2-WETH", "L2-WETH") tx, err = optimismMintableTokenFactory.CreateOptimismMintableERC20(l2Opts, weth9Address, "L2-WETH", "L2-WETH")
require.NoError(t, err) require.NoError(t, err)
_, err = wait.ForReceiptOK(context.Background(), l2Client, tx.Hash()) rcpt, err := wait.ForReceiptOK(context.Background(), l2Client, tx.Hash())
require.NoError(t, err) require.NoError(t, err)
// Get the deployment event to have access to the L2 WETH9 address event, err := receipts.FindLog(rcpt.Logs, optimismMintableTokenFactory.ParseOptimismMintableERC20Created)
it, err := optimismMintableTokenFactory.FilterOptimismMintableERC20Created(&bind.FilterOpts{Start: 0}, nil, nil) require.NoError(t, err, "Should emit ERC20Created event")
require.NoError(t, err)
var event *bindings.OptimismMintableERC20FactoryOptimismMintableERC20Created
for it.Next() {
event = it.Event
}
require.NotNil(t, event)
// Approve WETH9 with the bridge // Approve WETH9 with the bridge
tx, err = WETH9.Approve(opts, cfg.L1Deployments.L1StandardBridgeProxy, new(big.Int).SetUint64(math.MaxUint64)) tx, err = WETH9.Approve(opts, cfg.L1Deployments.L1StandardBridgeProxy, new(big.Int).SetUint64(math.MaxUint64))
...@@ -97,13 +92,8 @@ func TestERC20BridgeDeposits(t *testing.T) { ...@@ -97,13 +92,8 @@ func TestERC20BridgeDeposits(t *testing.T) {
portal, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) portal, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client)
require.NoError(t, err) require.NoError(t, err)
depIt, err := portal.FilterTransactionDeposited(&bind.FilterOpts{Start: 0}, nil, nil, nil) depositEvent, err := receipts.FindLog(depositReceipt.Logs, portal.ParseTransactionDeposited)
require.NoError(t, err) require.NoError(t, err, "Should emit deposit event")
var depositEvent *bindings.OptimismPortalTransactionDeposited
for depIt.Next() {
depositEvent = depIt.Event
}
require.NotNil(t, depositEvent)
depositTx, err := derive.UnmarshalDepositLogEvent(&depositEvent.Raw) depositTx, err := derive.UnmarshalDepositLogEvent(&depositEvent.Raw)
require.NoError(t, err) require.NoError(t, err)
......
package receipts
import (
"errors"
"fmt"
"github.com/ethereum/go-ethereum/core/types"
)
// FindLog searches the array of logs (typically retrieved from a receipt) to find one that can be parsed by the
// supplied parser (usually the Parse<EventName> function from generated bindings for a contract).
// e.g. receipts.FindLog(receipt.Logs, optimismPortal.ParseTransactionDeposited)
// Either the first parsable event is returned or an error with the parse failures.
func FindLog[T any](logs []*types.Log, parser func(types.Log) (T, error)) (T, error) {
var errs error
for i, l := range logs {
parsed, err := parser(*l)
if err == nil {
return parsed, nil
}
errs = errors.Join(errs, fmt.Errorf("parse log %v: %w", i, err))
}
var noMatch T
return noMatch, fmt.Errorf("no matching log found: %w", errs)
}
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