wormhole/node/pkg/watchers/evm/finalizers/arbitrum.go

47 lines
1.2 KiB
Go

package finalizers
import (
"context"
"fmt"
"github.com/certusone/wormhole/node/pkg/watchers/evm/connectors"
"github.com/certusone/wormhole/node/pkg/watchers/interfaces"
"go.uber.org/zap"
)
// ArbitrumFinalizer implements the finality check for Arbitrum.
// Arbitrum blocks should not be considered finalized until they are finalized on Ethereum.
type ArbitrumFinalizer struct {
logger *zap.Logger
l1Finalizer interfaces.L1Finalizer
}
func NewArbitrumFinalizer(logger *zap.Logger, l1Finalizer interfaces.L1Finalizer) *ArbitrumFinalizer {
return &ArbitrumFinalizer{
logger: logger,
l1Finalizer: l1Finalizer,
}
}
// IsBlockFinalized compares the number of the L1 block containing the Arbitrum block with the latest finalized block on Ethereum.
func (a *ArbitrumFinalizer) IsBlockFinalized(ctx context.Context, block *connectors.NewBlock) (bool, error) {
if block == nil {
return false, fmt.Errorf("block is nil")
}
if block.L1BlockNumber == nil {
return false, fmt.Errorf("l1 block number is nil")
}
latestL1Block := a.l1Finalizer.GetLatestFinalizedBlockNumber()
if latestL1Block == 0 {
// This happens on start up.
return false, nil
}
isFinalized := block.L1BlockNumber.Uint64() <= latestL1Block
return isFinalized, nil
}