Skip to content

Commit 3a2677f

Browse files
committed
feat: get/set operator PI split commands (#256)
1 parent f8cecdd commit 3a2677f

File tree

7 files changed

+122
-13
lines changed

7 files changed

+122
-13
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ require (
77
github.com/Layr-Labs/eigenlayer-contracts v0.3.2-mainnet-rewards
88
github.com/Layr-Labs/eigenlayer-rewards-proofs v0.2.12
99
github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e
10-
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211225219-79336bf6e886
10+
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe
1111
github.com/blang/semver/v4 v4.0.0
1212
github.com/consensys/gnark-crypto v0.12.1
1313
github.com/ethereum/go-ethereum v1.14.5

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-
1414
github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e/go.mod h1:T7tYN8bTdca2pkMnz9G2+ZwXYWw5gWqQUIu4KLgC/vM=
1515
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211225219-79336bf6e886 h1:+7AijqdfRXdDc3zvj02Alqsk6Qd3owvlqPYQN1Hc1ME=
1616
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211225219-79336bf6e886/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s=
17+
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe h1:FeXxapvtEbbTbEWsrcBTTzQ2u2quGJ9HNYQVSk5JZ8g=
18+
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s=
1719
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
1820
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
1921
github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8=

pkg/operator.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ func OperatorCmd(p utils.Prompter) *cli.Command {
2020
operator.GetApprovalCmd(p),
2121
operator.SetOperatorSplitCmd(p),
2222
operator.GetOperatorSplitCmd(p),
23+
operator.GetOperatorPISplitCmd(p),
24+
operator.SetOperatorPISplitCmd(p),
2325
},
2426
}
2527

pkg/operator/get_operator_pi_split.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package operator
2+
3+
import (
4+
"sort"
5+
6+
"github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags"
7+
"github.com/Layr-Labs/eigenlayer-cli/pkg/operator/split"
8+
"github.com/Layr-Labs/eigenlayer-cli/pkg/rewards"
9+
"github.com/Layr-Labs/eigenlayer-cli/pkg/telemetry"
10+
"github.com/Layr-Labs/eigenlayer-cli/pkg/utils"
11+
"github.com/urfave/cli/v2"
12+
)
13+
14+
func GetOperatorPISplitCmd(p utils.Prompter) *cli.Command {
15+
var operatorSplitCmd = &cli.Command{
16+
Name: "get-pi-split",
17+
Usage: "Get programmatic incentives rewards split",
18+
Action: func(cCtx *cli.Context) error {
19+
return GetOperatorSplit(cCtx, true)
20+
},
21+
After: telemetry.AfterRunAction(),
22+
Flags: getGetOperatorPISplitFlags(),
23+
}
24+
25+
return operatorSplitCmd
26+
}
27+
28+
func getGetOperatorPISplitFlags() []cli.Flag {
29+
baseFlags := []cli.Flag{
30+
&flags.NetworkFlag,
31+
&flags.ETHRpcUrlFlag,
32+
&flags.OperatorAddressFlag,
33+
&split.OperatorSplitFlag,
34+
&rewards.RewardsCoordinatorAddressFlag,
35+
}
36+
37+
sort.Sort(cli.FlagsByName(baseFlags))
38+
return baseFlags
39+
}

pkg/operator/get_operator_split.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func GetOperatorSplitCmd(p utils.Prompter) *cli.Command {
2222
Name: "get-rewards-split",
2323
Usage: "Get operator rewards split",
2424
Action: func(cCtx *cli.Context) error {
25-
return GetOperatorSplit(cCtx)
25+
return GetOperatorSplit(cCtx, false)
2626
},
2727
After: telemetry.AfterRunAction(),
2828
Flags: getGetOperatorSplitFlags(),
@@ -45,11 +45,11 @@ func getGetOperatorSplitFlags() []cli.Flag {
4545
return baseFlags
4646
}
4747

48-
func GetOperatorSplit(cCtx *cli.Context) error {
48+
func GetOperatorSplit(cCtx *cli.Context, isProgrammaticIncentive bool) error {
4949
ctx := cCtx.Context
5050
logger := common.GetLogger(cCtx)
5151

52-
config, err := readAndValidateGetOperatorSplitConfig(cCtx, logger)
52+
config, err := readAndValidateGetOperatorSplitConfig(cCtx, logger, isProgrammaticIncentive)
5353
if err != nil {
5454
return eigenSdkUtils.WrapError("failed to read and validate operator split config", err)
5555
}
@@ -75,8 +75,12 @@ func GetOperatorSplit(cCtx *cli.Context) error {
7575

7676
logger.Infof("Getting operator split...")
7777

78-
split, err := elReader.GetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress)
79-
78+
var split uint16
79+
if isProgrammaticIncentive {
80+
split, err = elReader.GetOperatorPISplit(ctx, config.OperatorAddress)
81+
} else {
82+
split, err = elReader.GetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress)
83+
}
8084
if err != nil {
8185
return eigenSdkUtils.WrapError("failed to get operator split", err)
8286
}
@@ -89,6 +93,7 @@ func GetOperatorSplit(cCtx *cli.Context) error {
8993
func readAndValidateGetOperatorSplitConfig(
9094
cCtx *cli.Context,
9195
logger logging.Logger,
96+
isProgrammaticIncentive bool,
9297
) (*split.GetOperatorAVSSplitConfig, error) {
9398
network := cCtx.String(flags.NetworkFlag.Name)
9499
rpcUrl := cCtx.String(flags.ETHRpcUrlFlag.Name)
@@ -108,7 +113,9 @@ func readAndValidateGetOperatorSplitConfig(
108113
logger.Infof("Using operator address: %s", operatorAddress.String())
109114

110115
avsAddress := gethcommon.HexToAddress(cCtx.String(split.AVSAddressFlag.Name))
111-
logger.Infof("Using AVS address: %s", avsAddress.String())
116+
if !isProgrammaticIncentive {
117+
logger.Infof("Using AVS address: %s", avsAddress.String())
118+
}
112119

113120
chainID := utils.NetworkNameToChainId(network)
114121
logger.Debugf("Using chain ID: %s", chainID.String())

pkg/operator/set_operator_pi_split.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package operator
2+
3+
import (
4+
"sort"
5+
6+
"github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags"
7+
"github.com/Layr-Labs/eigenlayer-cli/pkg/operator/split"
8+
"github.com/Layr-Labs/eigenlayer-cli/pkg/rewards"
9+
"github.com/Layr-Labs/eigenlayer-cli/pkg/telemetry"
10+
"github.com/Layr-Labs/eigenlayer-cli/pkg/utils"
11+
"github.com/urfave/cli/v2"
12+
)
13+
14+
func SetOperatorPISplitCmd(p utils.Prompter) *cli.Command {
15+
var operatorSplitCmd = &cli.Command{
16+
Name: "set-pi-split",
17+
Usage: "Set operator programmatic incentives split",
18+
Action: func(cCtx *cli.Context) error {
19+
return SetOperatorSplit(cCtx, p, true)
20+
},
21+
After: telemetry.AfterRunAction(),
22+
Flags: getSetOperatorPISplitFlags(),
23+
}
24+
25+
return operatorSplitCmd
26+
}
27+
28+
func getSetOperatorPISplitFlags() []cli.Flag {
29+
baseFlags := []cli.Flag{
30+
&flags.NetworkFlag,
31+
&flags.ETHRpcUrlFlag,
32+
&flags.OperatorAddressFlag,
33+
&split.OperatorSplitFlag,
34+
&rewards.RewardsCoordinatorAddressFlag,
35+
&flags.BroadcastFlag,
36+
&flags.OutputTypeFlag,
37+
&flags.OutputFileFlag,
38+
&flags.SilentFlag,
39+
}
40+
41+
allFlags := append(baseFlags, flags.GetSignerFlags()...)
42+
sort.Sort(cli.FlagsByName(allFlags))
43+
return allFlags
44+
}

pkg/operator/set_operator_split.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/Layr-Labs/eigensdk-go/logging"
1515
eigenSdkUtils "github.com/Layr-Labs/eigensdk-go/utils"
1616
gethcommon "github.com/ethereum/go-ethereum/common"
17+
"github.com/ethereum/go-ethereum/core/types"
1718
"github.com/ethereum/go-ethereum/ethclient"
1819
"github.com/urfave/cli/v2"
1920
)
@@ -23,7 +24,7 @@ func SetOperatorSplitCmd(p utils.Prompter) *cli.Command {
2324
Name: "set-rewards-split",
2425
Usage: "Set operator rewards split",
2526
Action: func(cCtx *cli.Context) error {
26-
return SetOperatorSplit(cCtx, p)
27+
return SetOperatorSplit(cCtx, p, false)
2728
},
2829
After: telemetry.AfterRunAction(),
2930
Flags: getSetOperatorSplitFlags(),
@@ -32,11 +33,11 @@ func SetOperatorSplitCmd(p utils.Prompter) *cli.Command {
3233
return operatorSplitCmd
3334
}
3435

35-
func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter) error {
36+
func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter, isProgrammaticIncentive bool) error {
3637
ctx := cCtx.Context
3738
logger := common.GetLogger(cCtx)
3839

39-
config, err := readAndValidateSetOperatorSplitConfig(cCtx, logger)
40+
config, err := readAndValidateSetOperatorSplitConfig(cCtx, logger, isProgrammaticIncentive)
4041
if err != nil {
4142
return eigenSdkUtils.WrapError("failed to read and validate operator split config", err)
4243
}
@@ -68,8 +69,13 @@ func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter) error {
6869

6970
logger.Infof("Broadcasting set operator transaction...")
7071

71-
receipt, err := eLWriter.SetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress, config.Split, true)
72+
var receipt *types.Receipt
73+
if isProgrammaticIncentive {
74+
receipt, err = eLWriter.SetOperatorPISplit(ctx, config.OperatorAddress, config.Split, true)
7275

76+
} else {
77+
receipt, err = eLWriter.SetOperatorAVSSplit(ctx, config.OperatorAddress, config.AVSAddress, config.Split, true)
78+
}
7379
if err != nil {
7480
return eigenSdkUtils.WrapError("failed to process claim", err)
7581
}
@@ -94,7 +100,12 @@ func SetOperatorSplit(cCtx *cli.Context, p utils.Prompter) error {
94100
noSendTxOpts.GasLimit = 150_000
95101
}
96102

97-
unsignedTx, err := contractBindings.RewardsCoordinator.SetOperatorAVSSplit(noSendTxOpts, config.OperatorAddress, config.AVSAddress, config.Split)
103+
var unsignedTx *types.Transaction
104+
if isProgrammaticIncentive {
105+
unsignedTx, err = contractBindings.RewardsCoordinator.SetOperatorPISplit(noSendTxOpts, config.OperatorAddress, config.Split)
106+
} else {
107+
unsignedTx, err = contractBindings.RewardsCoordinator.SetOperatorAVSSplit(noSendTxOpts, config.OperatorAddress, config.AVSAddress, config.Split)
108+
}
98109

99110
if err != nil {
100111
return eigenSdkUtils.WrapError("failed to create unsigned tx", err)
@@ -148,6 +159,7 @@ func getSetOperatorSplitFlags() []cli.Flag {
148159
func readAndValidateSetOperatorSplitConfig(
149160
cCtx *cli.Context,
150161
logger logging.Logger,
162+
isProgrammaticIncentive bool,
151163
) (*split.SetOperatorAVSSplitConfig, error) {
152164
network := cCtx.String(flags.NetworkFlag.Name)
153165
rpcUrl := cCtx.String(flags.ETHRpcUrlFlag.Name)
@@ -172,7 +184,10 @@ func readAndValidateSetOperatorSplitConfig(
172184
logger.Infof("Using operator address: %s", operatorAddress.String())
173185

174186
avsAddress := gethcommon.HexToAddress(cCtx.String(split.AVSAddressFlag.Name))
175-
logger.Infof("Using AVS address: %s", avsAddress.String())
187+
188+
if !isProgrammaticIncentive {
189+
logger.Infof("Using AVS address: %s", avsAddress.String())
190+
}
176191

177192
chainID := utils.NetworkNameToChainId(network)
178193
logger.Debugf("Using chain ID: %s", chainID.String())

0 commit comments

Comments
 (0)