Skip to content

Commit

Permalink
refactored elcontracts and avsregistry builders to use wire dependenc…
Browse files Browse the repository at this point in the history
…y injection
  • Loading branch information
samlaf committed Jul 14, 2024
1 parent 4b1bb2a commit cf1bc90
Show file tree
Hide file tree
Showing 14 changed files with 494 additions and 139 deletions.
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
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

0 comments on commit cf1bc90

Please sign in to comment.