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