Skip to content
Open
Show file tree
Hide file tree
Changes from 7 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ go.work
# configuration
.docker
.env
.idea
10 changes: 7 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ build-oprcli: check-go check-git
-X 'github.com/Eoracle/core-go/versioning.Commit=$(COMMIT_HASH)'\
-X 'github.com/Eoracle/core-go/versioning.Branch=$(BRANCH)'\
-X 'github.com/Eoracle/core-go/versioning.BuildTime=$(TIME)'" \
cmd/operatorcli/main.go
main.go

.PHONY: build-oprcli-arm64
build-oprcli-arm64: check-go check-git
Expand All @@ -36,7 +36,7 @@ build-oprcli-arm64: check-go check-git
-X 'github.com/Eoracle/core-go/versioning.Commit=$(COMMIT_HASH)'\
-X 'github.com/Eoracle/core-go/versioning.Branch=$(BRANCH)'\
-X 'github.com/Eoracle/core-go/versioning.BuildTime=$(TIME)'" \
cmd/operatorcli/main.go
main.go

.PHONY: build-oprcli-amd64
build-oprcli-amd64: check-go check-git
Expand All @@ -45,7 +45,7 @@ build-oprcli-amd64: check-go check-git
-X 'github.com/Eoracle/core-go/versioning.Commit=$(COMMIT_HASH)'\
-X 'github.com/Eoracle/core-go/versioning.Branch=$(BRANCH)'\
-X 'github.com/Eoracle/core-go/versioning.BuildTime=$(TIME)'" \
cmd/operatorcli/main.go
main.go

# Build Docker images for AMD64 and ARM64
.PHONY: docker-build-oprcli
Expand Down Expand Up @@ -74,3 +74,7 @@ docker-push-oprcli-latest:
.PHONY: clean
clean:
rm -rf $(BINARY_DIR)

generate-bindings:
@echo "Generating bindings"
@go generate ./...
21 changes: 21 additions & 0 deletions cmd/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package cmd

import (
"github.com/Layr-Labs/eigensdk-go/logging"
gethcommon "github.com/ethereum/go-ethereum/common"
)

var (
profile *NetworkProfile
logger, _ = logging.NewZapLogger(logging.Production)
)

type NetworkProfile struct {
NetworkName string

EOConfigAddress gethcommon.Address
RegistryCoordinatorAddress gethcommon.Address

EOChainRPCEndpoint string
EthRPCEndpoint string
}
110 changes: 110 additions & 0 deletions cmd/declare_alias.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package cmd

import (
"context"
"crypto/ecdsa"
"github.com/Layr-Labs/eigensdk-go/chainio/clients/wallet"
"github.com/Layr-Labs/eigensdk-go/chainio/txmgr"
"github.com/Layr-Labs/eigensdk-go/signerv2"
eoconfig "github.com/eoracle/eoracle-operator-cli/contracts/bindings/EOConfig"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/crypto"
"github.com/urfave/cli/v2"
)

func NewDeclareAliasCommand() *cli.Command {
return &cli.Command{
Name: "declare-alias",
Description: "Declare the alias in the eochain",
Before: setProfile,
Action: runDeclareAlias,
Flags: []cli.Flag{
ProfileFlag,
PassphraseFlag,
KeyStorePathFlag,
EOChainRPCFlag,
EOConfigAddressFlag,
},
}
}

