Skip to content

Commit d0ef26f

Browse files
bdchathamshrimalmadhur
authored andcommitted
Adding implementation and tests for admin write commands. (#252)
Co-authored-by: Brandon Chatham <[email protected]>
1 parent 342d4a7 commit d0ef26f

21 files changed

+1021
-29
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ require (
1010
//<<<<<<< HEAD
1111
// github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212190947-9985122d81fe
1212
//=======
13-
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241210234612-fdae59339a81
13+
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211204646-f49e96f7ee7a
1414
github.com/blang/semver/v4 v4.0.0
1515
github.com/consensys/gnark-crypto v0.12.1
1616
github.com/ethereum/go-ethereum v1.14.5

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ github.com/Layr-Labs/eigenlayer-rewards-proofs v0.2.12 h1:G5Q1SnLmFbEjhOkky3vIHk
1212
github.com/Layr-Labs/eigenlayer-rewards-proofs v0.2.12/go.mod h1:OlJd1QjqEW53wfWG/lJyPCGvrXwWVEjPQsP4TV+gttQ=
1313
github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e h1:DvW0/kWHV9mZsbH2KOjEHKTSIONNPUj6X05FJvUohy4=
1414
github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e/go.mod h1:T7tYN8bTdca2pkMnz9G2+ZwXYWw5gWqQUIu4KLgC/vM=
15-
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241210234612-fdae59339a81 h1:max9ka+a5hx9/i/mbH1Y9GToXOCEtfsrt1BX02CAdYA=
16-
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241210234612-fdae59339a81/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s=
15+
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211204646-f49e96f7ee7a h1:U1pibFpUsMfL8h9EGrHtm/z94nKKuEvLdWEpkCkCZr4=
16+
github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211204646-f49e96f7ee7a/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s=
1717
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
1818
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
1919
github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8=

pkg/user/admin/accept.go

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,156 @@
11
package admin
22

33
import (
4+
"context"
45
"sort"
56

7+
"github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common"
68
"github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags"
79
"github.com/Layr-Labs/eigenlayer-cli/pkg/telemetry"
10+
"github.com/Layr-Labs/eigenlayer-cli/pkg/utils"
11+
"github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts"
12+
"github.com/Layr-Labs/eigensdk-go/logging"
13+
eigenSdkUtils "github.com/Layr-Labs/eigensdk-go/utils"
14+
gethcommon "github.com/ethereum/go-ethereum/common"
15+
gethtypes "github.com/ethereum/go-ethereum/core/types"
16+
"github.com/ethereum/go-ethereum/ethclient"
17+
818
"github.com/urfave/cli/v2"
919
)
1020

11-
func AcceptCmd() *cli.Command {
21+
type AcceptAdminWriter interface {
22+
AcceptAdmin(
23+
ctx context.Context,
24+
request elcontracts.AcceptAdminRequest,
25+
) (*gethtypes.Receipt, error)
26+
}
27+
28+
func AcceptCmd(generator func(logging.Logger, *acceptAdminConfig) (AcceptAdminWriter, error)) *cli.Command {
1229
acceptCmd := &cli.Command{
1330
Name: "accept-admin",
1431
Usage: "user admin accept-admin --account-address <AccountAddress>",
1532
UsageText: "Accepts a user to become admin who is currently pending admin acceptance.",
1633
Description: `
1734
Accepts a user to become admin who is currently pending admin acceptance.
1835
`,
36+
Action: func(c *cli.Context) error {
37+
return acceptAdmin(c, generator)
38+
},
1939
After: telemetry.AfterRunAction(),
2040
Flags: acceptFlags(),
2141
}
2242

2343
return acceptCmd
2444
}
2545

46+
func acceptAdmin(
47+
cliCtx *cli.Context,
48+
generator func(logging.Logger, *acceptAdminConfig) (AcceptAdminWriter, error),
49+
) error {
50+
ctx := cliCtx.Context
51+
logger := common.GetLogger(cliCtx)
52+
53+
config, err := readAndValidateAcceptAdminConfig(cliCtx, logger)
54+
if err != nil {
55+
return eigenSdkUtils.WrapError("failed to read and validate user admin accept config", err)
56+
}
57+
cliCtx.App.Metadata["network"] = config.ChainID.String()
58+
elWriter, err := generator(logger, config)
59+
if err != nil {
60+
return err
61+
}
62+
63+
receipt, err := elWriter.AcceptAdmin(
64+
ctx,
65+
elcontracts.AcceptAdminRequest{AccountAddress: config.AccountAddress, WaitForReceipt: true},
66+
)
67+
if err != nil {
68+
return err
69+
}
70+
common.PrintTransactionInfo(receipt.TxHash.String(), config.ChainID)
71+
return nil
72+
}
73+
74+
func readAndValidateAcceptAdminConfig(
75+
cliContext *cli.Context,
76+
logger logging.Logger,
77+
) (*acceptAdminConfig, error) {
78+
accountAddress := gethcommon.HexToAddress(cliContext.String(AccountAddressFlag.Name))
79+
ethRpcUrl := cliContext.String(flags.ETHRpcUrlFlag.Name)
80+
network := cliContext.String(flags.NetworkFlag.Name)
81+
environment := cliContext.String(flags.EnvironmentFlag.Name)
82+
if environment == "" {
83+
environment = common.GetEnvFromNetwork(network)
84+
}
85+
signerConfig, err := common.GetSignerConfig(cliContext, logger)
86+
if err != nil {
87+
// We don't want to throw error since people can still use it to generate the claim
88+
// without broadcasting it
89+
logger.Debugf("Failed to get signer config: %s", err)
90+
}
91+
92+
chainID := utils.NetworkNameToChainId(network)
93+
permissionManagerAddress := cliContext.String(PermissionControllerAddressFlag.Name)
94+
95+
if common.IsEmptyString(permissionManagerAddress) {
96+
permissionManagerAddress, err = common.GetPermissionManagerAddress(utils.NetworkNameToChainId(network))
97+
if err != nil {
98+
return nil, err
99+
}
100+
}
101+
102+
logger.Debugf(
103+
"Env: %s, network: %s, chain ID: %s, PermissionManager address: %s",
104+
environment,
105+
network,
106+
chainID,
107+
permissionManagerAddress,
108+
)
109+
110+
return &acceptAdminConfig{
111+
Network: network,
112+
RPCUrl: ethRpcUrl,
113+
AccountAddress: accountAddress,
114+
PermissionManagerAddress: gethcommon.HexToAddress(permissionManagerAddress),
115+
SignerConfig: *signerConfig,
116+
ChainID: chainID,
117+
Environment: environment,
118+
}, nil
119+
}
120+
26121
func acceptFlags() []cli.Flag {
27122
cmdFlags := []cli.Flag{
28123
&flags.VerboseFlag,
29124
&AccountAddressFlag,
125+
&flags.OutputTypeFlag,
126+
&flags.OutputFileFlag,
127+
&flags.NetworkFlag,
128+
&flags.EnvironmentFlag,
129+
&flags.ETHRpcUrlFlag,
130+
&PermissionControllerAddressFlag,
30131
}
31132
sort.Sort(cli.FlagsByName(cmdFlags))
32133
return append(cmdFlags, flags.GetSignerFlags()...)
33134
}
135+
136+
func generateAcceptAdminWriter(
137+
prompter utils.Prompter,
138+
) func(logger logging.Logger, config *acceptAdminConfig) (AcceptAdminWriter, error) {
139+
return func(logger logging.Logger, config *acceptAdminConfig) (AcceptAdminWriter, error) {
140+
ethClient, err := ethclient.Dial(config.RPCUrl)
141+
if err != nil {
142+
return nil, eigenSdkUtils.WrapError("failed to create new eth client", err)
143+
}
144+
return common.GetELWriter(
145+
config.AccountAddress,
146+
&config.SignerConfig,
147+
ethClient,
148+
elcontracts.Config{
149+
PermissionsControllerAddress: config.PermissionManagerAddress,
150+
},
151+
prompter,
152+
config.ChainID,
153+
logger,
154+
)
155+
}
156+
}

pkg/user/admin/accept_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package admin
2+
3+
import (
4+
"context"
5+
"errors"
6+
"testing"
7+
8+
"github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts"
9+
"github.com/Layr-Labs/eigensdk-go/logging"
10+
gethcommon "github.com/ethereum/go-ethereum/common"
11+
gethtypes "github.com/ethereum/go-ethereum/core/types"
12+
"github.com/stretchr/testify/assert"
13+
14+
"github.com/urfave/cli/v2"
15+
)
16+
17+
type mockAcceptAdminWriter struct {
18+
acceptAdminFunc func(ctx context.Context, request elcontracts.AcceptAdminRequest) (*gethtypes.Receipt, error)
19+
}
20+
21+
func (m *mockAcceptAdminWriter) AcceptAdmin(
22+
ctx context.Context,
23+
request elcontracts.AcceptAdminRequest,
24+
) (*gethtypes.Receipt, error) {
25+
return m.acceptAdminFunc(ctx, request)
26+
}
27+
28+
func generateMockAcceptAdminWriter(
29+
receipt *gethtypes.Receipt,
30+
err error,
31+
) func(logging.Logger, *acceptAdminConfig) (AcceptAdminWriter, error) {
32+
return func(logger logging.Logger, config *acceptAdminConfig) (AcceptAdminWriter, error) {
33+
return &mockAcceptAdminWriter{
34+
acceptAdminFunc: func(ctx context.Context, request elcontracts.AcceptAdminRequest) (*gethtypes.Receipt, error) {
35+
return receipt, err
36+
},
37+
}, nil
38+
}
39+
}
40+
41+
func TestAcceptCmd_Success(t *testing.T) {
42+
mockReceipt := &gethtypes.Receipt{
43+
TxHash: gethcommon.HexToHash("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"),
44+
}
45+
46+
app := cli.NewApp()
47+
app.Commands = []*cli.Command{
48+
AcceptCmd(generateMockAcceptAdminWriter(mockReceipt, nil)),
49+
}
50+
51+
args := []string{
52+
"TestAcceptCmd_Success",
53+
"accept-admin",
54+
"--account-address", "0xabcdef1234567890abcdef1234567890abcdef12",
55+
"--eth-rpc-url", "https://ethereum-holesky.publicnode.com/",
56+
"--network", "holesky",
57+
"--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd",
58+
}
59+
60+
err := app.Run(args)
61+
assert.NoError(t, err)
62+
}
63+
64+
func TestAcceptCmd_GeneratorError(t *testing.T) {
65+
expectedError := "failed to create admin writer"
66+
app := cli.NewApp()
67+
app.Commands = []*cli.Command{
68+
AcceptCmd(func(logger logging.Logger, config *acceptAdminConfig) (AcceptAdminWriter, error) {
69+
return nil, errors.New(expectedError)
70+
}),
71+
}
72+
73+
args := []string{
74+
"TestAcceptCmd_GeneratorError",
75+
"accept-admin",
76+
"--account-address", "0xabcdef1234567890abcdef1234567890abcdef12",
77+
"--eth-rpc-url", "https://ethereum-holesky.publicnode.com/",
78+
"--network", "holesky",
79+
"--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd",
80+
}
81+
82+
err := app.Run(args)
83+
assert.Error(t, err)
84+
assert.Contains(t, err.Error(), expectedError)
85+
}
86+
87+
func TestAcceptCmd_AcceptAdminError(t *testing.T) {
88+
expectedError := "error accepting admin"
89+
app := cli.NewApp()
90+
app.Commands = []*cli.Command{
91+
AcceptCmd(generateMockAcceptAdminWriter(nil, errors.New(expectedError))),
92+
}
93+
94+
args := []string{
95+
"TestAcceptCmd_AcceptAdminError",
96+
"accept-admin",
97+
"--account-address", "0xabcdef1234567890abcdef1234567890abcdef12",
98+
"--eth-rpc-url", "https://ethereum-holesky.publicnode.com/",
99+
"--network", "holesky",
100+
"--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd",
101+
}
102+
103+
err := app.Run(args)
104+
assert.Error(t, err)
105+
assert.Contains(t, err.Error(), expectedError)
106+
}

0 commit comments

Comments
 (0)