Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactored elcontracts and avsregistry builders to use wire dependency injection #297

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: check mocks up-to-date
name: check generated files (mocks+wire) up-to-date
on:
push:
branches:
Expand All @@ -10,7 +10,7 @@ permissions:

jobs:
make-mocks:
name: make mocks and check for diffs
name: make generate (mocks+wire) and check for diffs
runs-on: ubuntu-latest
steps:
- name: checkout repo
Expand All @@ -21,9 +21,9 @@ jobs:
with:
go-version: "1.21"

- name: run make mocks and check for diffs
- name: run make generate and check for diffs
run: |
make mocks
make generate
if [ ! -z "$(git status --porcelain)" ]; then
printf "Current generated mocks not up to date\n"
git diff
Expand Down
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ help:
bindings: ## generates contract bindings
cd contracts && rm -rf bindings/* && ./generate-bindings.sh

mocks: ## generates mocks
generate: ## generates mocks and wire files
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we need to couple these 2 generation? any particular reason or just to combine generation together?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to separate go generated stuff? Right now if we run go generate it just looks for all the go:generate comments in the repo and executed all of them. Maybe there’s a way to tag the generate commands with subtask names and get go generate to filter on those?

go install go.uber.org/mock/[email protected]
go install github.com/google/wire/cmd/[email protected]
go generate ./...

tests: ## runs all tests
Expand Down
18 changes: 6 additions & 12 deletions chainio/clients/avsregistry/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,26 +128,20 @@ func NewChainReader(
}
}

// NewReaderFromConfig creates a new ChainReader
func NewReaderFromConfig(
cfg Config,
client eth.Client,
func NewChainReaderFromBindings(
bindings *ContractBindings,
ethClient eth.Client,
logger logging.Logger,
) (*ChainReader, error) {
bindings, err := NewBindingsFromConfig(cfg, client, logger)
if err != nil {
return nil, err
}

) *ChainReader {
return NewChainReader(
bindings.RegistryCoordinatorAddr,
bindings.BlsApkRegistryAddr,
bindings.RegistryCoordinator,
bindings.OperatorStateRetriever,
bindings.StakeRegistry,
logger,
client,
), nil
ethClient,
)
}

// BuildAvsRegistryChainReader creates a new ChainReader
Expand Down
22 changes: 7 additions & 15 deletions chainio/clients/avsregistry/subscriber.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ func NewChainSubscriber(
}
}

func NewChainSubscriberFromBindings(
bindings *ContractBindings,
logger logging.Logger,
) *ChainSubscriber {
return NewChainSubscriber(bindings.RegistryCoordinator, bindings.BlsApkRegistry, logger)
}

// BuildAvsRegistryChainSubscriber creates a new instance of ChainSubscriber
// Deprecated: Use NewSubscriberFromConfig instead
func BuildAvsRegistryChainSubscriber(
Expand All @@ -64,21 +71,6 @@ func BuildAvsRegistryChainSubscriber(
return NewChainSubscriber(regCoord, blsApkReg, logger), nil
}

// NewSubscriberFromConfig creates a new instance of ChainSubscriber
// A websocket ETH Client must be provided
func NewSubscriberFromConfig(
cfg Config,
wsClient eth.Client,
logger logging.Logger,
) (*ChainSubscriber, error) {
bindings, err := NewBindingsFromConfig(cfg, wsClient, logger)
if err != nil {
return nil, err
}

return NewChainSubscriber(bindings.RegistryCoordinator, bindings.BlsApkRegistry, logger), nil
}

func (s *ChainSubscriber) SubscribeToNewPubkeyRegistrations() (chan *blsapkreg.ContractBLSApkRegistryNewPubkeyRegistration, event.Subscription, error) {
newPubkeyRegistrationChan := make(chan *blsapkreg.ContractBLSApkRegistryNewPubkeyRegistration)
sub, err := s.blsApkRegistry.WatchNewPubkeyRegistration(
Expand Down
121 changes: 121 additions & 0 deletions chainio/clients/avsregistry/wire_builder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
//go:build wireinject
// +build wireinject

package avsregistry

import (
"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"
"github.com/Layr-Labs/eigensdk-go/logging"
"github.com/google/wire"
)

func NewReaderFromConfig(
cfg Config,
ethClient eth.Client,
logger logging.Logger,
) (*ChainReader, error) {
wire.Build(NewBindingsFromConfig, NewChainReaderFromBindings)
return &ChainReader{}, nil
}

// including here because needed in NewWriterFromConfig
func NewElConfigFromAvsBindings(
bindings *ContractBindings,
) elcontracts.Config {
return elcontracts.Config{
// TODO: missing RewardsCoordinatorAddr in bindings, because no other contract points to
// RewardsCoordinator so bindings doesn't return that address...
// Ways to fix this bug:
// 1. Make some other contract point to RewardsCoordinator so we can get the address from bindings
// 2. Pass RewardsCoordinatorAddr as a parameter to NewAVSRegistryContractBindings
// 3. Pass RewardsCoordinatorAddr as a parameter to this function and NewWriterFromConfig
DelegationManagerAddress: bindings.DelegationManagerAddr,
AvsDirectoryAddress: bindings.AvsDirectoryAddr,
}
}

func NewWriterFromConfig(
cfg Config,
ethClient eth.Client,
txMgr txmgr.TxManager,
logger logging.Logger,
) (*ChainWriter, error) {
wire.Build(
NewBindingsFromConfig,
NewElConfigFromAvsBindings,
elcontracts.NewReaderFromConfig,
wire.Bind(new(elcontracts.Reader), new(*elcontracts.ChainReader)),
NewChainWriterFromBindings,
)
return &ChainWriter{}, nil
}

// Note that unlike reader/writer, a websocket eth client must be provided
func NewSubscriberFromConfig(
cfg Config,
wsClient eth.Client,
logger logging.Logger,
) (*ChainSubscriber, error) {
wire.Build(NewBindingsFromConfig, NewChainSubscriberFromBindings)
return &ChainSubscriber{}, nil
}

type ClientsAndBindings struct {
ChainReader *ChainReader
ChainWriter *ChainWriter
ChainSubscriber *ChainSubscriber
ContractBindings *ContractBindings
}

// ============= Workaround Code =================
// this section is needed because wire does not allow a Build dependency graph
// with two dependencies of the same type. See:
// https://github.com/google/wire/blob/main/docs/faq.md#what-if-my-dependency-graph-has-two-dependencies-of-the-same-type
// In BuildClientsFromConfig since both ethHttpClient and ethWsClient have type eth.Client,
// we need to wrap one of them in a new type to avoid the error.
type ethWsClient eth.Client

func newEthWsClient(
wsClient eth.Client,
) ethWsClient {
return (ethWsClient)(wsClient)
}

func newSubscriberFromConfigWithEthWsClientType(
cfg Config,
wsClient ethWsClient,
logger logging.Logger,
) (*ChainSubscriber, error) {
return NewSubscriberFromConfig(cfg, eth.Client(wsClient), logger)
}

func buildClientsFromConfig(
cfg Config,
ethHttpClient eth.Client,
ethWsClient ethWsClient,
txMgr txmgr.TxManager,
logger logging.Logger,
) (*ClientsAndBindings, error) {
wire.Build(
NewBindingsFromConfig,
NewReaderFromConfig,
NewWriterFromConfig,
newSubscriberFromConfigWithEthWsClientType,
wire.Struct(new(ClientsAndBindings), "*"),
)
return &ClientsAndBindings{}, nil
}

// ============= End of Workaround Code =================

func BuildClientsFromConfig(
cfg Config,
ethHttpClient eth.Client,
ethWsClient eth.Client,
txMgr txmgr.TxManager,
logger logging.Logger,
) (*ClientsAndBindings, error) {
return buildClientsFromConfig(cfg, ethHttpClient, ethWsClient, txMgr, logger)
}
127 changes: 127 additions & 0 deletions chainio/clients/avsregistry/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading