slashWorker.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import WorkingGroupsCommandBase from '../../base/WorkingGroupsCommandBase'
  2. import { apiModuleByGroup } from '../../Api'
  3. import { Balance } from '@polkadot/types/interfaces'
  4. import { formatBalance } from '@polkadot/util'
  5. import { minMaxInt } from '../../validators/common'
  6. import chalk from 'chalk'
  7. import { createParamOptions } from '../../helpers/promptOptions'
  8. export default class WorkingGroupsSlashWorker extends WorkingGroupsCommandBase {
  9. static description = 'Slashes given worker stake. Requires lead access.'
  10. static args = [
  11. {
  12. name: 'workerId',
  13. required: true,
  14. description: 'Worker ID',
  15. },
  16. ]
  17. static flags = {
  18. ...WorkingGroupsCommandBase.flags,
  19. }
  20. async run(): Promise<void> {
  21. const { args } = this.parse(WorkingGroupsSlashWorker)
  22. // Lead-only gate
  23. const lead = await this.getRequiredLeadContext()
  24. const workerId = parseInt(args.workerId)
  25. const groupMember = await this.getWorkerWithStakeForLeadAction(workerId)
  26. this.log(chalk.magentaBright('Current worker stake: ', formatBalance(groupMember.stake)))
  27. const balanceValidator = minMaxInt(1, groupMember.stake.toNumber())
  28. const balance = (await this.promptForParam(
  29. 'Balance',
  30. createParamOptions('amount', undefined, balanceValidator)
  31. )) as Balance
  32. await this.sendAndFollowNamedTx(
  33. await this.getDecodedPair(lead.roleAccount),
  34. apiModuleByGroup[this.group],
  35. 'slashStake',
  36. [workerId, balance]
  37. )
  38. this.log(
  39. chalk.green(
  40. `${chalk.magentaBright(formatBalance(balance))} from worker ${chalk.magentaBright(
  41. workerId
  42. )} stake has been successfully slashed!`
  43. )
  44. )
  45. }
  46. }