diff --git a/go.mod b/go.mod index 1cf783d0..d96aada1 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Layr-Labs/eigenlayer-contracts v0.3.2-mainnet-rewards github.com/Layr-Labs/eigenlayer-rewards-proofs v0.2.12 github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e - github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211225219-79336bf6e886 + github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe github.com/blang/semver/v4 v4.0.0 github.com/consensys/gnark-crypto v0.12.1 github.com/ethereum/go-ethereum v1.14.5 diff --git a/go.sum b/go.sum index 7d2d824e..3ec027e3 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248- github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e/go.mod h1:T7tYN8bTdca2pkMnz9G2+ZwXYWw5gWqQUIu4KLgC/vM= github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211225219-79336bf6e886 h1:+7AijqdfRXdDc3zvj02Alqsk6Qd3owvlqPYQN1Hc1ME= github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211225219-79336bf6e886/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s= +github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe h1:FeXxapvtEbbTbEWsrcBTTzQ2u2quGJ9HNYQVSk5JZ8g= +github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= diff --git a/pkg/operator.go b/pkg/operator.go index 7458852f..d34d1742 100644 --- a/pkg/operator.go +++ b/pkg/operator.go @@ -20,6 +20,8 @@ func OperatorCmd(p utils.Prompter) *cli.Command { operator.GetApprovalCmd(p), operator.SetOperatorSplitCmd(p), operator.GetOperatorSplitCmd(p), + operator.GetOperatorPISplitCmd(p), + operator.SetOperatorPISplitCmd(p), }, } diff --git a/pkg/operator/get_operator_pi_split.go b/pkg/operator/get_operator_pi_split.go new file mode 100644 index 00000000..3e6a4cce --- /dev/null +++ b/pkg/operator/get_operator_pi_split.go @@ -0,0 +1,39 @@ +package operator + +import ( + "sort" + + "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags" + "github.com/Layr-Labs/eigenlayer-cli/pkg/operator/split" + "github.com/Layr-Labs/eigenlayer-cli/pkg/rewards" + "github.com/Layr-Labs/eigenlayer-cli/pkg/telemetry" + "github.com/Layr-Labs/eigenlayer-cli/pkg/utils" + "github.com/urfave/cli/v2" +) + +func GetOperatorPISplitCmd(p utils.Prompter) *cli.Command { + var operatorSplitCmd = &cli.Command{ + Name: "get-pi-split", + Usage: "Get programmatic incentives rewards split", + Action: func(cCtx *cli.Context) error { + return GetOperatorSplit(cCtx, true) + }, + After: telemetry.AfterRunAction(), + Flags: getGetOperatorPISplitFlags(), + } + + return operatorSplitCmd +} + +func getGetOperatorPISplitFlags() []cli.Flag { + baseFlags := []cli.Flag{ + &flags.NetworkFlag, + &flags.ETHRpcUrlFlag, + &flags.OperatorAddressFlag, + &split.OperatorSplitFlag, + &rewards.RewardsCoordinatorAddressFlag, + } + + sort.Sort(cli.FlagsByName(baseFlags)) + return baseFlags +} diff --git a/pkg/operator/get_operator_split.go b/pkg/operator/get_operator_split.go index b9571474..b12d47b2 100644 --- a/pkg/operator/get_operator_split.go +++ b/pkg/operator/get_operator_split.go @@ -22,7 +22,7 @@ func GetOperatorSplitCmd(p utils.Prompter) *cli.Command { Name: "get-rewards-split", Usage: "Get operator rewards split", Action: func(cCtx *cli.Context) error { - return GetOperatorSplit(cCtx) + return GetOperatorSplit(cCtx, false) }, After: telemetry.AfterRunAction(), Flags: getGetOperatorSplitFlags(), @@ -45,11 +45,11 @@ func getGetOperatorSplitFlags() []cli.Flag { return baseFlags } -func GetOperatorSplit(cCtx *cli.Context) error { +func GetOperatorSplit(cCtx *cli.Context, isProgrammaticIncentive bool) error { ctx := cCtx.Context logger := common.GetLogger(cCtx) - config, err := readAndValidateGetOperatorSplitConfig(cCtx, logger) + config, err := readAndValidateGetOperatorSplitConfig(cCtx, logger, isProgrammaticIncentive) if err != nil { return eigenSdkUtils.WrapError("failed to read and validate operator split config", err) } @@ -75,8 +75,12 @@ func GetOperatorSplit(cCtx *cli.Context) error { logger.Infof("Getting operator split...") - split, err := elReader.GetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress) - + var split uint16 + if isProgrammaticIncentive { + split, err = elReader.GetOperatorPISplit(ctx, config.OperatorAddress) + } else { + split, err = elReader.GetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress) + } if err != nil { return eigenSdkUtils.WrapError("failed to get operator split", err) } @@ -89,6 +93,7 @@ func GetOperatorSplit(cCtx *cli.Context) error { func readAndValidateGetOperatorSplitConfig( cCtx *cli.Context, logger logging.Logger, + isProgrammaticIncentive bool, ) (*split.GetOperatorAVSSplitConfig, error) { network := cCtx.String(flags.NetworkFlag.Name) rpcUrl := cCtx.String(flags.ETHRpcUrlFlag.Name) @@ -108,7 +113,9 @@ func readAndValidateGetOperatorSplitConfig( logger.Infof("Using operator address: %s", operatorAddress.String()) avsAddress := gethcommon.HexToAddress(cCtx.String(split.AVSAddressFlag.Name)) - logger.Infof("Using AVS address: %s", avsAddress.String()) + if !isProgrammaticIncentive { + logger.Infof("Using AVS address: %s", avsAddress.String()) + } chainID := utils.NetworkNameToChainId(network) logger.Debugf("Using chain ID: %s", chainID.String()) diff --git a/pkg/operator/set_operator_pi_split.go b/pkg/operator/set_operator_pi_split.go new file mode 100644 index 00000000..63919e3a --- /dev/null +++ b/pkg/operator/set_operator_pi_split.go @@ -0,0 +1,44 @@ +package operator + +import ( + "sort" + + "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags" + "github.com/Layr-Labs/eigenlayer-cli/pkg/operator/split" + "github.com/Layr-Labs/eigenlayer-cli/pkg/rewards" + "github.com/Layr-Labs/eigenlayer-cli/pkg/telemetry" + "github.com/Layr-Labs/eigenlayer-cli/pkg/utils" + "github.com/urfave/cli/v2" +) + +func SetOperatorPISplitCmd(p utils.Prompter) *cli.Command { + var operatorSplitCmd = &cli.Command{ + Name: "set-pi-split", + Usage: "Set operator programmatic incentives split", + Action: func(cCtx *cli.Context) error { + return SetOperatorSplit(cCtx, p, true) + }, + After: telemetry.AfterRunAction(), + Flags: getSetOperatorPISplitFlags(), + } + + return operatorSplitCmd +} + +func getSetOperatorPISplitFlags() []cli.Flag { + baseFlags := []cli.Flag{ + &flags.NetworkFlag, + &flags.ETHRpcUrlFlag, + &flags.OperatorAddressFlag, + &split.OperatorSplitFlag, + &rewards.RewardsCoordinatorAddressFlag, + &flags.BroadcastFlag, + &flags.OutputTypeFlag, + &flags.OutputFileFlag, + &flags.SilentFlag, + } + + allFlags := append(baseFlags, flags.GetSignerFlags()...) + sort.Sort(cli.FlagsByName(allFlags)) + return allFlags +} diff --git a/pkg/operator/set_operator_split.go b/pkg/operator/set_operator_split.go index 3c6c8460..2d5e43c1 100644 --- a/pkg/operator/set_operator_split.go +++ b/pkg/operator/set_operator_split.go @@ -14,6 +14,7 @@ import ( "github.com/Layr-Labs/eigensdk-go/logging" eigenSdkUtils "github.com/Layr-Labs/eigensdk-go/utils" gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/urfave/cli/v2" ) @@ -23,7 +24,7 @@ func SetOperatorSplitCmd(p utils.Prompter) *cli.Command { Name: "set-rewards-split", Usage: "Set operator rewards split", Action: func(cCtx *cli.Context) error { - return SetOperatorSplit(cCtx, p) + return SetOperatorSplit(cCtx, p, false) }, After: telemetry.AfterRunAction(), Flags: getSetOperatorSplitFlags(), @@ -32,11 +33,11 @@ func SetOperatorSplitCmd(p utils.Prompter) *cli.Command { return operatorSplitCmd } -func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter) error { +func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter, isProgrammaticIncentive bool) error { ctx := cCtx.Context logger := common.GetLogger(cCtx) - config, err := readAndValidateSetOperatorSplitConfig(cCtx, logger) + config, err := readAndValidateSetOperatorSplitConfig(cCtx, logger, isProgrammaticIncentive) if err != nil { return eigenSdkUtils.WrapError("failed to read and validate operator split config", err) } @@ -68,8 +69,13 @@ func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter) error { logger.Infof("Broadcasting set operator transaction...") - receipt, err := eLWriter.SetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress, config.Split, true) + var receipt *types.Receipt + if isProgrammaticIncentive { + receipt, err = eLWriter.SetOperatorPISplit(ctx, config.OperatorAddress, config.Split, true) + } else { + receipt, err = eLWriter.SetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress, config.Split, true) + } if err != nil { return eigenSdkUtils.WrapError("failed to process claim", err) } @@ -94,7 +100,12 @@ func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter) error { noSendTxOpts.GasLimit = 150_000 } - unsignedTx, err := contractBindings.RewardsCoordinator.SetOperatorAVSSplit(noSendTxOpts, config.OperatorAddress, config.AVSAddress, config.Split) + var unsignedTx *types.Transaction + if isProgrammaticIncentive { + unsignedTx, err = contractBindings.RewardsCoordinator.SetOperatorPISplit(noSendTxOpts, config.OperatorAddress, config.Split) + } else { + unsignedTx, err = contractBindings.RewardsCoordinator.SetOperatorAVSSplit(noSendTxOpts, config.OperatorAddress, config.AVSAddress, config.Split) + } if err != nil { return eigenSdkUtils.WrapError("failed to create unsigned tx", err) @@ -148,6 +159,7 @@ func getSetOperatorSplitFlags() []cli.Flag { func readAndValidateSetOperatorSplitConfig( cCtx *cli.Context, logger logging.Logger, + isProgrammaticIncentive bool, ) (*split.SetOperatorAVSSplitConfig, error) { network := cCtx.String(flags.NetworkFlag.Name) rpcUrl := cCtx.String(flags.ETHRpcUrlFlag.Name) @@ -172,7 +184,10 @@ func readAndValidateSetOperatorSplitConfig( logger.Infof("Using operator address: %s", operatorAddress.String()) avsAddress := gethcommon.HexToAddress(cCtx.String(split.AVSAddressFlag.Name)) - logger.Infof("Using AVS address: %s", avsAddress.String()) + + if !isProgrammaticIncentive { + logger.Infof("Using AVS address: %s", avsAddress.String()) + } chainID := utils.NetworkNameToChainId(network) logger.Debugf("Using chain ID: %s", chainID.String())