This repository has been archived by the owner on May 9, 2024. It is now read-only.
/
listener.go
64 lines (51 loc) 路 1.66 KB
/
listener.go
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
package events
import (
"context"
"math/big"
"strings"
"github.com/ChainSafe/chainbridge-core/chains/evm/calls/consts"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
ethTypes "github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog/log"
)
type ChainClient interface {
FetchEventLogs(ctx context.Context, contractAddress common.Address, event string, startBlock *big.Int, endBlock *big.Int) ([]ethTypes.Log, error)
}
type Listener struct {
client ChainClient
abi abi.ABI
}
func NewListener(client ChainClient) *Listener {
abi, _ := abi.JSON(strings.NewReader(consts.BridgeABI))
return &Listener{
client: client,
abi: abi,
}
}
func (l *Listener) FetchDeposits(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]*Deposit, error) {
logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(DepositSig), startBlock, endBlock)
if err != nil {
return nil, err
}
deposits := make([]*Deposit, 0)
for _, dl := range logs {
d, err := l.UnpackDeposit(l.abi, dl.Data)
if err != nil {
log.Error().Msgf("failed unpacking deposit event log: %v", err)
continue
}
d.SenderAddress = common.BytesToAddress(dl.Topics[1].Bytes())
log.Debug().Msgf("Found deposit log in block: %d, TxHash: %s, contractAddress: %s, sender: %s", dl.BlockNumber, dl.TxHash, dl.Address, d.SenderAddress)
deposits = append(deposits, d)
}
return deposits, nil
}
func (l *Listener) UnpackDeposit(abi abi.ABI, data []byte) (*Deposit, error) {
var dl Deposit
err := abi.UnpackIntoInterface(&dl, "Deposit", data)
if err != nil {
return &Deposit{}, err
}
return &dl, nil
}