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: add delay of commission rate change #345

Merged
Merged
Show file tree
Hide file tree
Changes from all 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
443 changes: 320 additions & 123 deletions kroma-bindings/bindings/validatormanager.go

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion kroma-bindings/bindings/validatormanager_more.go

Large diffs are not rendered by default.

9 changes: 4 additions & 5 deletions kroma-chain-ops/genesis/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,9 +283,8 @@ type DeployConfig struct {
ValidatorManagerMinRegisterAmount *hexutil.Big `json:"validatorManagerMinRegisterAmount"`
// ValidatorManagerMinActivateAmount is the amount of the minimum activation amount.
ValidatorManagerMinActivateAmount *hexutil.Big `json:"validatorManagerMinActivateAmount"`
// ValidatorManagerCommissionMinChangeSeconds is the minimum duration of commission change in
// seconds.
ValidatorManagerCommissionMinChangeSeconds uint64 `json:"validatorManagerCommissionMinChangeSeconds"`
// ValidatorManagerCommissionChangeDelaySeconds is the delay to finalize the commission rate change in seconds.
ValidatorManagerCommissionChangeDelaySeconds uint64 `json:"validatorManagerCommissionChangeDelaySeconds"`
// ValidatorManagerRoundDurationSeconds is the duration of one submission round in seconds.
ValidatorManagerRoundDurationSeconds uint64 `json:"validatorManagerRoundDurationSeconds"`
// ValidatorManagerJailPeriodSeconds is the duration of jail period in seconds.
Expand Down Expand Up @@ -550,8 +549,8 @@ func (d *DeployConfig) Check() error {
if d.ValidatorManagerMinActivateAmount.ToInt().Cmp(d.ValidatorManagerMinRegisterAmount.ToInt()) < 0 {
return fmt.Errorf("%w: ValidatorManagerMinActivateAmount must equal or more than ValidatorManagerMinRegisterAmount", ErrInvalidDeployConfig)
}
if d.ValidatorManagerCommissionMinChangeSeconds == 0 {
return fmt.Errorf("%w: ValidatorManagerCommissionMinChangeSeconds cannot be 0", ErrInvalidDeployConfig)
if d.ValidatorManagerCommissionChangeDelaySeconds == 0 {
return fmt.Errorf("%w: ValidatorManagerCommissionChangeDelaySeconds cannot be 0", ErrInvalidDeployConfig)
}
if d.ValidatorManagerRoundDurationSeconds == 0 {
return fmt.Errorf("%w: ValidatorManagerRoundDurationSeconds cannot be 0", ErrInvalidDeployConfig)
Expand Down
31 changes: 12 additions & 19 deletions kroma-chain-ops/genesis/testdata/allocs-l1.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
"validatorManagerTrustedValidator": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8",
"validatorManagerMinRegisterAmount": "0x1",
"validatorManagerMinActivateAmount": "0x2",
"validatorManagerCommissionMinChangeSeconds": 2,
"validatorManagerCommissionChangeDelaySeconds": 2,
"validatorManagerRoundDurationSeconds": 4,
"validatorManagerJailPeriodSeconds": 2,
"validatorManagerJailThreshold": 2,
Expand Down
19 changes: 17 additions & 2 deletions kroma-devnet/devnet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,23 @@ def devnet_deploy(paths):

# TODO(seolaoh): set termination index of ValidatorPool to a smaller value when V2 goes live
log.info("Register to ValidatorManager contract to be a validator...")
run_command(['docker', 'compose', 'exec', 'kroma-validator', 'kroma-validator', 'register',
'--amount', '100', '--commission-rate', '5', '--commission-max-change-rate', '5'], cwd=paths.ops_bedrock_dir)
run_command(
[
'docker',
'compose',
'exec',
'kroma-validator',
'kroma-validator',
'register',
'--amount',
'100',
'--commission-rate',
'5',
'--withdraw-account',
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
],
cwd=paths.ops_bedrock_dir,
)
# [Kroma: END]

log.info('Bringing up `artifact-server`')
Expand Down
14 changes: 10 additions & 4 deletions kroma-validator/cmd/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ The following commands are available in Validator System V2:
- `register` - Register as new validator to `ValidatorManager`.
- `--amount [value]` - _(Required)_ The amount of tokens to delegate initially (in Wei).
- `--commission-rate [value]` - _(Required)_ The initial commission rate of the validator (in %).
- `--commission-max-change-rate [value]` - _(Required)_ The max change rate of the commission of the validator (in %).
- `--withdraw-account [value]` - _(Required)_ The address to withdraw deposited asset token.

```bash
kroma-validator register --amount 100000000 --commission-rate 5 --commission-max-change-rate 5
kroma-validator register --amount 100000000 --commission-rate 5 --withdraw-account 0x0000000000000000000000000000000000000001
```

- `activate` - Activate the validator in `ValidatorManager` to be eligible to submit output roots and create challenges.
Expand All @@ -80,11 +80,17 @@ The following commands are available in Validator System V2:
kroma-validator unjail
```

- `changeCommissionRate` - Change the commission rate of the validator in `ValidatorManager`.
- `changeCommissionRate init` - Initiate the commission rate change of the validator in `ValidatorManager`.
- `--commission-rate [value]` - _(Required)_ The new commission rate of the validator (in %).

```bash
kroma-validator changeCommissionRate --commission-rate 5
kroma-validator changeCommissionRate init --commission-rate 5
```

- `changeCommissionRate finalize` - Finalize the commission rate change of the validator in `ValidatorManager`.

```bash
kroma-validator changeCommissionRate finalize
```

- `delegate` - Self-delegate asset tokens to the `AssetManager`.
Expand Down
20 changes: 15 additions & 5 deletions kroma-validator/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ func main() {
Flags: []cli.Flag{
cmd.TokenAmountFlag,
cmd.CommissionRateFlag,
cmd.CommissionMaxChangeRateFlag,
cmd.WithdrawAccountFlag,
},
Action: cmd.Register,
Expand All @@ -79,10 +78,21 @@ func main() {
Action: cmd.Unjail,
},
{
Name: "changeCommissionRate",
Usage: "(EXPERIMENTAL) Change the commission rate of the validator in ValidatorManager",
Flags: []cli.Flag{cmd.CommissionRateFlag},
Action: cmd.ChangeCommissionRate,
Name: "changeCommissionRate",
Usage: "(EXPERIMENTAL) Change the commission rate of the validator in ValidatorManager",
Subcommands: []*cli.Command{
{
Name: "init",
Usage: "(EXPERIMENTAL) Initiate the commission rate change",
Flags: []cli.Flag{cmd.CommissionRateFlag},
Action: cmd.InitCommissionChange,
},
{
Name: "finalize",
Usage: "(EXPERIMENTAL) Finalize the commission rate change",
Action: cmd.FinalizeCommissionChange,
},
},
},
{
Name: "delegate",
Expand Down
37 changes: 32 additions & 5 deletions kroma-validator/cmd/validator/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ func Register(ctx *cli.Context) error {
}

commissionRate := uint8(ctx.Uint64("commission-rate"))
commissionMaxChangeRate := uint8(ctx.Uint64("commission-max-change-rate"))
withdrawAccount, err := opservice.ParseAddress(ctx.String(WithdrawAccountFlag.Name))
if err != nil {
return fmt.Errorf("failed to parse withdraw address: %w", err)
Expand All @@ -183,7 +182,7 @@ func Register(ctx *cli.Context) error {
return fmt.Errorf("failed to get ValidatorManager ABI: %w", err)
}

txData, err := valMgrAbi.Pack("registerValidator", assets, commissionRate, commissionMaxChangeRate, withdrawAccount)
txData, err := valMgrAbi.Pack("registerValidator", assets, commissionRate, withdrawAccount)
if err != nil {
return fmt.Errorf("failed to create register validator transaction data: %w", err)
}
Expand Down Expand Up @@ -257,7 +256,7 @@ func Unjail(ctx *cli.Context) error {
return nil
}

func ChangeCommissionRate(ctx *cli.Context) error {
func InitCommissionChange(ctx *cli.Context) error {
commissionRate := uint8(ctx.Uint64("commission-rate"))

txManager, err := newTxManager(ctx)
Expand All @@ -270,9 +269,37 @@ func ChangeCommissionRate(ctx *cli.Context) error {
return fmt.Errorf("failed to get ValidatorManager ABI: %w", err)
}

txData, err := valMgrAbi.Pack("changeCommissionRate", commissionRate)
txData, err := valMgrAbi.Pack("initCommissionChange", commissionRate)
if err != nil {
return fmt.Errorf("failed to create change commission rate transaction data: %w", err)
return fmt.Errorf("failed to create init commission change transaction data: %w", err)
}

valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name))
if err != nil {
return fmt.Errorf("failed to parse ValidatorManager address: %w", err)
}

if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil {
return err
}

return nil
}

func FinalizeCommissionChange(ctx *cli.Context) error {
txManager, err := newTxManager(ctx)
if err != nil {
return err
}

valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi()
if err != nil {
return fmt.Errorf("failed to get ValidatorManager ABI: %w", err)
}

txData, err := valMgrAbi.Pack("finalizeCommissionChange")
if err != nil {
return fmt.Errorf("failed to create finalize commission change transaction data: %w", err)
}

valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name))
Expand Down
6 changes: 0 additions & 6 deletions kroma-validator/cmd/validator/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,6 @@ var CommissionRateFlag = &cli.Uint64Flag{
Required: true,
}

var CommissionMaxChangeRateFlag = &cli.Uint64Flag{
Name: "commission-max-change-rate",
Usage: "The maximum changeable commission rate at once (in percentage). Maximum 100.",
Required: true,
}

var WithdrawAccountFlag = &cli.StringFlag{
Name: "withdraw-account",
Usage: "Address to withdraw deposited asset token",
Expand Down
1 change: 0 additions & 1 deletion op-e2e/actions/l2_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,6 @@ func (v *L2Validator) ActRegisterValidator(t Testing, assets *big.Int) {
"registerValidator",
assets,
uint8(10),
uint8(2),
v.address,
)
require.NoError(t, err)
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/e2eutils/validator/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func (h *Helper) RegisterToValMgr(priv *ecdsa.PrivateKey, amount *big.Int, withd
_, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash())
require.NoError(h.t, err)

tx, err = h.ValMgrContract.RegisterValidator(transactOpts, amount, uint8(10), uint8(2), withdrawAddr)
tx, err = h.ValMgrContract.RegisterValidator(transactOpts, amount, uint8(10), withdrawAddr)
require.NoError(h.t, err)

_, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash())
Expand Down
Loading
Loading