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

feat: Rewards coordinator storage part2 #567

Merged
merged 5 commits into from
Feb 14, 2025
Merged
Show file tree
Hide file tree
Changes from 4 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
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ lint: ## runs all linters

___BINDINGS___: ##

core_default := "DelegationManager IRewardsCoordinator StrategyManager EigenPod EigenPodManager IStrategy AVSDirectory AllocationManager PermissionController"
core_default := "DelegationManager RewardsCoordinator StrategyManager EigenPod EigenPodManager IStrategy AVSDirectory AllocationManager PermissionController"
core_location := "./lib/eigenlayer-middleware/lib/eigenlayer-contracts"
core_bindings_location := "../../../../bindings"

Expand Down
8 changes: 4 additions & 4 deletions chainio/clients/elcontracts/bindings.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
avsdirectory "github.com/Layr-Labs/eigensdk-go/contracts/bindings/AVSDirectory"
allocationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/AllocationManager"
delegationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/DelegationManager"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IRewardsCoordinator"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RewardsCoordinator"
strategymanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/StrategyManager"
"github.com/Layr-Labs/eigensdk-go/logging"
"github.com/Layr-Labs/eigensdk-go/utils"
Expand All @@ -30,7 +30,7 @@ type ContractBindings struct {
DelegationManager *delegationmanager.ContractDelegationManager
StrategyManager *strategymanager.ContractStrategyManager
AvsDirectory *avsdirectory.ContractAVSDirectory
RewardsCoordinator *rewardscoordinator.ContractIRewardsCoordinator
RewardsCoordinator *rewardscoordinator.ContractRewardsCoordinator
AllocationManager *allocationmanager.ContractAllocationManager
PermissionController *permissioncontroller.ContractPermissionController
}
Expand All @@ -49,7 +49,7 @@ func NewBindingsFromConfig(
strategyManagerAddr gethcommon.Address
allocationManagerAddr gethcommon.Address
avsDirectory *avsdirectory.ContractAVSDirectory
rewardsCoordinator *rewardscoordinator.ContractIRewardsCoordinator
rewardsCoordinator *rewardscoordinator.ContractRewardsCoordinator
permissionController *permissioncontroller.ContractPermissionController
)

