Skip to content

Commit

Permalink
add fee tracer service
Browse files Browse the repository at this point in the history
  • Loading branch information
yihau committed Mar 26, 2024
1 parent 24a005f commit 09f5421
Show file tree
Hide file tree
Showing 7 changed files with 1,112 additions and 15 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ solana-ping-api-service*
vendor/

# go.sum , do not commit config.yaml to avoid accidental info leak
go.sum
config.yaml
config-mainnet-beta.yaml
config-testnet.yaml
Expand Down
18 changes: 18 additions & 0 deletions cmd/fee-tracer/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package main

type config struct {
InfluxDB influxdb
Solana solana
}

type influxdb struct {
URL string `env:"INFLUX_URL"`
Username string `env:"INFLUX_USER"`
Password string `env:"INFLUX_PWD"`
Database string `env:"INFLUX_DATABASE"`
}

type solana struct {
URL string `env:"SOLANA_URL,required"`
Percentile uint16 `env:"SOLANA_FEE_PERCENTILE" envDefault:"0"`
}
100 changes: 100 additions & 0 deletions cmd/fee-tracer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package main

import (
"context"
"flag"
"fmt"
"os"
"sort"
"time"

solana_client "github.com/blocto/solana-go-sdk/client"
solana_common "github.com/blocto/solana-go-sdk/common"
solana_rpc "github.com/blocto/solana-go-sdk/rpc"
"github.com/caarlos0/env/v10"
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)

func main() {
// init log
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339})

debug := flag.Bool("debug", false, "sets log level to debug")
flag.Parse()
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if *debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}

// init config
cfg := config{}
if err := env.Parse(&cfg); err != nil {
log.Fatal().Err(err).Msg("Config")
}

for {
func() {
// init solana client
solanaConn := solana_client.NewClient(cfg.Solana.URL)

// get the fees
var prioritizationFees solana_rpc.PrioritizationFees
var err error

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

prioritizationFees, err = solanaConn.GetRecentPrioritizationFeesWithConfig(
ctx,
[]solana_common.PublicKey{},
solana_rpc.GetRecentPrioritizationFeesConfig{
Percentile: cfg.Solana.Percentile,
},
)
if err != nil {
log.Error().Err(err).Msg("Solana Client")
return
}

sort.Slice(prioritizationFees, func(i, j int) bool {
return prioritizationFees[i].Slot > prioritizationFees[j].Slot
})
if len(prioritizationFees) == 0 {
log.Warn().Err(fmt.Errorf("got empty fees")).Msg("Solana Client")
return
}
fee := prioritizationFees[0]
if e := log.Debug(); e.Enabled() {
e.
Uint64("slot", fee.Slot).
Uint16("percentile", cfg.Solana.Percentile).
Uint64("fee", fee.PrioritizationFee).
Msg("Datapoint")
}

// write the datapoint
if cfg.InfluxDB.URL != "" {
influxConn := influxdb2.NewClient(
cfg.InfluxDB.URL,
fmt.Sprintf("%v/%v", cfg.InfluxDB.Username, cfg.InfluxDB.Password),
)
defer influxConn.Close()

writeAPI := influxConn.WriteAPI("anzaxyz", cfg.InfluxDB.Database)

writeAPI.WritePoint(
influxdb2.NewPoint("fees",
map[string]string{"percentile": fmt.Sprintf("%v", cfg.Solana.Percentile)},
map[string]interface{}{"slot": int64(fee.Slot), "fee": int64(fee.PrioritizationFee)},
time.Now(),
),
)
}

time.Sleep(100 * time.Microsecond)
}()
}
}
13 changes: 13 additions & 0 deletions docker/Dockerfile.default
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM golang:1.22 AS builder
ARG COMPONENT
WORKDIR /workspace
COPY . .
RUN go build -o app ./cmd/$COMPONENT

FROM debian:latest
RUN \
apt-get update && \
apt-get install ca-certificates curl vim -y
WORKDIR /workspace
COPY --from=builder /workspace/app .
CMD ["./app"]
33 changes: 19 additions & 14 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,21 @@ go 1.21
require (
github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0
github.com/blocto/solana-go-sdk v1.27.1-0.20240322074811-5a60fbd6a563
github.com/caarlos0/env/v10 v10.0.0
github.com/gin-contrib/timeout v0.0.3
github.com/gin-gonic/gin v1.7.7
github.com/influxdata/influxdb-client-go/v2 v2.12.0
github.com/lib/pq v1.10.4
github.com/parnurzeal/gorequest v0.2.16
github.com/rs/zerolog v1.15.0
github.com/spf13/viper v1.10.1
gorm.io/driver/postgres v1.3.1
gorm.io/gorm v1.23.3
)

require (
cloud.google.com/go/compute v1.5.0 // indirect
cloud.google.com/go/compute v1.19.1 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
filippo.io/edwards25519 v1.0.0-rc.1 // indirect
github.com/deepmap/oapi-codegen v1.8.2 // indirect
github.com/elazarl/goproxy v0.0.0-20211114080932-d06c3be7c11b // indirect
Expand All @@ -26,8 +29,10 @@ require (
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.10.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/googleapis/gax-go/v2 v2.2.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
github.com/googleapis/gax-go/v2 v2.7.1 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
Expand All @@ -43,7 +48,7 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
Expand All @@ -58,21 +63,21 @@ require (
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
go.opencensus.io v0.23.0 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.8.0 // indirect
go.uber.org/zap v1.21.0 // indirect
golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 // indirect
golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect
golang.org/x/sys v0.0.0-20220325203850-36772127a21f // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/crypto v0.16.0 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/oauth2 v0.7.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect
google.golang.org/api v0.73.0 // indirect
google.golang.org/api v0.114.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect
google.golang.org/grpc v1.45.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.56.3 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/ini.v1 v1.66.4 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
moul.io/http2curl v1.0.0 // indirect
Expand Down

0 comments on commit 09f5421

Please sign in to comment.