Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions tools/dashboard/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/ethereum/go-ethereum/ethclient"
bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry"
blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker"
depositmanager "github.com/primev/mev-commit/contracts-abi/clients/DepositManager"
oracle "github.com/primev/mev-commit/contracts-abi/clients/Oracle"
preconf "github.com/primev/mev-commit/contracts-abi/clients/PreconfManager"
providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry"
Expand Down Expand Up @@ -192,6 +193,20 @@ func main() {
evtMgr,
)

dynSub, err := evtMgr.Subscribe(
events.NewEventHandler(
"BidderDeposited",
func(upd *bidderregistry.BidderregistryBidderDeposited) {
// Register deposited bidder as a contract in case it has enabled deposit manager
pb.AddContracts(upd.Bidder)
},
),
)
if err != nil {
return err
}
defer dynSub.Unsubscribe()

statHdlr, err := newStatHandler(evtMgr)
if err != nil {
return err
Expand Down Expand Up @@ -388,6 +403,15 @@ func registerRoutes(mux *http.ServeMux, statHdlr *statHandler) {
return
}
})

mux.HandleFunc("GET /dmcounts", func(w http.ResponseWriter, r *http.Request) {
dout := struct {
DMCounts []*DepositManagerEventCounts `json:"deposit_manager_counts"`
}{
DMCounts: statHdlr.getDMCounts(),
}
_ = json.NewEncoder(w).Encode(dout)
})
}

func parsePagination(r *http.Request) (int, int) {
Expand Down Expand Up @@ -437,11 +461,17 @@ func getContractABIs() ([]*abi.ABI, error) {
return nil, err
}

dmABI, err := abi.JSON(strings.NewReader(depositmanager.DepositmanagerABI))
if err != nil {
return nil, err
}

return []*abi.ABI{
&btABI,
&pcABI,
&bidderRegistry,
&providerRegistry,
&orABI,
&dmABI,
}, nil
}
159 changes: 147 additions & 12 deletions tools/dashboard/stathandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
lru "github.com/hashicorp/golang-lru/v2"
bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry"
blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker"
depositmanager "github.com/primev/mev-commit/contracts-abi/clients/DepositManager"
oracle "github.com/primev/mev-commit/contracts-abi/clients/Oracle"
preconf "github.com/primev/mev-commit/contracts-abi/clients/PreconfManager"
providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry"
Expand All @@ -26,6 +27,7 @@ type statHandler struct {
totalOpenedCommitments uint64
totalRewards uint64
totalSlashes uint64
dmEventCounts *lru.Cache[string, *DepositManagerEventCounts]
evtMgr events.EventManager
sub events.Subscription
unsub func()
Expand Down Expand Up @@ -53,13 +55,14 @@ type ProviderBalances struct {
type BidderDeposit struct {
Bidder string `json:"bidder"`
Provider string `json:"provider"`
Amount string `json:"amount"`
AvailableAmount string `json:"available_amount"`
Refunds string `json:"refunds"`
Settled string `json:"settled"`
Withdrawn string `json:"withdrawn"`
OpenCommitmentsCount uint64 `json:"open_commitments_count"`
ReturnsCount uint64 `json:"returns_count"`
SettledCount uint64 `json:"settled_count"`
DepositedCount uint64 `json:"deposited_count"`
}

type depositKey struct {
Expand All @@ -74,11 +77,23 @@ type AggregateStats struct {
TotalSlashes uint64 `json:"total_slashes"`
}

type DepositManagerEventCounts struct {
Bidder string `json:"bidder"`
DepositToppedUp uint64 `json:"deposit_topped_up"`
TopUpReduced uint64 `json:"top_up_reduced"`
CurrentDepositIsSufficient uint64 `json:"current_deposit_is_sufficient"`
CurrentBalanceAtOrBelowMin uint64 `json:"current_balance_at_or_below_min"`
TargetDepositDoesNotExist uint64 `json:"target_deposit_does_not_exist"`
WithdrawalRequestExists uint64 `json:"withdrawal_request_exists"`
TargetDepositSet uint64 `json:"target_deposit_set"`
}

type DashboardOut struct {
Aggregate *AggregateStats `json:"aggregate"`
Providers []*ProviderBalances `json:"providers"`
Blocks []*BlockStats `json:"blocks"`
Bidders []*BidderDeposit `json:"bidders"`
Aggregate *AggregateStats `json:"aggregate"`
Providers []*ProviderBalances `json:"providers"`
Blocks []*BlockStats `json:"blocks"`
Bidders []*BidderDeposit `json:"bidders"`
DMCounts []*DepositManagerEventCounts `json:"deposit_manager_counts"`
}

func newStatHandler(evtMgr events.EventManager) (*statHandler, error) {
Expand Down Expand Up @@ -107,12 +122,18 @@ func newStatHandler(evtMgr events.EventManager) (*statHandler, error) {
return nil, err
}

dmEventCounts, err := lru.New[string, *DepositManagerEventCounts](10000)
if err != nil {
return nil, err
}

st := &statHandler{
blockStats: blockStats,
providerStakes: providerStakes,
bidderDeposits: bidderDeposits,
commitments: commitments,
commitmentsByBlock: commitmentsByBlock,
dmEventCounts: dmEventCounts,
evtMgr: evtMgr,
}

Expand Down Expand Up @@ -359,17 +380,23 @@ func (s *statHandler) configureDashboard() error {
existing = make([]*BidderDeposit, 0)
}

updated := false
for _, b := range existing {
if b.Bidder == upd.Bidder.Hex() {
return
b.AvailableAmount = upd.NewAvailableAmount.String()
b.DepositedCount++
updated = true
break
}
}

existing = append(existing, &BidderDeposit{
Bidder: upd.Bidder.Hex(),
Provider: upd.Provider.Hex(),
Amount: upd.DepositedAmount.String(),
})
if !updated {
existing = append(existing, &BidderDeposit{
Bidder: upd.Bidder.Hex(),
Provider: upd.Provider.Hex(),
AvailableAmount: upd.NewAvailableAmount.String(),
DepositedCount: 1,
})
}
_ = s.bidderDeposits.Add(depositKey{
bidder: upd.Bidder.Hex(),
provider: upd.Provider.Hex(),
Expand Down Expand Up @@ -425,6 +452,7 @@ func (s *statHandler) configureDashboard() error {
for idx, b := range existing {
if b.Bidder == upd.Bidder.Hex() {
existing[idx].Withdrawn = upd.AmountWithdrawn.String()
existing[idx].AvailableAmount = "0"
break
}
}
Expand All @@ -435,6 +463,105 @@ func (s *statHandler) configureDashboard() error {
}, existing)
},
),
events.NewEventHandler(
"DepositToppedUp",
func(upd *depositmanager.DepositmanagerDepositToppedUp) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.DepositToppedUp++
_ = s.dmEventCounts.Add(b, c)
},
),
events.NewEventHandler(
"TopUpReduced",
func(upd *depositmanager.DepositmanagerTopUpReduced) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.TopUpReduced++
_ = s.dmEventCounts.Add(b, c)
},
),
events.NewEventHandler(
"CurrentBalanceAtOrBelowMin",
func(upd *depositmanager.DepositmanagerCurrentBalanceAtOrBelowMin) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.CurrentBalanceAtOrBelowMin++
_ = s.dmEventCounts.Add(b, c)
},
),
events.NewEventHandler(
"CurrentDepositIsSufficient",
func(upd *depositmanager.DepositmanagerCurrentDepositIsSufficient) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.CurrentDepositIsSufficient++
_ = s.dmEventCounts.Add(b, c)
},
),
events.NewEventHandler(
"TargetDepositDoesNotExist",
func(upd *depositmanager.DepositmanagerTargetDepositDoesNotExist) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.TargetDepositDoesNotExist++
_ = s.dmEventCounts.Add(b, c)
},
),

