diff --git a/bridge-history-api/internal/logic/l1_event_parser.go b/bridge-history-api/internal/logic/l1_event_parser.go index 73687a03f..943955f1c 100644 --- a/bridge-history-api/internal/logic/l1_event_parser.go +++ b/bridge-history-api/internal/logic/l1_event_parser.go @@ -217,7 +217,12 @@ func (e *L1EventParser) ParseL1BatchEventLogs(ctx context.Context, logs []types. } // ParseL1MessageQueueEventLogs parses L1 watched message queue events. -func (e *L1EventParser) ParseL1MessageQueueEventLogs(logs []types.Log) ([]*orm.MessageQueueEvent, error) { +func (e *L1EventParser) ParseL1MessageQueueEventLogs(logs []types.Log, l1DepositMessages []*orm.CrossMessage) ([]*orm.MessageQueueEvent, error) { + messageHashes := make(map[common.Hash]struct{}) + for _, msg := range l1DepositMessages { + messageHashes[common.HexToHash(msg.MessageHash)] = struct{}{} + } + var l1MessageQueueEvents []*orm.MessageQueueEvent for _, vlog := range logs { switch vlog.Topics[0] { @@ -227,14 +232,16 @@ func (e *L1EventParser) ParseL1MessageQueueEventLogs(logs []types.Log) ([]*orm.M log.Warn("Failed to unpack QueueTransaction event", "err", err) return nil, err } - l1MessageQueueEvents = append(l1MessageQueueEvents, &orm.MessageQueueEvent{ - EventType: orm.MessageQueueEventTypeQueueTransaction, - QueueIndex: event.QueueIndex, - - // To update replayMessage's tx hash. - MessageHash: common.BytesToHash(crypto.Keccak256(event.Data)), - TxHash: vlog.TxHash, - }) + messageHash := common.BytesToHash(crypto.Keccak256(event.Data)) + // If the message hash is not found in the map, it's not a replayMessage or enforced tx (omitted); add it to the events. + if _, exists := messageHashes[messageHash]; !exists { + l1MessageQueueEvents = append(l1MessageQueueEvents, &orm.MessageQueueEvent{ + EventType: orm.MessageQueueEventTypeQueueTransaction, + QueueIndex: event.QueueIndex, + MessageHash: messageHash, + TxHash: vlog.TxHash, + }) + } case backendabi.L1DequeueTransactionEventSig: event := backendabi.L1DequeueTransactionEvent{} if err := utils.UnpackLog(backendabi.IL1MessageQueueABI, &event, "DequeueTransaction", vlog); err != nil { diff --git a/bridge-history-api/internal/logic/l1_fetcher.go b/bridge-history-api/internal/logic/l1_fetcher.go index 5f163a3ec..99e74a938 100644 --- a/bridge-history-api/internal/logic/l1_fetcher.go +++ b/bridge-history-api/internal/logic/l1_fetcher.go @@ -193,7 +193,7 @@ func (f *L1FetcherLogic) L1Fetcher(ctx context.Context, from, to uint64) (*L1Fil return nil, err } - l1MessageQueueEvents, err := f.parser.ParseL1MessageQueueEventLogs(eventLogs) + l1MessageQueueEvents, err := f.parser.ParseL1MessageQueueEventLogs(eventLogs, l1DepositMessages) if err != nil { log.Error("failed to parse L1 message queue event logs", "from", from, "to", to, "err", err) return nil, err diff --git a/bridge-history-api/internal/orm/cross_message.go b/bridge-history-api/internal/orm/cross_message.go index 13e984766..a7bbd8d39 100644 --- a/bridge-history-api/internal/orm/cross_message.go +++ b/bridge-history-api/internal/orm/cross_message.go @@ -245,7 +245,7 @@ func (c *CrossMessage) UpdateL1MessageQueueEventsInfo(ctx context.Context, l1Mes switch l1MessageQueueEvent.EventType { case MessageQueueEventTypeQueueTransaction: // Update l1_tx_hash if the user calls replayMessage, cannot use queue index here. - // ref: https://github.com/scroll-tech/scroll/blob/v4.3.44/contracts/src/L1/L1ScrollMessenger.sol#L187-L190 + // Ref: https://github.com/scroll-tech/scroll/blob/v4.3.44/contracts/src/L1/L1ScrollMessenger.sol#L187-L190 db = db.Where("message_hash = ?", l1MessageQueueEvent.MessageHash.String()) updateFields["l1_tx_hash"] = l1MessageQueueEvent.TxHash.String() case MessageQueueEventTypeDequeueTransaction: