From d78cff8e47227aea258895cf691c5ca86f99ccde Mon Sep 17 00:00:00 2001 From: Madhur Shrimal Date: Fri, 13 Oct 2023 16:09:50 -0700 Subject: [PATCH 1/3] tx mgr working tx mgr add from fix err simplify signer and address comments added flow diagram and comments remove unused call --- Makefile | 3 +- chainio/clients/avsregistry/writer.go | 38 ++-- chainio/clients/builder.go | 18 +- chainio/clients/elcontracts/writer.go | 95 +++++---- chainio/txmgr/README.md | 12 ++ chainio/txmgr/simple-tx-manager-flow.png | Bin 0 -> 82096 bytes chainio/txmgr/txmgr.go | 234 +++++++++++++++++++++++ cmd/egnaddrs/main.go | 23 ++- cmd/egnaddrs/main_test.go | 6 +- crypto/ecdsa/utils.go | 25 +++ metrics/eigenmetrics_example_test.go | 10 +- signerv2/config.go | 26 +++ signerv2/signer.go | 76 ++++++++ 13 files changed, 497 insertions(+), 69 deletions(-) create mode 100644 chainio/txmgr/README.md create mode 100644 chainio/txmgr/simple-tx-manager-flow.png create mode 100644 chainio/txmgr/txmgr.go create mode 100644 signerv2/config.go create mode 100644 signerv2/signer.go diff --git a/Makefile b/Makefile index 970162d7..e90154c3 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ GO_LINES_IGNORED_DIRS=contracts GO_PACKAGES=./chainio/... ./crypto/... ./logging/... \ - ./types/... ./utils/... ./signer/... ./cmd/... + ./types/... ./utils/... ./signer/... ./cmd/... \ + ./signerv2/... GO_FOLDERS=$(shell echo ${GO_PACKAGES} | sed -e "s/\.\///g" | sed -e "s/\/\.\.\.//g") help: @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/chainio/clients/avsregistry/writer.go b/chainio/clients/avsregistry/writer.go index beb7b4c5..3917049d 100644 --- a/chainio/clients/avsregistry/writer.go +++ b/chainio/clients/avsregistry/writer.go @@ -2,10 +2,12 @@ package avsregistry import ( "context" + "errors" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + "github.com/Layr-Labs/eigensdk-go/signerv2" "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" "github.com/Layr-Labs/eigensdk-go/logging" - "github.com/Layr-Labs/eigensdk-go/signer" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -40,9 +42,10 @@ type AvsRegistryChainWriter struct { blsOperatorStateRetriever *blsoperatorstateretriever.ContractBLSOperatorStateRetriever stakeRegistry *stakeregistry.ContractStakeRegistry blsPubkeyRegistry *blspubkeyregistry.ContractBLSPubkeyRegistry - signer signer.Signer + signer signerv2.SignerFn logger logging.Logger ethClient eth.EthClient + txMgr txmgr.TxManager } var _ AvsRegistryWriter = (*AvsRegistryChainWriter)(nil) @@ -53,17 +56,17 @@ func NewAvsRegistryWriter( stakeRegistry *stakeregistry.ContractStakeRegistry, blsPubkeyRegistry *blspubkeyregistry.ContractBLSPubkeyRegistry, logger logging.Logger, - signer signer.Signer, ethClient eth.EthClient, + txMgr txmgr.TxManager, ) (*AvsRegistryChainWriter, error) { return &AvsRegistryChainWriter{ registryCoordinator: registryCoordinator, blsOperatorStateRetriever: blsOperatorStateRetriever, stakeRegistry: stakeRegistry, blsPubkeyRegistry: blsPubkeyRegistry, - signer: signer, logger: logger, ethClient: ethClient, + txMgr: txMgr, }, nil } @@ -74,15 +77,18 @@ func (w *AvsRegistryChainWriter) RegisterOperatorWithAVSRegistryCoordinator( socket string, ) (*types.Receipt, error) { w.logger.Info("registering operator with the AVS's registry coordinator") - txOpts := w.signer.GetTxOpts() + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() // TODO: this call will fail if max number of operators are already registered // in that case, need to call churner to kick out another operator. See eigenDA's node/operator.go implementation - tx, err := w.registryCoordinator.RegisterOperatorWithCoordinator1(txOpts, quorumNumbers, pubkey, socket) + tx, err := w.registryCoordinator.RegisterOperatorWithCoordinator1(noSendTxOpts, quorumNumbers, pubkey, socket) if err != nil { return nil, err } + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("tx hash: %s", tx.Hash().String()) - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) w.logger.Info("registered operator with the AVS's registry coordinator") return receipt, nil } @@ -92,13 +98,16 @@ func (w *AvsRegistryChainWriter) UpdateStakes( operators []gethcommon.Address, ) (*types.Receipt, error) { w.logger.Info("updating stakes") - txOpts := w.signer.GetTxOpts() - tx, err := w.stakeRegistry.UpdateStakes(txOpts, operators) + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + tx, err := w.stakeRegistry.UpdateStakes(noSendTxOpts, operators) if err != nil { return nil, err } + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("tx hash: %s", tx.Hash().String()) - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) w.logger.Info("updated stakes") return receipt, nil @@ -110,13 +119,16 @@ func (w *AvsRegistryChainWriter) DeregisterOperator( pubkey blsregistrycoordinator.BN254G1Point, ) (*types.Receipt, error) { w.logger.Info("deregistering operator with the AVS's registry coordinator") - txOpts := w.signer.GetTxOpts() - tx, err := w.registryCoordinator.DeregisterOperatorWithCoordinator(txOpts, quorumNumbers, pubkey) + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + tx, err := w.registryCoordinator.DeregisterOperatorWithCoordinator(noSendTxOpts, quorumNumbers, pubkey) if err != nil { return nil, err } + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("tx hash: %s", tx.Hash().String()) - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) w.logger.Info("deregistered operator with the AVS's registry coordinator") return receipt, nil } diff --git a/chainio/clients/builder.go b/chainio/clients/builder.go index b141175e..bd8197b6 100644 --- a/chainio/clients/builder.go +++ b/chainio/clients/builder.go @@ -4,11 +4,12 @@ import ( avsregistry "github.com/Layr-Labs/eigensdk-go/chainio/clients/avsregistry" elcontracts "github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts" "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" chainioutils "github.com/Layr-Labs/eigensdk-go/chainio/utils" blspubkeycompendium "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSPublicKeyCompendium" logging "github.com/Layr-Labs/eigensdk-go/logging" "github.com/Layr-Labs/eigensdk-go/metrics" - "github.com/Layr-Labs/eigensdk-go/signer" + "github.com/Layr-Labs/eigensdk-go/signerV2" "github.com/ethereum/go-ethereum/accounts/abi/bind" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/prometheus/client_golang/prometheus" @@ -40,7 +41,7 @@ type Clients struct { PrometheusRegistry *prometheus.Registry // Used if avs teams need to register avs-specific metrics } -func BuildAll(config BuildAllConfig, signer signer.Signer, logger logging.Logger) (*Clients, error) { +func BuildAll(config BuildAllConfig, signer signerv2.SignerFn, logger logging.Logger) (*Clients, error) { config.validate(logger) // Create the metrics server @@ -60,11 +61,12 @@ func BuildAll(config BuildAllConfig, signer signer.Signer, logger logging.Logger return nil, err } + txMgr := txmgr.NewSimpleTxManager(ethHttpClient, logger, signer, gethcommon.Address{}) // creating EL clients: Reader, Writer and Subscriber elChainReader, elChainWriter, elChainSubscriber, err := config.buildElClients( ethHttpClient, ethWsClient, - signer, + txMgr, logger, eigenMetrics, ) @@ -76,7 +78,7 @@ func BuildAll(config BuildAllConfig, signer signer.Signer, logger logging.Logger // creating AVS clients: Reader and Writer avsRegistryChainReader, avsRegistryChainWriter, err := config.buildAvsClients( ethHttpClient, - signer, + txMgr, logger, ) if err != nil { @@ -101,7 +103,7 @@ func BuildAll(config BuildAllConfig, signer signer.Signer, logger logging.Logger func (config *BuildAllConfig) buildElClients( ethHttpClient eth.EthClient, ethWsClient eth.EthClient, - signer signer.Signer, + txMgr txmgr.TxManager, logger logging.Logger, eigenMetrics *metrics.EigenMetrics, ) (elcontracts.ELReader, elcontracts.ELWriter, elcontracts.ELSubscriber, error) { @@ -167,9 +169,9 @@ func (config *BuildAllConfig) buildElClients( elContractBindings.BlspubkeyCompendiumAddr, elChainReader, ethHttpClient, - signer, logger, eigenMetrics, + txMgr, ) if err != nil { logger.Error("Failed to create ELChainWriter", "err", err) @@ -181,7 +183,7 @@ func (config *BuildAllConfig) buildElClients( func (config *BuildAllConfig) buildAvsClients( ethHttpClient eth.EthClient, - signer signer.Signer, + txMgr txmgr.TxManager, logger logging.Logger, ) (avsregistry.AvsRegistryReader, avsregistry.AvsRegistryWriter, error) { @@ -215,8 +217,8 @@ func (config *BuildAllConfig) buildAvsClients( avsRegistryContractBindings.StakeRegistry, avsRegistryContractBindings.BlsPubkeyRegistry, logger, - signer, ethHttpClient, + txMgr, ) if err != nil { logger.Error("Failed to create AVSRegistryChainWriter", "err", err) diff --git a/chainio/clients/elcontracts/writer.go b/chainio/clients/elcontracts/writer.go index 8d80d757..41ea8698 100644 --- a/chainio/clients/elcontracts/writer.go +++ b/chainio/clients/elcontracts/writer.go @@ -2,8 +2,10 @@ package elcontracts import ( "context" + "errors" "math/big" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" "github.com/ethereum/go-ethereum/accounts/abi/bind" gethcommon "github.com/ethereum/go-ethereum/common" gethtypes "github.com/ethereum/go-ethereum/core/types" @@ -14,7 +16,6 @@ import ( "github.com/Layr-Labs/eigensdk-go/crypto/bls" "github.com/Layr-Labs/eigensdk-go/logging" "github.com/Layr-Labs/eigensdk-go/metrics" - "github.com/Layr-Labs/eigensdk-go/signer" "github.com/Layr-Labs/eigensdk-go/types" blspubkeycompendium "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSPublicKeyCompendium" @@ -53,8 +54,8 @@ type ELChainWriter struct { blsPubkeyCompendiumAddr gethcommon.Address elChainReader ELReader ethClient eth.EthClient - signer signer.Signer logger logging.Logger + txMgr txmgr.TxManager } var _ ELWriter = (*ELChainWriter)(nil) @@ -68,9 +69,9 @@ func NewELChainWriter( blsPubkeyCompendiumAddr gethcommon.Address, elChainReader ELReader, ethClient eth.EthClient, - signer signer.Signer, logger logging.Logger, eigenMetrics metrics.Metrics, + txMgr txmgr.TxManager, ) *ELChainWriter { return &ELChainWriter{ slasher: slasher, @@ -80,9 +81,9 @@ func NewELChainWriter( blsPubkeyCompendium: blsPubkeyCompendium, blsPubkeyCompendiumAddr: blsPubkeyCompendiumAddr, elChainReader: elChainReader, - signer: signer, logger: logger, ethClient: ethClient, + txMgr: txMgr, } } @@ -90,9 +91,9 @@ func BuildELChainWriter( slasherAddr gethcommon.Address, blsPubKeyCompendiumAddr gethcommon.Address, ethClient eth.EthClient, - signer signer.Signer, logger logging.Logger, eigenMetrics metrics.Metrics, + txMgr txmgr.TxManager, ) (*ELChainWriter, error) { elContractBindings, err := chainioutils.NewEigenlayerContractBindings(slasherAddr, blsPubKeyCompendiumAddr, ethClient, logger) if err != nil { @@ -116,9 +117,9 @@ func BuildELChainWriter( blsPubKeyCompendiumAddr, elChainReader, ethClient, - signer, logger, eigenMetrics, + txMgr, ), nil } @@ -131,15 +132,21 @@ func (w *ELChainWriter) RegisterAsOperator(ctx context.Context, operator types.O EarningsReceiver: gethcommon.HexToAddress(operator.EarningsReceiverAddress), StakerOptOutWindowBlocks: operator.StakerOptOutWindowBlocks, } - txOpts := w.signer.GetTxOpts() - tx, err := w.delegationManager.RegisterAsOperator(txOpts, opDetails, operator.MetadataUrl) + + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } + tx, err := w.delegationManager.RegisterAsOperator(noSendTxOpts, opDetails, operator.MetadataUrl) if err != nil { return nil, err } + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("tx hash: %s", tx.Hash().String()) - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) - w.logger.Infof("registered operator %s with EigenLayer", operator.Address) return receipt, nil } @@ -147,7 +154,6 @@ func (w *ELChainWriter) UpdateOperatorDetails( ctx context.Context, operator types.Operator, ) (*gethtypes.Receipt, error) { - txOpts := w.signer.GetTxOpts() w.logger.Infof("updating operator details of operator %s to EigenLayer", operator.Address) opDetails := delegationmanager.IDelegationManagerOperatorDetails{ @@ -156,20 +162,31 @@ func (w *ELChainWriter) UpdateOperatorDetails( StakerOptOutWindowBlocks: operator.StakerOptOutWindowBlocks, } - tx, err := w.delegationManager.ModifyOperatorDetails(txOpts, opDetails) + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() if err != nil { return nil, err } - w.logger.Infof("tx hash: %s", tx.Hash().String()) - w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) + tx, err := w.delegationManager.ModifyOperatorDetails(noSendTxOpts, opDetails) + if err != nil { + return nil, err + } + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } + w.logger.Infof("tx hash: %s", tx.Hash().String()) w.logger.Infof("updated operator metadata URI for operator %s to EigenLayer", operator.Address) - tx, err = w.delegationManager.UpdateOperatorMetadataURI(txOpts, operator.MetadataUrl) + + tx, err = w.delegationManager.UpdateOperatorMetadataURI(noSendTxOpts, operator.MetadataUrl) if err != nil { return nil, err } + receipt, err = w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("tx hash: %s", tx.Hash().String()) - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) w.logger.Infof("updated operator details of operator %s to EigenLayer", operator.Address) return receipt, nil @@ -181,7 +198,7 @@ func (w *ELChainWriter) DepositERC20IntoStrategy( amount *big.Int, ) (*gethtypes.Receipt, error) { w.logger.Infof("depositing %s tokens into strategy %s", amount.String(), strategyAddr) - txOpts := w.signer.GetTxOpts() + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() _, underlyingTokenContract, underlyingTokenAddr, err := w.elChainReader.GetStrategyAndUnderlyingERC20Token( &bind.CallOpts{Context: ctx}, strategyAddr, @@ -190,40 +207,47 @@ func (w *ELChainWriter) DepositERC20IntoStrategy( return nil, err } - tx, err := underlyingTokenContract.Approve(txOpts, w.strategyManagerAddr, amount) + tx, err := underlyingTokenContract.Approve(noSendTxOpts, w.strategyManagerAddr, amount) if err != nil { return nil, err } - // not sure if this is necessary or if nonce management will be smart enough to queue them one after the other, - // but playing it safe by waiting for approve tx to be mined before sending deposit tx - w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } - tx, err = w.strategyManager.DepositIntoStrategy(txOpts, strategyAddr, underlyingTokenAddr, amount) + tx, err = w.strategyManager.DepositIntoStrategy(noSendTxOpts, strategyAddr, underlyingTokenAddr, amount) if err != nil { return nil, err } - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) + receipt, err = w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("deposited %s into strategy %s", amount.String(), strategyAddr) return receipt, nil } -// operator opting into slashing is the w.signer wallet +// OptOperatorIntoSlashing operator opting into slashing is the w.signer wallet // this is meant to be called by the operator CLI func (w *ELChainWriter) OptOperatorIntoSlashing( ctx context.Context, avsServiceManagerAddr gethcommon.Address, ) (*gethtypes.Receipt, error) { - txOpts := w.signer.GetTxOpts() - tx, err := w.slasher.OptIntoSlashing(txOpts, avsServiceManagerAddr) + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + tx, err := w.slasher.OptIntoSlashing(noSendTxOpts, avsServiceManagerAddr) if err != nil { return nil, err } - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof( "Operator %s opted into slashing by service manager contract %s \n", - txOpts.From, + noSendTxOpts.From, avsServiceManagerAddr, ) return receipt, nil @@ -235,7 +259,7 @@ func (w *ELChainWriter) RegisterBLSPublicKey( operator types.Operator, ) (*gethtypes.Receipt, error) { w.logger.Infof("Registering BLS Public key to eigenlayer for operator %s", operator.Address) - txOpts := w.signer.GetTxOpts() + noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() chainID, err := w.ethClient.ChainID(ctx) if err != nil { return nil, err @@ -245,11 +269,11 @@ func (w *ELChainWriter) RegisterBLSPublicKey( w.blsPubkeyCompendiumAddr, chainID, ) - signedMsgHashBN254 := blspubkeycompendium.BN254G1Point(utils.ConvertToBN254G1Point(signedMsgHash)) - G1pubkeyBN254 := blspubkeycompendium.BN254G1Point(utils.ConvertToBN254G1Point(blsKeyPair.GetPubKeyG1())) - G2pubkeyBN254 := blspubkeycompendium.BN254G2Point(utils.ConvertToBN254G2Point(blsKeyPair.GetPubKeyG2())) + signedMsgHashBN254 := utils.ConvertToBN254G1Point(signedMsgHash) + G1pubkeyBN254 := utils.ConvertToBN254G1Point(blsKeyPair.GetPubKeyG1()) + G2pubkeyBN254 := utils.ConvertToBN254G2Point(blsKeyPair.GetPubKeyG2()) tx, err := w.blsPubkeyCompendium.RegisterBLSPublicKey( - txOpts, + noSendTxOpts, signedMsgHashBN254, G1pubkeyBN254, G2pubkeyBN254, @@ -257,7 +281,10 @@ func (w *ELChainWriter) RegisterBLSPublicKey( if err != nil { return nil, err } - receipt := w.ethClient.WaitForTransactionReceipt(ctx, tx.Hash()) + receipt, err := w.txMgr.Send(ctx, tx) + if err != nil { + return nil, errors.New("failed to send tx with err: " + err.Error()) + } w.logger.Infof("Operator %s has registered BLS public key to EigenLayer \n", operator.Address) return receipt, nil diff --git a/chainio/txmgr/README.md b/chainio/txmgr/README.md new file mode 100644 index 00000000..186d3647 --- /dev/null +++ b/chainio/txmgr/README.md @@ -0,0 +1,12 @@ +## Transaction Manager +Transaction Manager is responsible for +* Building transactions +* Estimating fees and adding buffer +* Signing transactions +* Sending transactions to the network + + +### Simple Transaction Manager +Here's the flow of the simple transaction manager which is used to send smart contract +transactions to the network. +![Simple Transaction Manager](./simple-tx-manager-flow.png) diff --git a/chainio/txmgr/simple-tx-manager-flow.png b/chainio/txmgr/simple-tx-manager-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..4b07b30b57db17decd17f085bacac5904cf8cd07 GIT binary patch literal 82096 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
    $He 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 j0Rl26G1nje@Q1)@UdA7&Hfa{Xeo0 Date: Fri, 8 Dec 2023 16:57:05 -0800 Subject: [PATCH 2/3] fmt --- chainio/clients/avsregistry/writer.go | 1 + chainio/clients/builder.go | 13 ++++++++----- chainio/clients/elcontracts/reader.go | 7 ++++++- chainio/clients/elcontracts/writer.go | 7 ++++++- metrics/eigenmetrics_example_test.go | 2 +- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/chainio/clients/avsregistry/writer.go b/chainio/clients/avsregistry/writer.go index 3917049d..1c287782 100644 --- a/chainio/clients/avsregistry/writer.go +++ b/chainio/clients/avsregistry/writer.go @@ -3,6 +3,7 @@ package avsregistry import ( "context" "errors" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" "github.com/Layr-Labs/eigensdk-go/signerv2" diff --git a/chainio/clients/builder.go b/chainio/clients/builder.go index bd8197b6..47ca9c3b 100644 --- a/chainio/clients/builder.go +++ b/chainio/clients/builder.go @@ -1,15 +1,15 @@ package clients import ( - avsregistry "github.com/Layr-Labs/eigensdk-go/chainio/clients/avsregistry" - elcontracts "github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/avsregistry" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts" "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" chainioutils "github.com/Layr-Labs/eigensdk-go/chainio/utils" blspubkeycompendium "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSPublicKeyCompendium" - logging "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/logging" "github.com/Layr-Labs/eigensdk-go/metrics" - "github.com/Layr-Labs/eigensdk-go/signerV2" + "github.com/Layr-Labs/eigensdk-go/signerv2" "github.com/ethereum/go-ethereum/accounts/abi/bind" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/prometheus/client_golang/prometheus" @@ -147,7 +147,10 @@ func (config *BuildAllConfig) buildElClients( ) // get the Subscriber for the EL contracts - contractBlsPubkeyCompendiumWs, err := blspubkeycompendium.NewContractBLSPublicKeyCompendium(elContractBindings.BlspubkeyCompendiumAddr, ethWsClient) + contractBlsPubkeyCompendiumWs, err := blspubkeycompendium.NewContractBLSPublicKeyCompendium( + elContractBindings.BlspubkeyCompendiumAddr, + ethWsClient, + ) if err != nil { logger.Fatal("Failed to fetch BLSPublicKeyCompendium contract", "err", err) } diff --git a/chainio/clients/elcontracts/reader.go b/chainio/clients/elcontracts/reader.go index f3fee20b..4aec4b79 100644 --- a/chainio/clients/elcontracts/reader.go +++ b/chainio/clients/elcontracts/reader.go @@ -104,7 +104,12 @@ func BuildELChainReader( ethClient eth.EthClient, logger logging.Logger, ) (*ELChainReader, error) { - elContractBindings, err := chainioutils.NewEigenlayerContractBindings(slasherAddr, blsPubKeyCompendiumAddr, ethClient, logger) + elContractBindings, err := chainioutils.NewEigenlayerContractBindings( + slasherAddr, + blsPubKeyCompendiumAddr, + ethClient, + logger, + ) if err != nil { return nil, err } diff --git a/chainio/clients/elcontracts/writer.go b/chainio/clients/elcontracts/writer.go index 41ea8698..6bca00d8 100644 --- a/chainio/clients/elcontracts/writer.go +++ b/chainio/clients/elcontracts/writer.go @@ -95,7 +95,12 @@ func BuildELChainWriter( eigenMetrics metrics.Metrics, txMgr txmgr.TxManager, ) (*ELChainWriter, error) { - elContractBindings, err := chainioutils.NewEigenlayerContractBindings(slasherAddr, blsPubKeyCompendiumAddr, ethClient, logger) + elContractBindings, err := chainioutils.NewEigenlayerContractBindings( + slasherAddr, + blsPubKeyCompendiumAddr, + ethClient, + logger, + ) if err != nil { return nil, err } diff --git a/metrics/eigenmetrics_example_test.go b/metrics/eigenmetrics_example_test.go index 610d00d9..7991b069 100644 --- a/metrics/eigenmetrics_example_test.go +++ b/metrics/eigenmetrics_example_test.go @@ -14,7 +14,7 @@ import ( "github.com/Layr-Labs/eigensdk-go/metrics" "github.com/Layr-Labs/eigensdk-go/metrics/collectors/economic" rpccalls "github.com/Layr-Labs/eigensdk-go/metrics/collectors/rpc_calls" - "github.com/Layr-Labs/eigensdk-go/signerV2" + "github.com/Layr-Labs/eigensdk-go/signerv2" "github.com/Layr-Labs/eigensdk-go/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" From 8c55c0eab9b45b0ae41d8016d18a6fc68ec1c8ca Mon Sep 17 00:00:00 2001 From: Madhur Shrimal Date: Fri, 8 Dec 2023 17:03:45 -0800 Subject: [PATCH 3/3] fix linting --- Makefile | 8 ++++++-- chainio/clients/avsregistry/writer.go | 14 ++++++++++---- chainio/clients/elcontracts/writer.go | 17 +++++++++++++---- metrics/eigenmetrics_example_test.go | 3 +++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index e90154c3..aa2b821b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ############################# HELP MESSAGE ############################# # Make sure the help command stays first, so that it's printed by default when `make` is called without arguments -.PHONY: help bindings mocks tests tests-cover fmt format-lines +.PHONY: help bindings mocks tests tests-cover fmt format-lines lint GO_LINES_IGNORED_DIRS=contracts GO_PACKAGES=./chainio/... ./crypto/... ./logging/... \ @@ -44,4 +44,8 @@ fmt: ## formats all go files format-lines: ## formats all go files with golines go install github.com/segmentio/golines@latest - golines -w -m 120 --ignore-generated --shorten-comments --ignored-dirs=${GO_LINES_IGNORED_DIRS} ${GO_FOLDERS} \ No newline at end of file + golines -w -m 120 --ignore-generated --shorten-comments --ignored-dirs=${GO_LINES_IGNORED_DIRS} ${GO_FOLDERS} + +lint: ## runs all linters + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest + golangci-lint run ./... \ No newline at end of file diff --git a/chainio/clients/avsregistry/writer.go b/chainio/clients/avsregistry/writer.go index 1c287782..c5a65d65 100644 --- a/chainio/clients/avsregistry/writer.go +++ b/chainio/clients/avsregistry/writer.go @@ -4,10 +4,8 @@ import ( "context" "errors" - "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" - "github.com/Layr-Labs/eigensdk-go/signerv2" - "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" "github.com/Layr-Labs/eigensdk-go/logging" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -43,7 +41,6 @@ type AvsRegistryChainWriter struct { blsOperatorStateRetriever *blsoperatorstateretriever.ContractBLSOperatorStateRetriever stakeRegistry *stakeregistry.ContractStakeRegistry blsPubkeyRegistry *blspubkeyregistry.ContractBLSPubkeyRegistry - signer signerv2.SignerFn logger logging.Logger ethClient eth.EthClient txMgr txmgr.TxManager @@ -79,6 +76,9 @@ func (w *AvsRegistryChainWriter) RegisterOperatorWithAVSRegistryCoordinator( ) (*types.Receipt, error) { w.logger.Info("registering operator with the AVS's registry coordinator") noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } // TODO: this call will fail if max number of operators are already registered // in that case, need to call churner to kick out another operator. See eigenDA's node/operator.go implementation tx, err := w.registryCoordinator.RegisterOperatorWithCoordinator1(noSendTxOpts, quorumNumbers, pubkey, socket) @@ -100,6 +100,9 @@ func (w *AvsRegistryChainWriter) UpdateStakes( ) (*types.Receipt, error) { w.logger.Info("updating stakes") noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } tx, err := w.stakeRegistry.UpdateStakes(noSendTxOpts, operators) if err != nil { return nil, err @@ -121,6 +124,9 @@ func (w *AvsRegistryChainWriter) DeregisterOperator( ) (*types.Receipt, error) { w.logger.Info("deregistering operator with the AVS's registry coordinator") noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } tx, err := w.registryCoordinator.DeregisterOperatorWithCoordinator(noSendTxOpts, quorumNumbers, pubkey) if err != nil { return nil, err diff --git a/chainio/clients/elcontracts/writer.go b/chainio/clients/elcontracts/writer.go index 6bca00d8..7864ce83 100644 --- a/chainio/clients/elcontracts/writer.go +++ b/chainio/clients/elcontracts/writer.go @@ -176,7 +176,7 @@ func (w *ELChainWriter) UpdateOperatorDetails( if err != nil { return nil, err } - receipt, err := w.txMgr.Send(ctx, tx) + _, err = w.txMgr.Send(ctx, tx) if err != nil { return nil, errors.New("failed to send tx with err: " + err.Error()) } @@ -187,7 +187,7 @@ func (w *ELChainWriter) UpdateOperatorDetails( if err != nil { return nil, err } - receipt, err = w.txMgr.Send(ctx, tx) + receipt, err := w.txMgr.Send(ctx, tx) if err != nil { return nil, errors.New("failed to send tx with err: " + err.Error()) } @@ -204,6 +204,9 @@ func (w *ELChainWriter) DepositERC20IntoStrategy( ) (*gethtypes.Receipt, error) { w.logger.Infof("depositing %s tokens into strategy %s", amount.String(), strategyAddr) noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } _, underlyingTokenContract, underlyingTokenAddr, err := w.elChainReader.GetStrategyAndUnderlyingERC20Token( &bind.CallOpts{Context: ctx}, strategyAddr, @@ -216,7 +219,7 @@ func (w *ELChainWriter) DepositERC20IntoStrategy( if err != nil { return nil, err } - receipt, err := w.txMgr.Send(ctx, tx) + _, err = w.txMgr.Send(ctx, tx) if err != nil { return nil, errors.New("failed to send tx with err: " + err.Error()) } @@ -225,7 +228,7 @@ func (w *ELChainWriter) DepositERC20IntoStrategy( if err != nil { return nil, err } - receipt, err = w.txMgr.Send(ctx, tx) + receipt, err := w.txMgr.Send(ctx, tx) if err != nil { return nil, errors.New("failed to send tx with err: " + err.Error()) } @@ -241,6 +244,9 @@ func (w *ELChainWriter) OptOperatorIntoSlashing( avsServiceManagerAddr gethcommon.Address, ) (*gethtypes.Receipt, error) { noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } tx, err := w.slasher.OptIntoSlashing(noSendTxOpts, avsServiceManagerAddr) if err != nil { return nil, err @@ -265,6 +271,9 @@ func (w *ELChainWriter) RegisterBLSPublicKey( ) (*gethtypes.Receipt, error) { w.logger.Infof("Registering BLS Public key to eigenlayer for operator %s", operator.Address) noSendTxOpts, err := w.txMgr.GetNoSendTxOpts() + if err != nil { + return nil, err + } chainID, err := w.ethClient.ChainID(ctx) if err != nil { return nil, err diff --git a/metrics/eigenmetrics_example_test.go b/metrics/eigenmetrics_example_test.go index 7991b069..445cb957 100644 --- a/metrics/eigenmetrics_example_test.go +++ b/metrics/eigenmetrics_example_test.go @@ -39,6 +39,9 @@ func ExampleEigenMetrics() { } signerV2, _, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: ecdsaPrivateKey}, big.NewInt(1)) + if err != nil { + panic(err) + } chainioConfig := clients.BuildAllConfig{ EthHttpUrl: "http://localhost:8545",