mirror of
https://github.com/grassrootseconomics/eth-tracker.git
synced 2025-04-20 23:41:03 +02:00
feat: add NATS JetStream
This commit is contained in:
parent
8a4c56c56a
commit
1a49f07db6
@ -16,8 +16,8 @@ import (
|
|||||||
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/chain"
|
"github.com/grassrootseconomics/celo-tracker/internal/chain"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/db"
|
"github.com/grassrootseconomics/celo-tracker/internal/db"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/processor"
|
"github.com/grassrootseconomics/celo-tracker/internal/processor"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/stats"
|
"github.com/grassrootseconomics/celo-tracker/internal/stats"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/syncer"
|
"github.com/grassrootseconomics/celo-tracker/internal/syncer"
|
||||||
"github.com/knadh/koanf/v2"
|
"github.com/knadh/koanf/v2"
|
||||||
@ -121,9 +121,16 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultEmitter := emitter.New(emitter.EmitterOpts{
|
jetStreamPub, err := pub.NewJetStreamPub(pub.JetStreamOpts{
|
||||||
|
Endpoint: ko.MustString("jetstream.endpoint"),
|
||||||
|
PersistDuration: time.Duration(ko.MustInt("jetstream.persist_duration_hrs")) * time.Hour,
|
||||||
|
DedupDuration: time.Duration(ko.MustInt("jetstream.dedup_duration_hrs")) * time.Hour,
|
||||||
Logg: lo,
|
Logg: lo,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
lo.Error("could not initialize jetstream pub", "error", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
blockProcessor := processor.NewProcessor(processor.ProcessorOpts{
|
blockProcessor := processor.NewProcessor(processor.ProcessorOpts{
|
||||||
Chain: chain,
|
Chain: chain,
|
||||||
@ -132,7 +139,7 @@ func main() {
|
|||||||
Stats: stats,
|
Stats: stats,
|
||||||
DB: db,
|
DB: db,
|
||||||
Cache: cache,
|
Cache: cache,
|
||||||
Emitter: defaultEmitter,
|
Pub: jetStreamPub,
|
||||||
})
|
})
|
||||||
|
|
||||||
if ko.Bool("chain.historical") {
|
if ko.Bool("chain.historical") {
|
||||||
@ -168,6 +175,7 @@ func main() {
|
|||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
blockProcessor.Stop()
|
blockProcessor.Stop()
|
||||||
|
jetStreamPub.Close()
|
||||||
chainSyncer.StopHistoricalSyncer()
|
chainSyncer.StopHistoricalSyncer()
|
||||||
chainSyncer.StopRealtime()
|
chainSyncer.StopRealtime()
|
||||||
}()
|
}()
|
||||||
|
10
config.toml
10
config.toml
@ -9,7 +9,7 @@ ws_endpoint = "wss://ws.celo.grassecon.net"
|
|||||||
rpc_endpoint = "https://celo.grassecon.net"
|
rpc_endpoint = "https://celo.grassecon.net"
|
||||||
testnet = false
|
testnet = false
|
||||||
realtime = true
|
realtime = true
|
||||||
historical = true
|
historical = false
|
||||||
start_block = 25151040
|
start_block = 25151040
|
||||||
batch_size = 100
|
batch_size = 100
|
||||||
|
|
||||||
@ -20,4 +20,10 @@ ge_registries = [
|
|||||||
"0x0cc9f4fff962def35bb34a53691180b13e653030",
|
"0x0cc9f4fff962def35bb34a53691180b13e653030",
|
||||||
]
|
]
|
||||||
watchlist = [""]
|
watchlist = [""]
|
||||||
blacklist = ["0x765DE816845861e75A25fCA122bb6898B8B1282a"]
|
blacklist = [""]
|
||||||
|
|
||||||
|
[jetstream]
|
||||||
|
enable = true
|
||||||
|
endpoint = "nats://127.0.0.1:4222"
|
||||||
|
persist_duration_hrs = 48
|
||||||
|
dedup_duration_hrs = 6
|
||||||
|
8
dev/docker-compose.yaml
Normal file
8
dev/docker-compose.yaml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
services:
|
||||||
|
nats:
|
||||||
|
image: nats:2
|
||||||
|
restart: unless-stopped
|
||||||
|
command: -js -sd /tmp/nats/data -m 8222
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:4222:4222
|
||||||
|
- 127.0.0.1:8222:8222
|
5
go.mod
5
go.mod
@ -53,12 +53,15 @@ require (
|
|||||||
github.com/holiman/uint256 v1.2.4 // indirect
|
github.com/holiman/uint256 v1.2.4 // indirect
|
||||||
github.com/huin/goupnp v1.0.3 // indirect
|
github.com/huin/goupnp v1.0.3 // indirect
|
||||||
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
||||||
github.com/klauspost/compress v1.12.3 // indirect
|
github.com/klauspost/compress v1.17.2 // indirect
|
||||||
github.com/knadh/koanf/maps v0.1.1 // indirect
|
github.com/knadh/koanf/maps v0.1.1 // indirect
|
||||||
github.com/lmittmann/tint v1.0.4 // indirect
|
github.com/lmittmann/tint v1.0.4 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.14 // indirect
|
github.com/mattn/go-runewidth v0.0.14 // indirect
|
||||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
||||||
|
github.com/nats-io/nats.go v1.34.1 // indirect
|
||||||
|
github.com/nats-io/nkeys v0.4.7 // indirect
|
||||||
|
github.com/nats-io/nuid v1.0.1 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/onsi/gomega v1.10.1 // indirect
|
github.com/onsi/gomega v1.10.1 // indirect
|
||||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
|
8
go.sum
8
go.sum
@ -325,6 +325,8 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6
|
|||||||
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU=
|
github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU=
|
||||||
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
|
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
|
||||||
|
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||||
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
|
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
|
||||||
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
@ -392,6 +394,12 @@ github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE
|
|||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
|
github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
|
||||||
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
|
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
|
||||||
|
github.com/nats-io/nats.go v1.34.1 h1:syWey5xaNHZgicYBemv0nohUPPmaLteiBEUT6Q5+F/4=
|
||||||
|
github.com/nats-io/nats.go v1.34.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
|
||||||
|
github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
|
||||||
|
github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
|
||||||
|
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
|
||||||
|
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||||
|
2
internal/cache/cache.go
vendored
2
internal/cache/cache.go
vendored
@ -58,7 +58,7 @@ func New(o CacheOpts) (Cache, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// We only watch the token and pool indexes
|
// We only watch the token and pool indexes
|
||||||
// If at some point we want to eatch the user index, this line should be removed
|
// If at some point we want to watch the user index, this line should be removed
|
||||||
cache.SetWatchableIndex(watchableIndex)
|
cache.SetWatchableIndex(watchableIndex)
|
||||||
|
|
||||||
for _, address := range o.Watchlist {
|
for _, address := range o.Watchlist {
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
package emitter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"log/slog"
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
ConsoleEmitter struct {
|
|
||||||
logg *slog.Logger
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewConsoleEmitter(logg *slog.Logger) *ConsoleEmitter {
|
|
||||||
return &ConsoleEmitter{
|
|
||||||
logg: logg,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *ConsoleEmitter) Emit(_ context.Context, payload interface{}) error {
|
|
||||||
jsonData, err := json.Marshal(payload)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
l.logg.Info("emitted event", "json_payload", string(jsonData))
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
package emitter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log/slog"
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
Emitter interface {
|
|
||||||
Emit(context.Context, interface{}) error
|
|
||||||
}
|
|
||||||
|
|
||||||
EmitterOpts struct {
|
|
||||||
Logg *slog.Logger
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func New(o EmitterOpts) Emitter {
|
|
||||||
return NewConsoleEmitter(o.Logg)
|
|
||||||
}
|
|
24
internal/event/event.go
Normal file
24
internal/event/event.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package event
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
|
type (
|
||||||
|
Event struct {
|
||||||
|
Block uint64 `json:"block"`
|
||||||
|
ContractAddress string `json:"contractAddress"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
Timestamp uint64 `json:"timestamp"`
|
||||||
|
TxHash string `json:"transactionHash"`
|
||||||
|
TxType string `json:"transactionType"`
|
||||||
|
Payload map[string]any `json:"payload"`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (e Event) Serialize() ([]byte, error) {
|
||||||
|
jsonData, err := json.Marshal(e)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonData, err
|
||||||
|
}
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ func (h *FaucetGiveHandler) Name() string {
|
|||||||
return faucetGiveEventName
|
return faucetGiveEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *FaucetGiveHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *FaucetGiveHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == faucetGiveTopicHash {
|
if msg.Log.Topics[0] == faucetGiveTopicHash {
|
||||||
var (
|
var (
|
||||||
recipient common.Address
|
recipient common.Address
|
||||||
@ -43,7 +44,7 @@ func (h *FaucetGiveHandler) HandleLog(ctx context.Context, msg LogMessage, emitt
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
faucetGiveEvent := Event{
|
faucetGiveEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -57,13 +58,13 @@ func (h *FaucetGiveHandler) HandleLog(ctx context.Context, msg LogMessage, emitt
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, faucetGiveEvent)
|
return pub.Send(ctx, faucetGiveEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *FaucetGiveHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *FaucetGiveHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -78,7 +79,7 @@ func (h *FaucetGiveHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
faucetGiveEvent := Event{
|
faucetGiveEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -93,9 +94,9 @@ func (h *FaucetGiveHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, faucetGiveEvent)
|
return pub.Send(ctx, faucetGiveEvent)
|
||||||
case "de82efb4":
|
case "de82efb4":
|
||||||
faucetGiveEvent := Event{
|
faucetGiveEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -110,7 +111,7 @@ func (h *FaucetGiveHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, faucetGiveEvent)
|
return pub.Send(ctx, faucetGiveEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,14 +5,14 @@ import (
|
|||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/core/types"
|
"github.com/celo-org/celo-blockchain/core/types"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
Handler interface {
|
Handler interface {
|
||||||
Name() string
|
Name() string
|
||||||
HandleLog(context.Context, LogMessage, emitter.Emitter) error
|
HandleLog(context.Context, LogMessage, pub.Pub) error
|
||||||
HandleRevert(context.Context, RevertMessage, emitter.Emitter) error
|
HandleRevert(context.Context, RevertMessage, pub.Pub) error
|
||||||
}
|
}
|
||||||
|
|
||||||
LogMessage struct {
|
LogMessage struct {
|
||||||
@ -29,16 +29,6 @@ type (
|
|||||||
Timestamp uint64
|
Timestamp uint64
|
||||||
TxHash string
|
TxHash string
|
||||||
}
|
}
|
||||||
|
|
||||||
Event struct {
|
|
||||||
Block uint64 `json:"block"`
|
|
||||||
ContractAddress string `json:"contractAddress"`
|
|
||||||
Success bool `json:"success"`
|
|
||||||
Timestamp uint64 `json:"timestamp"`
|
|
||||||
TxHash string `json:"transactionHash"`
|
|
||||||
TxType string `json:"transactionType"`
|
|
||||||
Payload map[string]any `json:"payload"`
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(cache cache.Cache) []Handler {
|
func New(cache cache.Cache) []Handler {
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ func (h *IndexAddHandler) Name() string {
|
|||||||
return indexAddEventName
|
return indexAddEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *IndexAddHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *IndexAddHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == indexAddTopicHash {
|
if msg.Log.Topics[0] == indexAddTopicHash {
|
||||||
var (
|
var (
|
||||||
address common.Address
|
address common.Address
|
||||||
@ -42,7 +43,7 @@ func (h *IndexAddHandler) HandleLog(ctx context.Context, msg LogMessage, emitter
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
indexAddEvent := Event{
|
indexAddEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -58,13 +59,13 @@ func (h *IndexAddHandler) HandleLog(ctx context.Context, msg LogMessage, emitter
|
|||||||
h.cache.Add(address.Hex())
|
h.cache.Add(address.Hex())
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, indexAddEvent)
|
return pub.Send(ctx, indexAddEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *IndexAddHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *IndexAddHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -79,7 +80,7 @@ func (h *IndexAddHandler) HandleRevert(ctx context.Context, msg RevertMessage, e
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
indexAddEvent := Event{
|
indexAddEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -92,7 +93,7 @@ func (h *IndexAddHandler) HandleRevert(ctx context.Context, msg RevertMessage, e
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, indexAddEvent)
|
return pub.Send(ctx, indexAddEvent)
|
||||||
case "4420e486":
|
case "4420e486":
|
||||||
var (
|
var (
|
||||||
address common.Address
|
address common.Address
|
||||||
@ -102,7 +103,7 @@ func (h *IndexAddHandler) HandleRevert(ctx context.Context, msg RevertMessage, e
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
indexAddEvent := Event{
|
indexAddEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -115,7 +116,7 @@ func (h *IndexAddHandler) HandleRevert(ctx context.Context, msg RevertMessage, e
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, indexAddEvent)
|
return pub.Send(ctx, indexAddEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ func (h *IndexRemoveHandler) Name() string {
|
|||||||
return indexRemoveEventName
|
return indexRemoveEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *IndexRemoveHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *IndexRemoveHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == indexRemoveTopicHash {
|
if msg.Log.Topics[0] == indexRemoveTopicHash {
|
||||||
var (
|
var (
|
||||||
address common.Address
|
address common.Address
|
||||||
@ -41,7 +42,7 @@ func (h *IndexRemoveHandler) HandleLog(ctx context.Context, msg LogMessage, emit
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
indexRemoveEvent := Event{
|
indexRemoveEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -57,13 +58,13 @@ func (h *IndexRemoveHandler) HandleLog(ctx context.Context, msg LogMessage, emit
|
|||||||
h.cache.Remove(address.Hex())
|
h.cache.Remove(address.Hex())
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, indexRemoveEvent)
|
return pub.Send(ctx, indexRemoveEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *IndexRemoveHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *IndexRemoveHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -78,7 +79,7 @@ func (h *IndexRemoveHandler) HandleRevert(ctx context.Context, msg RevertMessage
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
indexRemoveEvent := Event{
|
indexRemoveEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -91,7 +92,7 @@ func (h *IndexRemoveHandler) HandleRevert(ctx context.Context, msg RevertMessage
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, indexRemoveEvent)
|
return pub.Send(ctx, indexRemoveEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -4,7 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ func (h *OwnershipHandler) Name() string {
|
|||||||
return ownershipEventName
|
return ownershipEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *OwnershipHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *OwnershipHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == ownershipTopicHash {
|
if msg.Log.Topics[0] == ownershipTopicHash {
|
||||||
var (
|
var (
|
||||||
previousOwner common.Address
|
previousOwner common.Address
|
||||||
@ -40,7 +41,7 @@ func (h *OwnershipHandler) HandleLog(ctx context.Context, msg LogMessage, emitte
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ownershipEvent := Event{
|
ownershipEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -53,13 +54,13 @@ func (h *OwnershipHandler) HandleLog(ctx context.Context, msg LogMessage, emitte
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, ownershipEvent)
|
return pub.Send(ctx, ownershipEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *OwnershipHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *OwnershipHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -74,7 +75,7 @@ func (h *OwnershipHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ownershipEvent := Event{
|
ownershipEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -88,7 +89,7 @@ func (h *OwnershipHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, ownershipEvent)
|
return pub.Send(ctx, ownershipEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ func (h *PoolDepositHandler) Name() string {
|
|||||||
return poolDepositEventName
|
return poolDepositEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *PoolDepositHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *PoolDepositHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == poolDepositTopicHash {
|
if msg.Log.Topics[0] == poolDepositTopicHash {
|
||||||
var (
|
var (
|
||||||
initiator common.Address
|
initiator common.Address
|
||||||
@ -47,7 +48,7 @@ func (h *PoolDepositHandler) HandleLog(ctx context.Context, msg LogMessage, emit
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
poolDepositEvent := Event{
|
poolDepositEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -61,13 +62,13 @@ func (h *PoolDepositHandler) HandleLog(ctx context.Context, msg LogMessage, emit
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, poolDepositEvent)
|
return pub.Send(ctx, poolDepositEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *PoolDepositHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *PoolDepositHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -83,7 +84,7 @@ func (h *PoolDepositHandler) HandleRevert(ctx context.Context, msg RevertMessage
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
poolDepositEvent := Event{
|
poolDepositEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -98,7 +99,7 @@ func (h *PoolDepositHandler) HandleRevert(ctx context.Context, msg RevertMessage
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, poolDepositEvent)
|
return pub.Send(ctx, poolDepositEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ func (h *PoolSwapHandler) Name() string {
|
|||||||
return poolSwapEventName
|
return poolSwapEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *PoolSwapHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *PoolSwapHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == poolSwapTopicHash {
|
if msg.Log.Topics[0] == poolSwapTopicHash {
|
||||||
var (
|
var (
|
||||||
initiator common.Address
|
initiator common.Address
|
||||||
@ -53,7 +54,7 @@ func (h *PoolSwapHandler) HandleLog(ctx context.Context, msg LogMessage, emitter
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
poolSwapEvent := Event{
|
poolSwapEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -70,13 +71,13 @@ func (h *PoolSwapHandler) HandleLog(ctx context.Context, msg LogMessage, emitter
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, poolSwapEvent)
|
return pub.Send(ctx, poolSwapEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *PoolSwapHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *PoolSwapHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -93,7 +94,7 @@ func (h *PoolSwapHandler) HandleRevert(ctx context.Context, msg RevertMessage, e
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
poolSwapEvent := Event{
|
poolSwapEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -111,7 +112,7 @@ func (h *PoolSwapHandler) HandleRevert(ctx context.Context, msg RevertMessage, e
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, poolSwapEvent)
|
return pub.Send(ctx, poolSwapEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ func (h *QuoterPriceHandler) Name() string {
|
|||||||
return quoterPriceEventName
|
return quoterPriceEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *QuoterPriceHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *QuoterPriceHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == quoterPriceTopicHash {
|
if msg.Log.Topics[0] == quoterPriceTopicHash {
|
||||||
var (
|
var (
|
||||||
token common.Address
|
token common.Address
|
||||||
@ -41,7 +42,7 @@ func (h *QuoterPriceHandler) HandleLog(ctx context.Context, msg LogMessage, emit
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
quoterPriceEvent := Event{
|
quoterPriceEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -54,13 +55,13 @@ func (h *QuoterPriceHandler) HandleLog(ctx context.Context, msg LogMessage, emit
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, quoterPriceEvent)
|
return pub.Send(ctx, quoterPriceEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *QuoterPriceHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *QuoterPriceHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -76,7 +77,7 @@ func (h *QuoterPriceHandler) HandleRevert(ctx context.Context, msg RevertMessage
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
quoterPriceEvent := Event{
|
quoterPriceEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -90,7 +91,7 @@ func (h *QuoterPriceHandler) HandleRevert(ctx context.Context, msg RevertMessage
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, quoterPriceEvent)
|
return pub.Send(ctx, quoterPriceEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ func (h *SealHandler) Name() string {
|
|||||||
return sealEventName
|
return sealEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *SealHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *SealHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == sealTopicHash {
|
if msg.Log.Topics[0] == sealTopicHash {
|
||||||
var (
|
var (
|
||||||
final bool
|
final bool
|
||||||
@ -41,7 +42,7 @@ func (h *SealHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emi
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
sealEvent := Event{
|
sealEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -54,13 +55,13 @@ func (h *SealHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emi
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, sealEvent)
|
return pub.Send(ctx, sealEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *SealHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *SealHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -75,7 +76,7 @@ func (h *SealHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitt
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
sealEvent := Event{
|
sealEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -88,7 +89,7 @@ func (h *SealHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitt
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, sealEvent)
|
return pub.Send(ctx, sealEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ func (h *TokenBurnHandler) Name() string {
|
|||||||
return burnEventName
|
return burnEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TokenBurnHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *TokenBurnHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == tokenBurnTopicHash {
|
if msg.Log.Topics[0] == tokenBurnTopicHash {
|
||||||
var (
|
var (
|
||||||
tokenBurner common.Address
|
tokenBurner common.Address
|
||||||
@ -41,7 +42,7 @@ func (h *TokenBurnHandler) HandleLog(ctx context.Context, msg LogMessage, emitte
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenBurnEvent := Event{
|
tokenBurnEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -54,13 +55,13 @@ func (h *TokenBurnHandler) HandleLog(ctx context.Context, msg LogMessage, emitte
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenBurnEvent)
|
return pub.Send(ctx, tokenBurnEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TokenBurnHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *TokenBurnHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -75,7 +76,7 @@ func (h *TokenBurnHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenBurnEvent := Event{
|
tokenBurnEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -89,7 +90,7 @@ func (h *TokenBurnHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenBurnEvent)
|
return pub.Send(ctx, tokenBurnEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ func (h *TokenMintHandler) Name() string {
|
|||||||
return mintEventName
|
return mintEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TokenMintHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *TokenMintHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == tokenMintTopicHash {
|
if msg.Log.Topics[0] == tokenMintTopicHash {
|
||||||
var (
|
var (
|
||||||
tokenMinter common.Address
|
tokenMinter common.Address
|
||||||
@ -42,7 +43,7 @@ func (h *TokenMintHandler) HandleLog(ctx context.Context, msg LogMessage, emitte
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenMintEvent := Event{
|
tokenMintEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -56,13 +57,13 @@ func (h *TokenMintHandler) HandleLog(ctx context.Context, msg LogMessage, emitte
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenMintEvent)
|
return pub.Send(ctx, tokenMintEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TokenMintHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *TokenMintHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -78,7 +79,7 @@ func (h *TokenMintHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenMintEvent := Event{
|
tokenMintEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -93,7 +94,7 @@ func (h *TokenMintHandler) HandleRevert(ctx context.Context, msg RevertMessage,
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenMintEvent)
|
return pub.Send(ctx, tokenMintEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -5,7 +5,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/celo-org/celo-blockchain/common"
|
"github.com/celo-org/celo-blockchain/common"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/w3-celo"
|
"github.com/grassrootseconomics/w3-celo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ func (h *TokenTransferHandler) Name() string {
|
|||||||
return transferEventName
|
return transferEventName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TokenTransferHandler) HandleLog(ctx context.Context, msg LogMessage, emitter emitter.Emitter) error {
|
func (h *TokenTransferHandler) HandleLog(ctx context.Context, msg LogMessage, pub pub.Pub) error {
|
||||||
if msg.Log.Topics[0] == tokenTransferTopicHash {
|
if msg.Log.Topics[0] == tokenTransferTopicHash {
|
||||||
var (
|
var (
|
||||||
from common.Address
|
from common.Address
|
||||||
@ -43,7 +44,7 @@ func (h *TokenTransferHandler) HandleLog(ctx context.Context, msg LogMessage, em
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenTransferEvent := Event{
|
tokenTransferEvent := event.Event{
|
||||||
Block: msg.Log.BlockNumber,
|
Block: msg.Log.BlockNumber,
|
||||||
ContractAddress: msg.Log.Address.Hex(),
|
ContractAddress: msg.Log.Address.Hex(),
|
||||||
Success: true,
|
Success: true,
|
||||||
@ -57,13 +58,13 @@ func (h *TokenTransferHandler) HandleLog(ctx context.Context, msg LogMessage, em
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenTransferEvent)
|
return pub.Send(ctx, tokenTransferEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TokenTransferHandler) HandleRevert(ctx context.Context, msg RevertMessage, emitter emitter.Emitter) error {
|
func (h *TokenTransferHandler) HandleRevert(ctx context.Context, msg RevertMessage, pub pub.Pub) error {
|
||||||
if len(msg.InputData) < 8 {
|
if len(msg.InputData) < 8 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -79,7 +80,7 @@ func (h *TokenTransferHandler) HandleRevert(ctx context.Context, msg RevertMessa
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenTransferEvent := Event{
|
tokenTransferEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -94,7 +95,7 @@ func (h *TokenTransferHandler) HandleRevert(ctx context.Context, msg RevertMessa
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenTransferEvent)
|
return pub.Send(ctx, tokenTransferEvent)
|
||||||
case "23b872dd":
|
case "23b872dd":
|
||||||
var (
|
var (
|
||||||
from common.Address
|
from common.Address
|
||||||
@ -106,7 +107,7 @@ func (h *TokenTransferHandler) HandleRevert(ctx context.Context, msg RevertMessa
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenTransferEvent := Event{
|
tokenTransferEvent := event.Event{
|
||||||
Block: msg.Block,
|
Block: msg.Block,
|
||||||
ContractAddress: msg.ContractAddress,
|
ContractAddress: msg.ContractAddress,
|
||||||
Success: false,
|
Success: false,
|
||||||
@ -121,7 +122,7 @@ func (h *TokenTransferHandler) HandleRevert(ctx context.Context, msg RevertMessa
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return emitter.Emit(ctx, tokenTransferEvent)
|
return pub.Send(ctx, tokenTransferEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -22,10 +22,6 @@ func (p *Processor) processBlock(ctx context.Context, block types.Block) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(receiptsResp) != len(txs) {
|
|
||||||
return fmt.Errorf("block txs receipts len mismatch %d", blockNumber)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, receipt := range receiptsResp {
|
for i, receipt := range receiptsResp {
|
||||||
if receipt.Status > 0 {
|
if receipt.Status > 0 {
|
||||||
for _, log := range receipt.Logs {
|
for _, log := range receipt.Logs {
|
||||||
@ -36,7 +32,7 @@ func (p *Processor) processBlock(ctx context.Context, block types.Block) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := p.handleLogs(ctx, msg); err != nil {
|
if err := p.handleLogs(ctx, msg); err != nil {
|
||||||
p.logg.Error("handler error", "handler_type", "log", "handler_name", "error", err)
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -44,12 +40,12 @@ func (p *Processor) processBlock(ctx context.Context, block types.Block) error {
|
|||||||
if txs[i].To() != nil && p.cache.Exists(txs[i].To().Hex()) {
|
if txs[i].To() != nil && p.cache.Exists(txs[i].To().Hex()) {
|
||||||
from, err := types.Sender(types.LatestSignerForChainID(txs[i].ChainId()), &txs[i])
|
from, err := types.Sender(types.LatestSignerForChainID(txs[i].ChainId()), &txs[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.logg.Error("handler error", "handler_type", "revert", "error", err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
revertReason, err := p.chain.GetRevertReason(ctx, receipt.TxHash, receipt.BlockNumber)
|
revertReason, err := p.chain.GetRevertReason(ctx, receipt.TxHash, receipt.BlockNumber)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.logg.Error("handler error", "handler_type", "revert", "error", err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
msg := handler.RevertMessage{
|
msg := handler.RevertMessage{
|
||||||
@ -63,7 +59,7 @@ func (p *Processor) processBlock(ctx context.Context, block types.Block) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := p.handleRevert(ctx, msg); err != nil {
|
if err := p.handleRevert(ctx, msg); err != nil {
|
||||||
p.logg.Error("handler error", "handler_type", "revert", "error", err)
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,8 +75,8 @@ func (p *Processor) processBlock(ctx context.Context, block types.Block) error {
|
|||||||
|
|
||||||
func (p *Processor) handleLogs(ctx context.Context, msg handler.LogMessage) error {
|
func (p *Processor) handleLogs(ctx context.Context, msg handler.LogMessage) error {
|
||||||
for _, handler := range p.handlers {
|
for _, handler := range p.handlers {
|
||||||
if err := handler.HandleLog(ctx, msg, p.emitter); err != nil {
|
if err := handler.HandleLog(ctx, msg, p.pub); err != nil {
|
||||||
return fmt.Errorf("handler: %s err: %v", handler.Name(), err)
|
return fmt.Errorf("log handler: %s err: %v", handler.Name(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,8 +85,8 @@ func (p *Processor) handleLogs(ctx context.Context, msg handler.LogMessage) erro
|
|||||||
|
|
||||||
func (p *Processor) handleRevert(ctx context.Context, msg handler.RevertMessage) error {
|
func (p *Processor) handleRevert(ctx context.Context, msg handler.RevertMessage) error {
|
||||||
for _, handler := range p.handlers {
|
for _, handler := range p.handlers {
|
||||||
if err := handler.HandleRevert(ctx, msg, p.emitter); err != nil {
|
if err := handler.HandleRevert(ctx, msg, p.pub); err != nil {
|
||||||
return fmt.Errorf("handler: %s err: %v", handler.Name(), err)
|
return fmt.Errorf("revert handler: %s err: %v", handler.Name(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,9 +11,9 @@ import (
|
|||||||
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
"github.com/grassrootseconomics/celo-tracker/internal/cache"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/chain"
|
"github.com/grassrootseconomics/celo-tracker/internal/chain"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/db"
|
"github.com/grassrootseconomics/celo-tracker/internal/db"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/emitter"
|
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/handler"
|
"github.com/grassrootseconomics/celo-tracker/internal/handler"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/pool"
|
"github.com/grassrootseconomics/celo-tracker/internal/pool"
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/pub"
|
||||||
"github.com/grassrootseconomics/celo-tracker/internal/stats"
|
"github.com/grassrootseconomics/celo-tracker/internal/stats"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ type (
|
|||||||
Stats *stats.Stats
|
Stats *stats.Stats
|
||||||
DB *db.DB
|
DB *db.DB
|
||||||
Cache cache.Cache
|
Cache cache.Cache
|
||||||
Emitter emitter.Emitter
|
Pub pub.Pub
|
||||||
}
|
}
|
||||||
|
|
||||||
Processor struct {
|
Processor struct {
|
||||||
@ -38,7 +38,7 @@ type (
|
|||||||
quit chan struct{}
|
quit chan struct{}
|
||||||
handlers []handler.Handler
|
handlers []handler.Handler
|
||||||
cache cache.Cache
|
cache cache.Cache
|
||||||
emitter emitter.Emitter
|
pub pub.Pub
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ func NewProcessor(o ProcessorOpts) *Processor {
|
|||||||
quit: make(chan struct{}),
|
quit: make(chan struct{}),
|
||||||
handlers: handler.New(o.Cache),
|
handlers: handler.New(o.Cache),
|
||||||
cache: o.Cache,
|
cache: o.Cache,
|
||||||
emitter: o.Emitter,
|
pub: o.Pub,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
32
internal/pub/console.go
Normal file
32
internal/pub/console.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package pub
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
ConsolePub struct {
|
||||||
|
logg *slog.Logger
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewConsolePub(logg *slog.Logger) Pub {
|
||||||
|
return &ConsolePub{
|
||||||
|
logg: logg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ConsolePub) Send(_ context.Context, payload event.Event) error {
|
||||||
|
data, err := payload.Serialize()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
p.logg.Info("emitted event", "json_payload", string(data))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ConsolePub) Close() {}
|
91
internal/pub/jetstream.go
Normal file
91
internal/pub/jetstream.go
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
package pub
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
"github.com/nats-io/nats.go"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
JetStreamOpts struct {
|
||||||
|
Logg *slog.Logger
|
||||||
|
Endpoint string
|
||||||
|
DedupDuration time.Duration
|
||||||
|
PersistDuration time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
JetStreamEmitter struct {
|
||||||
|
natsConn *nats.Conn
|
||||||
|
jsCtx nats.JetStreamContext
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
streamName string = "TRACKER"
|
||||||
|
streamSubjects string = "TRACKER.*"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewJetStreamPub(o JetStreamOpts) (Pub, error) {
|
||||||
|
natsConn, err := nats.Connect(o.Endpoint)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
js, err := natsConn.JetStream()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
o.Logg.Info("successfully connected to NATS server")
|
||||||
|
|
||||||
|
stream, err := js.StreamInfo(streamName)
|
||||||
|
if err != nil && !errors.Is(err, nats.ErrStreamNotFound) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if stream == nil {
|
||||||
|
_, err := js.AddStream(&nats.StreamConfig{
|
||||||
|
Name: streamName,
|
||||||
|
MaxAge: o.PersistDuration,
|
||||||
|
Storage: nats.FileStorage,
|
||||||
|
Subjects: []string{streamSubjects},
|
||||||
|
Duplicates: o.DedupDuration,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
o.Logg.Info("successfully created NATS JetStream stream", "stream_name", streamName)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &JetStreamEmitter{
|
||||||
|
natsConn: natsConn,
|
||||||
|
jsCtx: js,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *JetStreamEmitter) Close() {
|
||||||
|
if p.natsConn != nil {
|
||||||
|
p.natsConn.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *JetStreamEmitter) Send(_ context.Context, payload event.Event) error {
|
||||||
|
data, err := payload.Serialize()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = p.jsCtx.Publish(
|
||||||
|
fmt.Sprintf("%s.%s", streamName, payload.TxType),
|
||||||
|
data,
|
||||||
|
nats.MsgId(fmt.Sprintf("%s:%s", payload.TxType, payload.TxHash)),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
14
internal/pub/pub.go
Normal file
14
internal/pub/pub.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package pub
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/grassrootseconomics/celo-tracker/internal/event"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
Pub interface {
|
||||||
|
Send(context.Context, event.Event) error
|
||||||
|
Close()
|
||||||
|
}
|
||||||
|
)
|
@ -76,6 +76,8 @@ func (s *Syncer) StartHistoricalSyncer() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Syncer) StopHistoricalSyncer() {
|
func (s *Syncer) StopHistoricalSyncer() {
|
||||||
|
if s.historicalEnabled {
|
||||||
s.logg.Info("signaling historical syncer shutdown")
|
s.logg.Info("signaling historical syncer shutdown")
|
||||||
s.quit <- struct{}{}
|
s.quit <- struct{}{}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -39,6 +39,7 @@ type (
|
|||||||
quit chan struct{}
|
quit chan struct{}
|
||||||
startBlock uint64
|
startBlock uint64
|
||||||
realtimeSub celo.Subscription
|
realtimeSub celo.Subscription
|
||||||
|
historicalEnabled bool
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -78,5 +79,6 @@ func New(o SyncerOpts) (*Syncer, error) {
|
|||||||
batchSize: o.BatchSize,
|
batchSize: o.BatchSize,
|
||||||
quit: make(chan struct{}),
|
quit: make(chan struct{}),
|
||||||
startBlock: o.StartBlock,
|
startBlock: o.StartBlock,
|
||||||
|
historicalEnabled: o.EnableHistorical,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user