ethergo/examples/usdclistener/main.go
package main
import (
"context"
"errors"
"fmt"
"log"
"github.com/synapsecns/sanguine/ethergo/client"
listenerDB "github.com/synapsecns/sanguine/ethergo/listener/db"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/synapsecns/sanguine/core/metrics"
"github.com/synapsecns/sanguine/ethergo/listener"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
const (
ethereumNodeURL = "https://eth.llamarpc.com" // Replace with your Ethereum node URL
contractAddress = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" // Replace with the contract address you want to listen to
dbPath = ":memory:"
initialBlock = 0 // Replace with the block number you want to start listening from
startBlock = 20612563
)
func main() {
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
err = db.AutoMigrate(listenerDB.GetAllModels()...)
if err != nil {
log.Fatalf("Failed to migrate database: %v", err)
}
// Create a simple metrics handler (you may want to implement a proper one)
metricsHandler := metrics.NewNullHandler()
store := listenerDB.NewChainListenerStore(db, metricsHandler)
_, err = store.LatestBlockForChain(context.Background(), 1)
if err != nil {
if !errors.Is(err, listenerDB.ErrNoLatestBlockForChainID) {
log.Fatalf("Failed to get latest block: %v", err)
}
// pick a reasonable start block, will default to 0.
err = store.PutLatestBlock(context.Background(), 1, startBlock)
if err != nil {
log.Fatalf("Failed to put latest block): %v", err)
}
}
ethClient, err := client.DialBackend(context.Background(), ethereumNodeURL, metricsHandler)
if err != nil {
log.Fatalf("Failed to connect to Ethereum node: %v", err)
}
contractAddr := common.HexToAddress(contractAddress)
chainListener, err := listener.NewChainListener(
ethClient,
store,
contractAddr,
uint64(initialBlock),
metricsHandler,
)
if err != nil {
log.Fatalf("Failed to create chain listener: %v", err)
}
ctx := context.Background()
fmt.Println("Starting listener...")
err = chainListener.Listen(ctx, handleLog)
if err != nil {
log.Fatalf("Listener error: %v", err)
}
}
func handleLog(_ context.Context, log types.Log) error {
fmt.Printf("New log: BlockNumber=%d, TxHash=%s\n", log.BlockNumber, log.TxHash.Hex())
// Here you can process the log as needed
return nil
}