Skip to content

Commit

Permalink
CLI support for resetting slashing multiplier (#3253)
Browse files Browse the repository at this point in the history
* cli support for resetting slashing multiplier

* fixes found when testing

* docs
  • Loading branch information
mrsmkl committed Apr 2, 2020
1 parent b5dbd68 commit ef6d7d6
Show file tree
Hide file tree
Showing 11 changed files with 222 additions and 56 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { IArg } from '@oclif/parser/lib/args'
import { BaseCommand } from '../../base'
import { newCheckBuilder } from '../../utils/checks'
import { displaySendTx } from '../../utils/cli'
import { Args } from '../../utils/command'

export default class ResetSlashingMultiplier extends BaseCommand {
static description = 'Reset validator group slashing multiplier.'

static flags = {
...BaseCommand.flags,
}

static args: IArg[] = [Args.address('groupAddress', { description: "ValidatorGroup's address" })]

static examples = ['reset-slashing-multiplier 0x97f7333c51897469E8D98E7af8653aAb468050a3']

async run() {
const { args } = this.parse(ResetSlashingMultiplier)
const address = args.groupAddress

const validators = await this.kit.contracts.getValidators()
this.kit.defaultAccount = address

await newCheckBuilder(this, address)
.isSignerOrAccount()
.canSignValidatorTxs()
.signerAccountIsValidatorGroup()
.resetSlashingmultiplierPeriodPassed()
.runChecks()

await displaySendTx('reset-slashing-multiplier', validators.resetSlashingMultiplier())
}
}
13 changes: 12 additions & 1 deletion packages/cli/src/utils/checks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,18 @@ class CheckBuilder {
account
)
const { duration } = await v.getValidatorLockedGoldRequirements()
return duration.toNumber() + lastRemovedFromGroupTimestamp < Date.now()
return duration.toNumber() + lastRemovedFromGroupTimestamp < Date.now() / 1000
})
)
}

resetSlashingmultiplierPeriodPassed = () => {
return this.addCheck(
`Enough time has passed since the last halving of the slashing multiplier`,
this.withValidators(async (v, _signer, account) => {
const { lastSlashed } = await v.getValidatorGroup(account)
const duration = await v.getSlashingMultiplierResetPeriod()
return duration.toNumber() + lastSlashed.toNumber() < Date.now() / 1000
})
)
}
Expand Down
26 changes: 26 additions & 0 deletions packages/contractkit/src/wrappers/Validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ export interface ValidatorGroup {
commission: BigNumber
nextCommission: BigNumber
nextCommissionBlock: BigNumber
lastSlashed: BigNumber
slashingMultiplier: BigNumber
}

export interface ValidatorReward {
Expand All @@ -58,6 +60,7 @@ export interface ValidatorsConfig {
validatorLockedGoldRequirements: LockedGoldRequirements
maxGroupSize: BigNumber
membershipHistoryLength: BigNumber
slashingMultiplierResetPeriod: BigNumber
}

export interface GroupMembership {
Expand Down Expand Up @@ -129,6 +132,15 @@ export class ValidatorsWrapper extends BaseWrapper<Validators> {
valueToBigNumber
)

/**
* Returns the reset period for slashing multiplier.
*/
getSlashingMultiplierResetPeriod = proxyCall(
this.contract.methods.slashingMultiplierResetPeriod,
undefined,
valueToBigNumber
)

/**
* Returns current configuration parameters.
*/
Expand All @@ -138,12 +150,14 @@ export class ValidatorsWrapper extends BaseWrapper<Validators> {
this.getGroupLockedGoldRequirements(),
this.contract.methods.maxGroupSize().call(),
this.contract.methods.membershipHistoryLength().call(),
this.getSlashingMultiplierResetPeriod(),
])
return {
validatorLockedGoldRequirements: res[0],
groupLockedGoldRequirements: res[1],
maxGroupSize: valueToBigNumber(res[2]),
membershipHistoryLength: valueToBigNumber(res[3]),
slashingMultiplierResetPeriod: res[4],
}
}

Expand Down Expand Up @@ -277,6 +291,8 @@ export class ValidatorsWrapper extends BaseWrapper<Validators> {
0
),
affiliates: affiliates.map((v) => v.address),
slashingMultiplier: fromFixed(new BigNumber(res[5])),
lastSlashed: valueToBigNumber(res[6]),
}
}

Expand Down Expand Up @@ -422,11 +438,21 @@ export class ValidatorsWrapper extends BaseWrapper<Validators> {

deaffiliate = proxySend(this.kit, this.contract.methods.deaffiliate)

/**
* Removes a validator from the group for which it is a member.
* @param validatorAccount The validator to deaffiliate from their affiliated validator group.
*/
forceDeaffiliateIfValidator = proxySend(
this.kit,
this.contract.methods.forceDeaffiliateIfValidator
)

/**
* Resets a group's slashing multiplier if it has been >= the reset period since
* the last time the group was slashed.
*/
resetSlashingMultiplier = proxySend(this.kit, this.contract.methods.resetSlashingMultiplier)

/**
* Adds a member to the end of a validator group's list of members.
* Fails if `validator` has not set their affiliation to this account.
Expand Down
17 changes: 17 additions & 0 deletions packages/docs/command-line-interface/validatorgroup.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,23 @@ EXAMPLE

_See code: [packages/cli/src/commands/validatorgroup/register.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validatorgroup/register.ts)_

### Reset-slashing-multiplier

Reset validator group slashing multiplier.

```
USAGE
$ celocli validatorgroup:reset-slashing-multiplier GROUPADDRESS
ARGUMENTS
GROUPADDRESS ValidatorGroup's address
EXAMPLE
reset-slashing-multiplier 0x97f7333c51897469E8D98E7af8653aAb468050a3
```

_See code: [packages/cli/src/commands/validatorgroup/reset-slashing-multiplier.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validatorgroup/reset-slashing-multiplier.ts)_

### Show

Show information about an existing Validator Group
Expand Down
Loading

0 comments on commit ef6d7d6

Please sign in to comment.