-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlogFilter.go
More file actions
101 lines (93 loc) · 4.16 KB
/
logFilter.go
File metadata and controls
101 lines (93 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package handler
import (
"context"
"math/big"
"strings"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/optimism-java/dispute-explorer/internal/blockchain"
"github.com/optimism-java/dispute-explorer/internal/schema"
"github.com/optimism-java/dispute-explorer/internal/svc"
"github.com/optimism-java/dispute-explorer/pkg/event"
"github.com/optimism-java/dispute-explorer/pkg/log"
"github.com/pkg/errors"
"github.com/spf13/cast"
)
func LogFilter(ctx *svc.ServiceContext, block schema.SyncBlock, addresses []common.Address, topics [][]common.Hash) ([]*schema.SyncEvent, error) {
query := ethereum.FilterQuery{
FromBlock: big.NewInt(block.BlockNumber),
ToBlock: big.NewInt(block.BlockNumber),
Topics: topics,
Addresses: addresses,
}
// use unified RPC manager to filter logs (automatically applies rate limiting)
logs, err := ctx.RPCManager.FilterLogs(context.Background(), query, true) // true indicates L1
if err != nil {
return nil, errors.WithStack(err)
}
log.Debugf("[LogFilter] Event logs length is %d, block number is %d (via RPC Manager)\n", len(logs), block.BlockNumber)
return LogsToEvents(ctx, logs, block.ID)
}
func LogsToEvents(ctx *svc.ServiceContext, logs []types.Log, syncBlockID int64) ([]*schema.SyncEvent, error) {
events := []*schema.SyncEvent{}
blockTimes := make(map[int64]int64)
for _, vlog := range logs {
eventHash := event.TopicToHash(vlog, 0)
contractAddress := vlog.Address
Event := blockchain.GetEvent(eventHash)
if Event == nil {
log.Debugf("[LogsToEvents] logs[txHash: %s, contractAddress:%s, eventHash: %s]\n", vlog.TxHash, strings.ToLower(contractAddress.Hex()), eventHash)
continue
}
blockTime := blockTimes[cast.ToInt64(vlog.BlockNumber)]
if blockTime == 0 {
blockNumber := cast.ToInt64(vlog.BlockNumber)
log.Debugf("[LogsToEvents] Fetching block info for block number: %d, txHash: %s", blockNumber, vlog.TxHash.Hex())
// Use unified RPC manager to get block (automatically applies rate limiting)
block, err := ctx.RPCManager.GetBlockByNumber(context.Background(), big.NewInt(blockNumber), true) // true indicates L1
if err != nil {
log.Errorf("[LogsToEvents] GetBlockByNumber failed for block %d, txHash: %s, error: %s (via RPC Manager)", blockNumber, vlog.TxHash.Hex(), err.Error())
// If error contains "transaction type not supported", try alternative approach
if strings.Contains(err.Error(), "transaction type not supported") {
log.Infof("[LogsToEvents] Attempting to get block timestamp using header only for block %d", blockNumber)
header, headerErr := ctx.RPCManager.HeaderByNumber(context.Background(), big.NewInt(blockNumber), true) // true indicates L1
if headerErr != nil {
log.Errorf("[LogsToEvents] HeaderByNumber also failed for block %d: %s (via RPC Manager)", blockNumber, headerErr.Error())
return nil, errors.WithStack(err)
}
blockTime = cast.ToInt64(header.Time)
blockTimes[blockNumber] = blockTime
log.Infof("[LogsToEvents] Successfully got block timestamp %d for block %d using header (via RPC Manager)", blockTime, blockNumber)
} else {
return nil, errors.WithStack(err)
}
} else {
blockTime = cast.ToInt64(block.Time())
blockTimes[blockNumber] = blockTime
}
}
data, err := Event.Data(vlog)
if err != nil {
log.Errorf("[LogsToEvents] logs[txHash: %s, contractAddress:%s, eventHash: %s]\n", vlog.TxHash, strings.ToLower(contractAddress.Hex()), eventHash)
log.Errorf("[LogsToEvents] data err: %s\n", errors.WithStack(err))
continue
}
events = append(events, &schema.SyncEvent{
Blockchain: ctx.Config.Blockchain,
SyncBlockID: syncBlockID,
BlockTime: blockTime,
BlockNumber: cast.ToInt64(vlog.BlockNumber),
BlockHash: vlog.BlockHash.Hex(),
BlockLogIndexed: cast.ToInt64(vlog.Index),
TxIndex: cast.ToInt64(vlog.TxIndex),
TxHash: vlog.TxHash.Hex(),
EventName: Event.Name(),
EventHash: eventHash.Hex(),
ContractAddress: strings.ToLower(contractAddress.Hex()),
Data: data,
Status: schema.EventPending,
})
}
return events, nil
}