Skip to content

Commit

Permalink
operator status (#8)
Browse files Browse the repository at this point in the history
* operator status

* update print
  • Loading branch information
shrimalmadhur authored Dec 3, 2023
1 parent 46c4591 commit 5935f71
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 9 deletions.
1 change: 1 addition & 0 deletions pkg/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ func OperatorCmd(p utils.Prompter) *cli.Command {
operator.KeysCmd(p),
operator.ConfigCmd(p),
operator.RegisterCmd(p),
operator.StatusCmd(p),
},
}

Expand Down
41 changes: 32 additions & 9 deletions pkg/operator/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ func RegisterCmd(p utils.Prompter) *cli.Command {
Name: "register",
Usage: "Register the operator and the BLS public key in the EigenLayer contracts",
UsageText: "register <configuration-file>",
Description: `
Register command expects a yaml config file as an argument
to successfully register an operator address to eigenlayer
This will register operator to DelegationManager and will register
the BLS public key on eigenlayer
`,
Action: func(cCtx *cli.Context) error {
args := cCtx.Args()
if args.Len() != 1 {
Expand All @@ -36,17 +43,29 @@ func RegisterCmd(p utils.Prompter) *cli.Command {
if err != nil {
return err
}
fmt.Printf("Operator configuration file read successfully %s\n", operatorCfg.Operator.Address)
fmt.Printf("validating operator config: %s\n", operatorCfg.Operator.Address)
fmt.Printf(
"Operator configuration file read successfully %s %s\n",
operatorCfg.Operator.Address,
utils.EmojiCheckMark,
)
fmt.Printf("validating operator config: %s %s\n", operatorCfg.Operator.Address, utils.EmojiInfo)

err = operatorCfg.Operator.Validate()
if err != nil {
return fmt.Errorf("%w: with error %s", ErrInvalidYamlFile, err)
}

fmt.Println("Operator file validated successfully")

signerType, err := validateSignerType(operatorCfg)
if err != nil {
return err
}

fmt.Printf(
"Operator configuration file validated successfully %s %s\n",
operatorCfg.Operator.Address,
utils.EmojiCheckMark,
)

ctx := context.Background()
logger, err := eigensdkLogger.NewZapLogger(eigensdkLogger.Development)
if err != nil {
Expand Down Expand Up @@ -109,35 +128,39 @@ func RegisterCmd(p utils.Prompter) *cli.Command {
return err
}

status, err := reader.IsOperatorRegistered(context.Background(), operatorCfg.Operator)
status, err := reader.IsOperatorRegistered(ctx, operatorCfg.Operator)
if err != nil {
return err
}

if !status {
receipt, err := elWriter.RegisterAsOperator(ctx, operatorCfg.Operator)
if err != nil {
logger.Infof("Error while registering operator %s", utils.EmojiCrossMark)
return err
}
logger.Infof(
"Operator registration transaction at: %s",
"Operator registration transaction at: %s %s",
getTransactionLink(receipt.TxHash.String(), &operatorCfg.ChainId),
utils.EmojiCheckMark,
)

} else {
logger.Info("Operator is already registered")
logger.Infof("Operator is already registered on EigenLayer %s\n", utils.EmojiCheckMark)
}

receipt, err := elWriter.RegisterBLSPublicKey(ctx, keyPair, operatorCfg.Operator)
if err != nil {
logger.Infof("Error while registering BLS public key %s", utils.EmojiCrossMark)
return err
}
logger.Infof(
"Operator bls key added transaction at: %s",
"Operator bls key added transaction at: %s %s",
getTransactionLink(receipt.TxHash.String(), &operatorCfg.ChainId),
utils.EmojiCheckMark,
)

logger.Info("Operator is registered and bls key added successfully")
logger.Infof("Operator is registered and bls key added successfully %s\n", utils.EmojiCheckMark)
return nil
},
}
Expand Down
130 changes: 130 additions & 0 deletions pkg/operator/status.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package operator

import (
"context"
"fmt"

"github.com/Layr-Labs/eigenlayer-cli/pkg/types"
"github.com/Layr-Labs/eigenlayer-cli/pkg/utils"
eigenChainio "github.com/Layr-Labs/eigensdk-go/chainio/clients"
"github.com/Layr-Labs/eigensdk-go/chainio/clients/eth"
elContracts "github.com/Layr-Labs/eigensdk-go/chainio/elcontracts"
eigensdkLogger "github.com/Layr-Labs/eigensdk-go/logging"
eigensdkTypes "github.com/Layr-Labs/eigensdk-go/types"
eigensdkUtils "github.com/Layr-Labs/eigensdk-go/utils"
"github.com/ethereum/go-ethereum/common"
"github.com/urfave/cli/v2"
)

func StatusCmd(p utils.Prompter) *cli.Command {
statusCmd := &cli.Command{
Name: "status",
Usage: "Check if the operator is registered and get the operator details",
UsageText: "status <configuration-file>",
Description: `
Check the registration status of operator to Eigenlayer.
It expects the same configuration yaml file as argument to register command
`,
Action: func(cCtx *cli.Context) error {
args := cCtx.Args()
if args.Len() != 1 {
return fmt.Errorf("%w: accepts 1 arg, received %d", ErrInvalidNumberOfArgs, args.Len())
}

configurationFilePath := args.Get(0)
var operatorCfg types.OperatorConfig
err := eigensdkUtils.ReadYamlConfig(configurationFilePath, &operatorCfg)
if err != nil {
return err
}
fmt.Printf(
"Operator configuration file read successfully %s %s\n",
operatorCfg.Operator.Address,
utils.EmojiCheckMark,
)
fmt.Printf("validating operator config: %s %s\n", operatorCfg.Operator.Address, utils.EmojiInfo)

err = operatorCfg.Operator.Validate()
if err != nil {
return fmt.Errorf("%w: with error %s", ErrInvalidYamlFile, err)
}

fmt.Printf(
"Operator configuration file validated successfully %s %s\n",
operatorCfg.Operator.Address,
utils.EmojiCheckMark,
)

logger, err := eigensdkLogger.NewZapLogger(eigensdkLogger.Development)
if err != nil {
return err
}

ethClient, err := eth.NewClient(operatorCfg.EthRPCUrl)
if err != nil {
return err
}

elContractsClient, err := eigenChainio.NewELContractsChainClient(
common.HexToAddress(operatorCfg.ELSlasherAddress),
common.HexToAddress(operatorCfg.BlsPublicKeyCompendiumAddress),
ethClient,
ethClient,
logger)
if err != nil {
return err
}

reader, err := elContracts.NewELChainReader(
elContractsClient,
logger,
ethClient,
)
if err != nil {
return err
}

status, err := reader.IsOperatorRegistered(context.Background(), operatorCfg.Operator)
if err != nil {
return err
}

if status {
fmt.Printf("Operator is registered on EigenLayer %s\n", utils.EmojiCheckMark)
operatorDetails, err := reader.GetOperatorDetails(context.Background(), operatorCfg.Operator)
if err != nil {
return err
}
printOperatorDetails(operatorDetails)
hash, err := reader.GetOperatorPubkeyHash(context.Background(), operatorCfg.Operator)
if err != nil {
return err
}
if hash == [32]byte{} {
fmt.Printf(
"Operator BLS pubkey is empty, please run the register command again %s\n",
utils.EmojiCrossMark,
)
return nil
}
fmt.Printf("Operator BLS pubkey hash registered on EigenLayer %s\n", utils.EmojiCheckMark)
} else {
fmt.Printf("Operator is not registered %s\n", utils.EmojiCrossMark)
}
return nil
},
}
return statusCmd
}

func printOperatorDetails(operator eigensdkTypes.Operator) {
fmt.Println()
fmt.Println("--------------------------- Operator Details ---------------------------")
fmt.Printf("Address: %s\n", operator.Address)
fmt.Printf("Earnings Receiver Address: %s\n", operator.EarningsReceiverAddress)
fmt.Printf("Delegation Approver Address: %s\n", operator.DelegationApproverAddress)
fmt.Printf("Staker Opt Out Window Blocks: %d\n", operator.StakerOptOutWindowBlocks)
fmt.Println("------------------------------------------------------------------------")
fmt.Println()
}
9 changes: 9 additions & 0 deletions pkg/utils/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package utils

const (
EmojiCheckMark = "✅"
EmojiCrossMark = "❌"
EmojiWarning = "⚠️"
EmojiInfo = "ℹ️"
EmojiWait = "⏳"
)

0 comments on commit 5935f71

Please sign in to comment.