package accounts import ( "context" "github.com/pkg/errors" grpcutil "github.com/prysmaticlabs/prysm/api/grpc" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/validator/accounts/wallet" "github.com/prysmaticlabs/prysm/validator/keymanager" "google.golang.org/grpc" ) // NewCLIManager allows for managing validator accounts via CLI commands. func NewCLIManager(opts ...Option) (*AccountsCLIManager, error) { acc := &AccountsCLIManager{} for _, opt := range opts { if err := opt(acc); err != nil { return nil, err } } return acc, nil } // AccountsCLIManager defines a struct capable of performing various validator // wallet account operations via the command line. type AccountsCLIManager struct { wallet *wallet.Wallet keymanager keymanager.IKeymanager showDepositData bool showPrivateKeys bool listValidatorIndices bool deletePublicKeys bool dialOpts []grpc.DialOption grpcHeaders []string beaconRPCProvider string filteredPubKeys []bls.PublicKey walletKeyCount int } func (acm *AccountsCLIManager) prepareBeaconClients(ctx context.Context) (*ethpb.BeaconNodeValidatorClient, *ethpb.NodeClient, error) { if acm.dialOpts == nil { return nil, nil, errors.New("failed to construct dial options for beacon clients") } ctx = grpcutil.AppendHeaders(ctx, acm.grpcHeaders) conn, err := grpc.DialContext(ctx, acm.beaconRPCProvider, acm.dialOpts...) if err != nil { return nil, nil, errors.Wrapf(err, "could not dial endpoint %s", acm.beaconRPCProvider) } validatorClient := ethpb.NewBeaconNodeValidatorClient(conn) nodeClient := ethpb.NewNodeClient(conn) return &validatorClient, &nodeClient, nil }