Skip to content

Commit

Permalink
op-node: make withdrawal tooling more resilient
Browse files Browse the repository at this point in the history
  • Loading branch information
tynes committed Aug 1, 2022
1 parent 2c43ccb commit 55e195f
Showing 1 changed file with 53 additions and 5 deletions.
58 changes: 53 additions & 5 deletions op-node/withdrawals/utils.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package withdrawals

import (
"bytes"
"context"
"errors"
"fmt"
Expand Down Expand Up @@ -172,8 +173,15 @@ func FinalizeWithdrawalParameters(ctx context.Context, l2client ProofClient, txH
if err != nil {
return FinalizedWithdrawalParameters{}, err
}
ev1, err := ParseWithdrawalInitiatedExtension1(receipt)
if err != nil {
return FinalizedWithdrawalParameters{}, err
}
// Generate then verify the withdrawal proof
withdrawalHash, err := WithdrawalHash(ev)
if !bytes.Equal(withdrawalHash[:], ev1.Hash[:]) {
return FinalizedWithdrawalParameters{}, errors.New("Computed withdrawal hash incorrectly")
}
if err != nil {
return FinalizedWithdrawalParameters{}, err
}
Expand Down Expand Up @@ -255,14 +263,54 @@ func ParseWithdrawalInitiated(receipt *types.Receipt) (*bindings.L2ToL1MessagePa
if err != nil {
return nil, err
}
if len(receipt.Logs) != 1 {
return nil, errors.New("invalid length of logs")
abi, err := bindings.L2ToL1MessagePasserMetaData.GetAbi()
if err != nil {
return nil, err
}
ev, err := contract.ParseWithdrawalInitiated(*receipt.Logs[0])

for _, log := range receipt.Logs {
topic := log.Topics[0]
event, err := abi.EventByID(topic)
if err != nil {
return nil, err
}
if event.Name == "ParseWithdrawalInitiated" {
ev, err := contract.ParseWithdrawalInitiated(*log)
if err != nil {
return nil, fmt.Errorf("failed to parse log: %w", err)
}
return ev, nil
}
}
return nil, errors.New("Unable to find WithdrawalInitiated event")
}

// ParseWithdrawalInitiatedExtension1 parses
func ParseWithdrawalInitiatedExtension1(receipt *types.Receipt) (*bindings.L2ToL1MessagePasserWithdrawalInitiatedExtension1, error) {
contract, err := bindings.NewL2ToL1MessagePasser(common.Address{}, nil)
if err != nil {
return nil, err
}
abi, err := bindings.L2ToL1MessagePasserMetaData.GetAbi()
if err != nil {
return nil, fmt.Errorf("failed to parse log: %w", err)
return nil, err
}

for _, log := range receipt.Logs {
topic := log.Topics[0]
event, err := abi.EventByID(topic)
if err != nil {
return nil, err
}
if event.Name == "ParseWithdrawalInitiatedExtension1" {
ev, err := contract.ParseWithdrawalInitiatedExtension1(*log)
if err != nil {
return nil, fmt.Errorf("failed to parse log: %w", err)
}
return ev, nil
}
}
return ev, nil
return nil, errors.New("Unable to find WithdrawalInitiatedExtension1 event")
}

// StorageSlotOfWithdrawalHash determines the storage slot of the Withdrawer contract to look at
Expand Down

0 comments on commit 55e195f

Please sign in to comment.