# Hooks

To prepare and finish the execution of the task by PowerAgent, helper functions are called. They may be changed in different realizations of PowerAgent.

### Before execution

A slasher can try to execute the task if the assigned keeper has failed to do so.

The `function beforeExecute(bytes32 jobKey, uint256 actualKeeperId_, uint256 binJob_)` is the first statement in the execute function of the PowerAgent. It contains a set of checks for the slasher and reverts at any step with failed check, interrupting the execution function of the PowerAgent.

#### Checks

* Slasher id

  If the caller is the currently assigned keeper, the checks are skipped, and the execution continues. Otherwise, all checks are performed. If the caller is neither a keeper nor a slasher, the function reverts.
* Only next keeper

  For interval tasks, if the slasher has called the execution too early.
* Slashing not initiated

  This job is not configured for slashing.
* Too early for slashing

  For resolver jobs a certain block can be specified after which a negligent keeper can be slashed.
* Only reserved slasher

  A reserved slasher can be assigned to the job. If so, only this slasher can execute the failed task.

If all checks have been passed, the execution continues.

### After execution

`function afterExecute(bytes32 jobKey, uint256 actualKeeperId_, uint256 binJob_) internal override` is called after the execution has succeeded. If the caller was not a slasher, it simply releases the previous keeper and assigns a new keeper (see [keeper-selection](https://docs.powerpool.finance/powerpool-and-poweragent-network/research/poweragent-v2.1/keeper-selection "mention")).

If the caller was a slasher, the negligent keeper is slashed by the following formula:

* `uint256 dynamicSlashAmount = eKeeper.cvpStake * uint256(rdConfig.slashingFeeBps) / 10000`
* `uint256 fixedSlashAmount = uint256(rdConfig.slashingFeeFixedCVP) * 1 ether`
* `uint88 totalSlashAmount = uint88(fixedSlashAmount + dynamicSlashAmount)`

The CVP stake of the failed keeper is reduced by this amount, and the CVP stake of the slasher which successfully executed the task is increased by this amount.