Expand Down Expand Up @@ -104,7 +104,7 @@ func NewBindingsFromConfig(
if isZeroAddress(cfg.RewardsCoordinatorAddress) {
logger.Debug("RewardsCoordinator address not provided, the calls to the contract will not work")
} else {
rewardsCoordinator, err = rewardscoordinator.NewContractIRewardsCoordinator(cfg.RewardsCoordinatorAddress, client)
rewardsCoordinator, err = rewardscoordinator.NewContractRewardsCoordinator(cfg.RewardsCoordinatorAddress, client)
if err != nil {
return nil, utils.WrapError("Failed to fetch RewardsCoordinator contract", err)
}
Expand Down
92 changes: 89 additions & 3 deletions chainio/clients/elcontracts/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import (
allocationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/AllocationManager"
delegationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/DelegationManager"
erc20 "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IERC20"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IRewardsCoordinator"
strategy "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IStrategy"
permissioncontroller "github.com/Layr-Labs/eigensdk-go/contracts/bindings/PermissionController"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RewardsCoordinator"
strategymanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/StrategyManager"
"github.com/Layr-Labs/eigensdk-go/logging"
"github.com/Layr-Labs/eigensdk-go/types"
Expand All @@ -35,7 +35,7 @@ type ChainReader struct {
delegationManager *delegationmanager.ContractDelegationManager
strategyManager *strategymanager.ContractStrategyManager
avsDirectory *avsdirectory.ContractAVSDirectory
rewardsCoordinator *rewardscoordinator.ContractIRewardsCoordinator
rewardsCoordinator *rewardscoordinator.ContractRewardsCoordinator
allocationManager *allocationmanager.ContractAllocationManager
permissionController *permissioncontroller.ContractPermissionController
ethClient eth.HttpBackend
Expand All @@ -48,7 +48,7 @@ func NewChainReader(
delegationManager *delegationmanager.ContractDelegationManager,
strategyManager *strategymanager.ContractStrategyManager,
avsDirectory *avsdirectory.ContractAVSDirectory,
rewardsCoordinator *rewardscoordinator.ContractIRewardsCoordinator,
rewardsCoordinator *rewardscoordinator.ContractRewardsCoordinator,
allocationManager *allocationmanager.ContractAllocationManager,
permissionController *permissioncontroller.ContractPermissionController,
logger logging.Logger,
Expand Down Expand Up @@ -515,6 +515,92 @@ func (r *ChainReader) GetClaimerFor(
return r.rewardsCoordinator.ClaimerFor(&bind.CallOpts{Context: ctx}, earner)
}

// Returns the submission nonce for an avs
func (r *ChainReader) GetSubmissionNonce(
ctx context.Context,
avs gethcommon.Address,
) (*big.Int, error) {
if r.rewardsCoordinator == nil {
return nil, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.SubmissionNonce(&bind.CallOpts{Context: ctx}, avs)
}

// Returns whether a hash is a valid rewards submission hash for a given avs
func (r *ChainReader) GetIsAVSRewardsSubmissionHash(
ctx context.Context,
avs gethcommon.Address,
hash [32]byte,
) (bool, error) {
if r.rewardsCoordinator == nil {
return false, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.IsAVSRewardsSubmissionHash(&bind.CallOpts{Context: ctx}, avs, hash)
}

// Returns whether a hash is a valid rewards submission for all hash for a given avs
func (r *ChainReader) GetIsRewardsSubmissionForAllHash(
ctx context.Context,
avs gethcommon.Address,
hash [32]byte,
) (bool, error) {
if r.rewardsCoordinator == nil {
return false, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.IsRewardsSubmissionForAllHash(&bind.CallOpts{Context: ctx}, avs, hash)
}

// Returns whether a submitter is a valid rewards for all submitter
func (r *ChainReader) GetIsRewardsForAllSubmitter(
ctx context.Context,
submitter gethcommon.Address,
) (bool, error) {
if r.rewardsCoordinator == nil {
return false, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.IsRewardsForAllSubmitter(&bind.CallOpts{Context: ctx}, submitter)
}

// Returns whether a hash is a valid rewards submission for all earners hash for a given avs
func (r *ChainReader) GetIsRewardsSubmissionForAllEarnersHash(
ctx context.Context,
avs gethcommon.Address,
hash [32]byte,
) (bool, error) {
if r.rewardsCoordinator == nil {
return false, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.IsRewardsSubmissionForAllEarnersHash(&bind.CallOpts{Context: ctx}, avs, hash)
}

// Returns whether a hash is a valid operator set performance rewards submission hash for a given avs
func (r *ChainReader) GetIsOperatorDirectedAVSRewardsSubmissionHash(
ctx context.Context,
avs gethcommon.Address,
hash [32]byte,
) (bool, error) {
if r.rewardsCoordinator == nil {
return false, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.IsOperatorDirectedAVSRewardsSubmissionHash(&bind.CallOpts{Context: ctx}, avs, hash)
}

// Returns whether a hash is a valid operator set performance rewards submission hash for a given avs
func (r *ChainReader) GetIsOperatorDirectedOperatorSetRewardsSubmissionHash(
ctx context.Context,
avs gethcommon.Address,
hash [32]byte,
) (bool, error) {
if r.rewardsCoordinator == nil {
return false, errors.New("RewardsCoordinator contract not provided")
}
return r.rewardsCoordinator.IsOperatorDirectedOperatorSetRewardsSubmissionHash(
&bind.CallOpts{Context: ctx},
avs,
hash,
)
}

// Returns the amount of magnitude on a strategy not currently allocated to any operator set,
// by an operator.
// Can return an error if the `AllocationManager` contract address was not provided, or due to
Expand Down
91 changes: 87 additions & 4 deletions chainio/clients/elcontracts/reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts"
allocationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/AllocationManager"
erc20 "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IERC20"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IRewardsCoordinator"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RewardsCoordinator"
"github.com/Layr-Labs/eigensdk-go/crypto/bls"
"github.com/Layr-Labs/eigensdk-go/logging"
"github.com/Layr-Labs/eigensdk-go/testutils"
Expand All @@ -32,7 +32,7 @@ func TestChainReader(t *testing.T) {
Address: testutils.ANVIL_FIRST_ADDRESS,
}

rewardsCoordinator, err := rewardscoordinator.NewContractIRewardsCoordinator(
rewardsCoordinator, err := rewardscoordinator.NewContractRewardsCoordinator(
contractAddrs.RewardsCoordinator,
clients.EthHttpClient,
)
Expand Down Expand Up @@ -404,6 +404,89 @@ func TestChainReader(t *testing.T) {
require.Equal(t, common.HexToAddress(operator.Address), newClaimer)
})

t.Run("get cumulative claimed", func(t *testing.T) {
strategyAddr := contractAddrs.Erc20MockStrategy
strategy, underlyingTokenAddr, err := clients.ElChainReader.GetStrategyAndUnderlyingToken(
ctx,
strategyAddr,
)
assert.NoError(t, err)
assert.NotNil(t, strategy)
assert.NotEqual(t, common.Address{}, underlyingTokenAddr)
claimed, err := clients.ElChainReader.GetCumulativeClaimed(
context.Background(),
common.HexToAddress(operator.Address),
underlyingTokenAddr,
)
require.NoError(t, err)
require.NotNil(t, claimed)
})

t.Run("get submission nonce", func(t *testing.T) {
nonce, err := clients.ElChainReader.GetSubmissionNonce(context.Background(), contractAddrs.ServiceManager)
require.NoError(t, err)
require.NotNil(t, nonce)
})

t.Run("get is AVS rewards submission hash", func(t *testing.T) {
isValid, err := clients.ElChainReader.GetIsAVSRewardsSubmissionHash(
context.Background(),
contractAddrs.ServiceManager,
[32]byte{},
)
require.NoError(t, err)
require.False(t, isValid)
})

t.Run("get is rewards submission for all hash", func(t *testing.T) {
isValid, err := clients.ElChainReader.GetIsRewardsSubmissionForAllHash(
context.Background(),
contractAddrs.ServiceManager,
[32]byte{},
)
require.NoError(t, err)
require.False(t, isValid)
})

t.Run("get is rewards for all submitter", func(t *testing.T) {
isValid, err := clients.ElChainReader.GetIsRewardsForAllSubmitter(
context.Background(),
common.HexToAddress(operator.Address),
)
require.NoError(t, err)
require.False(t, isValid)
})

t.Run("get is rewards submission for all earners hash", func(t *testing.T) {
isValid, err := clients.ElChainReader.GetIsRewardsSubmissionForAllEarnersHash(
context.Background(),
common.HexToAddress(operator.Address),
[32]byte{},
)
require.NoError(t, err)
require.False(t, isValid)
})

t.Run("get is operator directed AVS rewards submission hash", func(t *testing.T) {
isValid, err := clients.ElChainReader.GetIsOperatorDirectedAVSRewardsSubmissionHash(
context.Background(),
common.HexToAddress(operator.Address),
[32]byte{},
)
require.NoError(t, err)
require.False(t, isValid)
})

t.Run("get is operator directed operator set rewards submission hash", func(t *testing.T) {
isValid, err := clients.ElChainReader.GetIsOperatorDirectedOperatorSetRewardsSubmissionHash(
context.Background(),
common.HexToAddress(operator.Address),
[32]byte{},
)
require.NoError(t, err)
require.False(t, isValid)
})

}

func TestGetCurrentClaimableDistributionRoot(t *testing.T) {
Expand Down Expand Up @@ -432,7 +515,7 @@ func TestGetCurrentClaimableDistributionRoot(t *testing.T) {
// Create and configure rewards coordinator
ethClient, err := ethclient.Dial(anvilHttpEndpoint)
require.NoError(t, err)
rewardsCoordinator, err := rewardscoordinator.NewContractIRewardsCoordinator(rewardsCoordinatorAddr, ethClient)
rewardsCoordinator, err := rewardscoordinator.NewContractRewardsCoordinator(rewardsCoordinatorAddr, ethClient)
require.NoError(t, err)

ecdsaPrivKeyHex := testutils.ANVIL_FIRST_PRIVATE_KEY
Expand Down Expand Up @@ -500,7 +583,7 @@ func TestGetRootIndexFromRootHash(t *testing.T) {
// Create and configure rewards coordinator
ethClient, err := ethclient.Dial(anvilHttpEndpoint)
require.NoError(t, err)
rewardsCoordinator, err := rewardscoordinator.NewContractIRewardsCoordinator(rewardsCoordinatorAddr, ethClient)
rewardsCoordinator, err := rewardscoordinator.NewContractRewardsCoordinator(rewardsCoordinatorAddr, ethClient)
require.NoError(t, err)
ecdsaPrivKeyHex := testutils.ANVIL_FIRST_PRIVATE_KEY

Expand Down
6 changes: 3 additions & 3 deletions chainio/clients/elcontracts/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ import (
allocationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/AllocationManager"
delegationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/DelegationManager"
erc20 "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IERC20"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IRewardsCoordinator"
strategy "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IStrategy"
permissioncontroller "github.com/Layr-Labs/eigensdk-go/contracts/bindings/PermissionController"
regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RegistryCoordinator"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RewardsCoordinator"
strategymanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/StrategyManager"
"github.com/Layr-Labs/eigensdk-go/crypto/bls"
"github.com/Layr-Labs/eigensdk-go/logging"
Expand All @@ -42,7 +42,7 @@ type Reader interface {
type ChainWriter struct {
delegationManager *delegationmanager.ContractDelegationManager
strategyManager *strategymanager.ContractStrategyManager
rewardsCoordinator *rewardscoordinator.ContractIRewardsCoordinator
rewardsCoordinator *rewardscoordinator.ContractRewardsCoordinator
avsDirectory *avsdirectory.ContractAVSDirectory
allocationManager *allocationmanager.ContractAllocationManager
permissionController *permissioncontroller.ContractPermissionController
Expand All @@ -57,7 +57,7 @@ type ChainWriter struct {
func NewChainWriter(
delegationManager *delegationmanager.ContractDelegationManager,
strategyManager *strategymanager.ContractStrategyManager,
rewardsCoordinator *rewardscoordinator.ContractIRewardsCoordinator,
rewardsCoordinator *rewardscoordinator.ContractRewardsCoordinator,
avsDirectory *avsdirectory.ContractAVSDirectory,
allocationManager *allocationmanager.ContractAllocationManager,
permissionController *permissioncontroller.ContractPermissionController,
Expand Down
6 changes: 3 additions & 3 deletions chainio/clients/elcontracts/writer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import (
"github.com/Layr-Labs/eigensdk-go/chainio/clients"
"github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts"
allocationmanager "github.com/Layr-Labs/eigensdk-go/contracts/bindings/AllocationManager"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IRewardsCoordinator"
strategy "github.com/Layr-Labs/eigensdk-go/contracts/bindings/IStrategy"
mockerc20 "github.com/Layr-Labs/eigensdk-go/contracts/bindings/MockERC20"
regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RegistryCoordinator"
rewardscoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RewardsCoordinator"
"github.com/Layr-Labs/eigensdk-go/crypto/bls"
"github.com/Layr-Labs/eigensdk-go/logging"
"github.com/Layr-Labs/eigensdk-go/testutils"
Expand Down Expand Up @@ -1360,7 +1360,7 @@ func setTestRewardsCoordinatorActivationDelay(
return nil, utils.WrapError("Failed to create eth client", err)
}

rewardsCoordinator, err := rewardscoordinator.NewContractIRewardsCoordinator(rewardsCoordinatorAddr, ethHttpClient)
rewardsCoordinator, err := rewardscoordinator.NewContractRewardsCoordinator(rewardsCoordinatorAddr, ethHttpClient)
if err != nil {
return nil, utils.WrapError("Failed to create rewards coordinator", err)
}
Expand Down Expand Up @@ -1855,7 +1855,7 @@ func newTestClaim(
return nil, utils.WrapError("Failed to call CurrRewardsCalculationEndTimestamp", err)
}

rewardsCoordinator, err := rewardscoordinator.NewContractIRewardsCoordinator(rewardsCoordinatorAddr, ethClient)
rewardsCoordinator, err := rewardscoordinator.NewContractRewardsCoordinator(rewardsCoordinatorAddr, ethClient)
if err != nil {
return nil, utils.WrapError("Failed to create rewards coordinator contract", err)
}
Expand Down
Loading
Loading