func runDeclareAlias(c *cli.Context) error {
if !c.IsSet(PassphraseFlag.Name) || !c.IsSet(KeyStorePathFlag.Name) {
utils.Fatalf("passphrase and keystore-path are required")
}

ethEcdsaPair, aliasEcdsaPair, err := getOperatorAndAliasKeys(c)
if err != nil {
return err
}

txMgr, contractEOConfig, err := getTxMgrForEOChain(ethEcdsaPair)
if err != nil {
return err
}

noSendTxOpts, err := txMgr.GetNoSendTxOpts()
if err != nil {
utils.Fatalf("Error creating transaction object %v", err)
}

tx, err := contractEOConfig.DeclareAlias(
noSendTxOpts,
crypto.PubkeyToAddress(aliasEcdsaPair.PublicKey),
)
if err != nil {
utils.Fatalf("Failed to create EOConfig.declareAlias transaction %v", err)
}

ctx := context.Background()
receipt, err := txMgr.Send(ctx, tx, true)
if err != nil {
utils.Fatalf("declareAlias transaction failed %s", err)
}

if receipt.Status != 1 {
utils.Fatalf(
"declareAlias transaction %v for operator %v on Ethereum mainnet/Holesky (%v) reverted",
receipt.TxHash.Hex(),
crypto.PubkeyToAddress(ethEcdsaPair.PublicKey),
profile.EOChainRPCEndpoint,
)
}

logger.Info(
"successfully declared an alias in the eochain",
"Ethereum address", crypto.PubkeyToAddress(ethEcdsaPair.PublicKey),
"eochain address", crypto.PubkeyToAddress(aliasEcdsaPair.PublicKey),
"tx hash", receipt.TxHash.Hex(),
)
return nil
}

func getTxMgrForEOChain(ethEcdsaPair *ecdsa.PrivateKey) (*txmgr.SimpleTxManager, *eoconfig.EOConfig, error) {
ethClient, err := createEthClient(profile.EOChainRPCEndpoint)
if err != nil {
return nil, nil, err
}

chainIDBigInt, err := ethClient.ChainID(context.Background())
if err != nil {
utils.Fatalf("cannot get chainId (%v): %v", profile.EOChainRPCEndpoint, err)
}

signerV2, signerAddr, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: ethEcdsaPair}, chainIDBigInt)
if err != nil {
utils.Fatalf("Error creating the signer function for %v %v", crypto.PubkeyToAddress(ethEcdsaPair.PublicKey), err)
}
txSender, err := wallet.NewPrivateKeyWallet(ethClient, signerV2, signerAddr, logger)
if err != nil {
utils.Fatalf("Failed to create transaction sender for declaring alias of operator %v on eoChain (%v) %v",
crypto.PubkeyToAddress(ethEcdsaPair.PublicKey), profile.EOChainRPCEndpoint, err)
}

contractEOConfig, err := eoconfig.NewEOConfig(profile.EOConfigAddress, ethClient)
if err != nil {
utils.Fatalf("Failed to bind the eoconfig contract %v", err)
}

return txmgr.NewSimpleTxManager(txSender, ethClient, logger, signerAddr), contractEOConfig, nil
}
52 changes: 52 additions & 0 deletions cmd/decrypt.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package cmd

import (
"encoding/hex"
"errors"
"fmt"
eigensdkecdsa "github.com/Layr-Labs/eigensdk-go/crypto/ecdsa"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/crypto"
"github.com/urfave/cli/v2"
"os"
"path/filepath"
)

func NewDecryptCommand() *cli.Command {
return &cli.Command{
Name: "decrypt",
Description: "Decrypt the ecdsa and bls private keys",
Action: runDecrypt,
Flags: []cli.Flag{
PassphraseFlag,
KeyStorePathFlag,
},
}
}

func runDecrypt(c *cli.Context) error {
ecdsaPair, err := getECDSAPrivateKey(c)
if err != nil {
utils.Fatalf("Error reading the ecdsaEncryptedWallet.json file %v", err)
}
fmt.Println("ecdsa address ", crypto.PubkeyToAddress(ecdsaPair.PublicKey), "private key", hex.EncodeToString(ecdsaPair.D.Bytes()))

ecdsaEOChainPair, err := eigensdkecdsa.ReadKey(filepath.Join(c.String(KeyStorePathFlag.Name), "ecdsaAliasedEncryptedWallet.json"), c.String(PassphraseFlag.Name))
if err != nil {
if errors.Is(err, os.ErrNotExist) {
fmt.Println("eochain alias was not set in the system")
return nil
}
utils.Fatalf("Error reading the ecdsaAliasedEncryptedWallet.json file %v", err)
}
fmt.Println("EOChain ecdsa address ", crypto.PubkeyToAddress(ecdsaEOChainPair.PublicKey), "private key", hex.EncodeToString(ecdsaEOChainPair.D.Bytes()))

blsKeyPair, err := getBLSPrivateKey(c)
if err != nil {
utils.Fatalf("Error reading the blsEncryptedWallet.json file %v", err)
}

fmt.Println("bls address G1, G2 ", blsKeyPair.GetPubKeyG1().String(), ", ", blsKeyPair.GetPubKeyG2().String(), "private key", blsKeyPair.PrivKey.String())

return nil
}
122 changes: 122 additions & 0 deletions cmd/deregister.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package cmd