events.NewEventHandler(
"WithdrawalRequestExists",
func(upd *depositmanager.DepositmanagerWithdrawalRequestExists) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.WithdrawalRequestExists++
_ = s.dmEventCounts.Add(b, c)
},
),
events.NewEventHandler(
"TargetDepositSet",
func(upd *depositmanager.DepositmanagerTargetDepositSet) {
s.statMu.Lock()
defer s.statMu.Unlock()
b := upd.Raw.Address.Hex()
c, ok := s.dmEventCounts.Get(b)
if !ok {
c = &DepositManagerEventCounts{Bidder: b}
}
c.TargetDepositSet++
_ = s.dmEventCounts.Add(b, c)
},
),
}

sub, err := s.evtMgr.Subscribe(handlers...)
Expand Down Expand Up @@ -474,12 +601,14 @@ func (s *statHandler) getDashboard(page, limit int) *DashboardOut {
providers := s.getProviders()
blocks := s.getBlocks(page, limit)
bidders := s.getBidders()
dmCounts := s.getDMCounts()

return &DashboardOut{
Aggregate: agg,
Providers: providers,
Blocks: blocks,
Bidders: bidders,
DMCounts: dmCounts,
}
}

Expand All @@ -502,6 +631,12 @@ func (s *statHandler) getBidders() []*BidderDeposit {
return all
}

func (s *statHandler) getDMCounts() []*DepositManagerEventCounts {
s.statMu.RLock()
defer s.statMu.RUnlock()
return s.dmEventCounts.Values()
}

func (s *statHandler) getBlockStats(block uint64) *BlockStats {
s.statMu.RLock()
defer s.statMu.RUnlock()
Expand Down
Loading
Loading