Skip to content

Commit

Permalink
Merge pull request #33 from flashbots/slot-range
Browse files Browse the repository at this point in the history
get stats by slot instead of inserted_at
  • Loading branch information
metachris authored May 29, 2024
2 parents 12f3ed8 + b2ee20c commit 4786b30
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 8 deletions.
2 changes: 1 addition & 1 deletion cmd/service/website.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ var websiteCmd = &cobra.Command{
}

// Start the server
log.Infof("Webserver starting on %s ...", websiteListenAddr)
log.Infof("Webserver starting on %s (%s) ...", websiteListenAddr, vars.Version)
log.Fatal(srv.StartServer())
},
}
23 changes: 16 additions & 7 deletions database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,25 +129,34 @@ func (s *DatabaseService) GetDataAPILatestBid(relay string) (*DataAPIBuilderBidE
}

func (s *DatabaseService) GetTopRelays(since, until time.Time) (res []*TopRelayEntry, err error) {
// slot_start =slotToTime
query := `SELECT relay, count(relay) as payloads FROM ` + TableDataAPIPayloadDelivered + ` WHERE inserted_at > $1 AND inserted_at < $2 GROUP BY relay ORDER BY payloads DESC;`
err = s.DB.Select(&res, query, since.UTC(), until.UTC())
startSlot := timeToSlot(since)
endSlot := timeToSlot(until)

// query := `SELECT relay, count(relay) as payloads FROM ` + TableDataAPIPayloadDelivered + ` WHERE inserted_at > $1 AND inserted_at < $2 GROUP BY relay ORDER BY payloads DESC;`
query := `SELECT relay, count(relay) as payloads FROM ` + TableDataAPIPayloadDelivered + ` WHERE slot >= $1 AND slot <= $2 GROUP BY relay ORDER BY payloads DESC;`
err = s.DB.Select(&res, query, startSlot, endSlot)
return res, err
}

func (s *DatabaseService) GetTopBuilders(since, until time.Time, relay string) (res []*TopBuilderEntry, err error) {
startSlot := timeToSlot(since)
endSlot := timeToSlot(until)

query := `SELECT extra_data, count(extra_data) as blocks FROM (
SELECT distinct(slot), extra_data FROM ` + TableDataAPIPayloadDelivered + ` WHERE inserted_at > $1 AND inserted_at < $2`
SELECT distinct(slot), extra_data FROM ` + TableDataAPIPayloadDelivered + ` WHERE slot >= $1 AND slot <= $2`
if relay != "" {
query += ` AND relay = '` + relay + `'`
}
query += ` GROUP BY slot, extra_data
) as x GROUP BY extra_data ORDER BY blocks DESC;`
err = s.DB.Select(&res, query, since.UTC(), until.UTC())
err = s.DB.Select(&res, query, startSlot, endSlot)
return res, err
}

func (s *DatabaseService) GetBuilderProfits(since, until time.Time) (res []*BuilderProfitEntry, err error) {
startSlot := timeToSlot(since)
endSlot := timeToSlot(until)

query := `SELECT
extra_data,
count(extra_data) as blocks,
Expand All @@ -158,11 +167,11 @@ func (s *DatabaseService) GetBuilderProfits(since, until time.Time) (res []*Buil
round(sum(CASE WHEN coinbase_diff_eth IS NOT NULL THEN coinbase_diff_eth ELSE 0 END), 4) as total_profit,
round(abs(sum(CASE WHEN coinbase_diff_eth < 0 THEN coinbase_diff_eth ELSE 0 END)), 4) as total_subsidies
FROM (
SELECT distinct(slot), extra_data, coinbase_diff_eth FROM ` + TableDataAPIPayloadDelivered + ` WHERE inserted_at > $1 AND inserted_at < $2
SELECT distinct(slot), extra_data, coinbase_diff_eth FROM ` + TableDataAPIPayloadDelivered + ` WHERE slot >= $1 AND slot <= $2
) AS x
GROUP BY extra_data
ORDER BY total_profit DESC;`
err = s.DB.Select(&res, query, since.UTC(), until.UTC())
err = s.DB.Select(&res, query, startSlot, endSlot)
return res, err
}

Expand Down
10 changes: 10 additions & 0 deletions database/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package database

import (
"net/url"
"time"

"github.com/sirupsen/logrus"
)
Expand All @@ -19,3 +20,12 @@ func MustConnectPostgres(log *logrus.Entry, dsn string) *DatabaseService {
log.Infof("Connected to Postgres database at %s%s ✅", dbURL.Host, dbURL.Path)
return db
}

func slotToTime(slot uint64) time.Time {
timestamp := (slot * 12) + 1606824023 // mainnet
return time.Unix(int64(timestamp), 0).UTC()
}

func timeToSlot(t time.Time) uint64 {
return uint64(t.UTC().Unix()-1606824023) / 12 // mainnet
}
15 changes: 15 additions & 0 deletions database/util_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package database

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestSlotTimeConversion(t *testing.T) {
slot := 8901362
slotTime := slotToTime(uint64(slot))
require.Equal(t, 1713640367, int(slotTime.Unix()))
convertedSlot := timeToSlot(slotTime)
require.Equal(t, uint64(slot), convertedSlot)
}

0 comments on commit 4786b30

Please sign in to comment.