import (
"context"
"github.com/Layr-Labs/eigensdk-go/chainio/clients/wallet"
"github.com/Layr-Labs/eigensdk-go/chainio/txmgr"
"github.com/Layr-Labs/eigensdk-go/signerv2"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/crypto"
"github.com/urfave/cli/v2"
)

func NewDeregisterCommand() *cli.Command {
return &cli.Command{
Name: "deregister",
Description: "Deregister the operator",
Before: setProfile,
Action: runDeregister,
Flags: []cli.Flag{
ProfileFlag,
EthRPCFlag,
RegistryCoordinatorFlag,
PassphraseFlag,
KeyStorePathFlag,
EcdsaPrivateKeyFlag,
QuorumNumberFlag,
},
}
}

func runDeregister(c *cli.Context) error {
if !c.IsSet(PassphraseFlag.Name) || !c.IsSet(KeyStorePathFlag.Name) {
utils.Fatalf("passphrase and keystore-path are required")
}

ecdsaPair, err := getECDSAPrivateKey(c)
if err != nil {
return err
}

ethClient, err := createEthClient(profile.EthRPCEndpoint)
if err != nil {
return err
}

chainIDBigInt, err := ethClient.ChainID(context.Background())
if err != nil {
utils.Fatalf("cannot get chainId (%v): %v", profile.EthRPCEndpoint, err)
}

avsClient, err := buildAVSClient(ethClient)
if err != nil {
utils.Fatalf("Error creating AVS client %v", err)
}

signerV2, signerAddr, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: ecdsaPair}, chainIDBigInt)
if err != nil {
utils.Fatalf(
"Error creating the deregister transaction signer for operator %v on Ethereum mainnet/Holesky (%v) %v",
crypto.PubkeyToAddress(ecdsaPair.PublicKey),
profile.EthRPCEndpoint,
err,
)
}

txSender, err := wallet.NewPrivateKeyWallet(ethClient, signerV2, signerAddr, logger)
if err != nil {
utils.Fatalf(
"Error creating the deregister transaction sender for operator %v on Ethereum mainnet/Holesky (%v) %v",
crypto.PubkeyToAddress(ecdsaPair.PublicKey),
profile.EthRPCEndpoint,
err,
)
}

txMgr := txmgr.NewSimpleTxManager(txSender, ethClient, logger, signerAddr)
noSendTxOpts, err := txMgr.GetNoSendTxOpts()
if err != nil {
utils.Fatalf("Error creating transaction object %v", err)
}

tx, err := avsClient.registryCoordinator.DeregisterOperator(
noSendTxOpts,
crypto.PubkeyToAddress(ecdsaPair.PublicKey),
[]uint32{0},
)
if err != nil {
utils.Fatalf(
"Error creating the deregister transaction for operator %v on Ethereum mainnet/Holesky (%v) %v",
crypto.PubkeyToAddress(ecdsaPair.PublicKey),
profile.EthRPCEndpoint,
err,
)
}

ctx := context.Background()
receipt, err := txMgr.Send(ctx, tx, true)
if err != nil {
utils.Fatalf(
"deregister transaction for operator %v on Ethereum mainnet/Holesky (%v) failed %v",
crypto.PubkeyToAddress(ecdsaPair.PublicKey),
profile.EthRPCEndpoint,
err,
)
}
if receipt.Status != 1 {
utils.Fatalf(
"deregister transaction %v for operator %v on Ethereum mainnet/Holesky (%v) reverted",
receipt.TxHash.Hex(),
crypto.PubkeyToAddress(ecdsaPair.PublicKey),
profile.EthRPCEndpoint,
)
}

logger.Info(
"successfully deregistered from eoracle AVS",
"address", signerAddr,
"tx hash", receipt.TxHash.Hex(),
)

return nil
}
Loading
Loading