Skip to content
Draft
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ require (
github.com/minio/highwayhash v1.0.1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.1 // indirect
github.com/prometheus/client_golang v1.0.0
github.com/prysmaticlabs/ethereumapis v0.0.0-20200729044127-8027cc96e2c0
github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388
github.com/rocket-pool/rocketpool-go v0.0.10
Expand All @@ -26,6 +27,7 @@ require (
github.com/wealdtech/go-eth2-types/v2 v2.5.0
github.com/wealdtech/go-eth2-util v1.6.0
github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.1.1
go.uber.org/multierr v1.6.0
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b // indirect
Expand Down
12 changes: 12 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
Expand Down Expand Up @@ -346,6 +348,7 @@ github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/minio/highwayhash v1.0.0 h1:iMSDhgUILCr0TNm8LWlSjF8N0ZIj2qbO8WHp6Q/J2BA=
Expand Down Expand Up @@ -410,16 +413,21 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce h1:X0jFYGnHemYDIW6jlc+fSI8f9Cg+jqCnClYP2WgZT/A=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE=
github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
Expand Down Expand Up @@ -526,7 +534,11 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
Expand Down
32 changes: 32 additions & 0 deletions rocketpool-cli/metrics/commands.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package metrics

import (
"github.com/urfave/cli"
)


// Register commands
func RegisterCommands(app *cli.App, name string, aliases []string) {
app.Commands = append(app.Commands, cli.Command{
Name: name,
Aliases: aliases,
Usage: "Rocket Pool Metrics",
Subcommands: []cli.Command{

cli.Command{
Name: "print",
Aliases: []string{"p"},
Usage: "Print the ouptput of metrics",
UsageText: "rocketpool metrics print",
Action: func(c *cli.Context) error {

// Run
return print(c)

},
},

},
})
}

21 changes: 21 additions & 0 deletions rocketpool-cli/metrics/print.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package metrics

import (
"github.com/urfave/cli"

"github.com/rocket-pool/smartnode/shared/services/rocketpool"
)


func print(c *cli.Context) error {

// Get RP client
rp, err := rocketpool.NewClientFromCtx(c)
if err != nil { return err }
defer rp.Close()

// Print metrics
return rp.PrintMetricsOutput()

}

16 changes: 16 additions & 0 deletions rocketpool-cli/minipool/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,22 @@ func RegisterCommands(app *cli.App, name string, aliases []string) {
},
},

cli.Command{
Name: "leader",
Aliases: []string{"l"},
Usage: "minipool leaderboard",
UsageText: "rocketpool minipool leader",
Action: func(c *cli.Context) error {

// Validate args
if err := cliutils.ValidateArgCount(c, 0); err != nil { return err }

// Run
return getLeader(c)

},
},

cli.Command{
Name: "refund",
Aliases: []string{"r"},
Expand Down
77 changes: 77 additions & 0 deletions rocketpool-cli/minipool/leader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package minipool

import (
"fmt"
"sort"

"github.com/rocket-pool/rocketpool-go/utils/eth"
"github.com/urfave/cli"

"github.com/rocket-pool/smartnode/shared/services/rocketpool"
"github.com/rocket-pool/smartnode/shared/types/api"
"github.com/rocket-pool/smartnode/shared/utils/hex"
)


func getLeader(c *cli.Context) error {

// Get RP client
rp, err := rocketpool.NewClientFromCtx(c)
if err != nil { return err }
defer rp.Close()

// Get minipool statuses
status, err := rp.MinipoolLeader()
if err != nil {
return err
}

// Get minipools by status
minipools := []api.MinipoolDetails{}
statusCounts := map[string]int{}
for _, minipool := range status.Minipools {

// Add to status list
if minipool.Validator.Exists {
minipools = append(minipools, minipool)
}

// status count
statusName := minipool.Status.Status.String()
if _, ok := statusCounts[statusName]; !ok {
statusCounts[statusName] = 0
}
statusCounts[statusName] = statusCounts[statusName]+1
}

fmt.Printf("Total minipools: %d\n", len(status.Minipools))
fmt.Println("Status,Count")

for status, count := range statusCounts {
fmt.Printf("%s,%d", status, count)
fmt.Println("")
}

// Print & return
if len(status.Minipools) == 0 {
fmt.Println("No active minipools")
return nil
}
fmt.Println("")

sort.SliceStable(minipools, func(i, j int) bool { return eth.WeiToEth(minipools[i].Validator.Balance) > eth.WeiToEth(minipools[j].Validator.Balance) })

fmt.Printf("Minipools with validators: %d\n", len(minipools))
fmt.Println("Rank,Node address,Validator pubkey,RP status update time,Accumulated reward/penalty (ETH)")

for i, minipool := range minipools {
nodeAddress := hex.AddPrefix(minipool.Node.Address.Hex())
validatorAddress := hex.AddPrefix(minipool.ValidatorPubkey.Hex())
statusTime := minipool.Status.StatusTime.Format("2006-01-02T15:04:05-0700")
diffBalance := eth.WeiToEth(minipool.Validator.Balance) - eth.WeiToEth(minipool.Node.DepositBalance) - eth.WeiToEth(minipool.User.DepositBalance)
fmt.Printf("%4d,%s,%s,%s,%+0.10f", i+1, nodeAddress, validatorAddress, statusTime, diffBalance)
fmt.Println("")
}
return nil

}
16 changes: 16 additions & 0 deletions rocketpool-cli/node/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,22 @@ func RegisterCommands(app *cli.App, name string, aliases []string) {
},
},

cli.Command{
Name: "leader",
Aliases: []string{"l"},
Usage: "node leaderboard",
UsageText: "rocketpool node leader",
Action: func(c *cli.Context) error {

// Validate args
if err := cliutils.ValidateArgCount(c, 0); err != nil { return err }

// Run
return getLeader(c)

},
},

cli.Command{
Name: "register",
Aliases: []string{"r"},
Expand Down
49 changes: 49 additions & 0 deletions rocketpool-cli/node/leader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package node

import (
"fmt"
"math"

"github.com/rocket-pool/rocketpool-go/utils/eth"
"github.com/urfave/cli"

"github.com/rocket-pool/smartnode/shared/services/rocketpool"
"github.com/rocket-pool/smartnode/shared/utils/hex"
)


func getLeader(c *cli.Context) error {

// Get RP client
rp, err := rocketpool.NewClientFromCtx(c)
if err != nil { return err }
defer rp.Close()

// Get node status
response, err := rp.NodeLeader()
if err != nil { return err }

// Print & return
if len(response.Nodes) == 0 {
fmt.Println("No Rocketpool nodes")
return nil
}

fmt.Printf("%d Rocketpool nodes\n", len(response.Nodes))
fmt.Println("")
fmt.Println("Rank,Node address,Score (ETH),Minipool count,Registered,Timezone")

for _, nodeRank := range response.Nodes {
nodeAddress := hex.AddPrefix(nodeRank.Address.Hex())
var score float64
if nodeRank.Score != nil {
score = eth.WeiToEth(nodeRank.Score)
} else {
score = math.NaN()
}

fmt.Printf("%4d,%s,%+0.10f,%4d,%t,%s", nodeRank.Rank, nodeAddress, score, len(nodeRank.Details), nodeRank.Registered, nodeRank.TimezoneLocation)
fmt.Println("")
}
return nil
}
2 changes: 2 additions & 0 deletions rocketpool-cli/rocketpool-cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/urfave/cli"

"github.com/rocket-pool/smartnode/rocketpool-cli/auction"
"github.com/rocket-pool/smartnode/rocketpool-cli/metrics"
"github.com/rocket-pool/smartnode/rocketpool-cli/minipool"
"github.com/rocket-pool/smartnode/rocketpool-cli/network"
"github.com/rocket-pool/smartnode/rocketpool-cli/node"
Expand Down Expand Up @@ -93,6 +94,7 @@ ______ _ _ ______ _

// Register commands
auction.RegisterCommands(app, "auction", []string{"a"})
metrics.RegisterCommands(app, "metrics", []string{"r"})
minipool.RegisterCommands(app, "minipool", []string{"m"})
network.RegisterCommands(app, "network", []string{"e"})
node.RegisterCommands(app, "node", []string{"n"})
Expand Down
17 changes: 17 additions & 0 deletions rocketpool/api/minipool/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,23 @@ func RegisterSubcommands(command *cli.Command, name string, aliases []string) {
},
},

cli.Command{
Name: "leader",
Aliases: []string{"l"},
Usage: "validator leaderboard",
UsageText: "rocketpool api minipool leader",
Action: func(c *cli.Context) error {

// Validate args
if err := cliutils.ValidateArgCount(c, 0); err != nil { return err }

// Run
api.PrintResponse(getLeader(c))
return nil

},
},

cli.Command{
Name: "can-refund",
Usage: "Check whether the node can refund ETH from the minipool",
Expand Down
Loading