Skip to main content

SlashingManager

The SlashingManager contract (Solidity name NotareumSlashingManager) applies economic penalties to validators who misbehave. It is the single contract authorized to reduce a validator’s stake in ValidatorStaking outside of normal cooldown withdrawal. Slashing is triggered by VerificationEngine on successful disputes, by the dispute judge on manual findings, or by automated monitors for downtime.

Slash reasons

Each reason carries its own rate schedule and destination split.

Rate schedule by tier and reason

Rates are expressed as basis points of the validator’s bonded stake. Maximum rates are governance-adjustable up to the per-tier ceiling. The aggregate slash applied in any 24-hour window is bounded by the tier’s maxSlashRate (Basic 10%, Professional 15%, Enterprise 20%, Institutional 25%) except for terminal categories (Collusion, Double signing at Enterprise+).

Destination split

Slashed funds are routed deterministically by reason: “Disputer” is the address that opened the successful dispute (for adversarial reasons) or 0x0 for automated reasons (then the share folds into treasury).

Functions

slash

Callable only by VerificationEngine (for dispute outcomes) or by the SLASHER role (held by the dispute judge or an approved watchdog). Pulls the computed amount out of ValidatorStaking via applySlash, splits it per the destination table, and distributes. Reverts if:
  • Reason/tier ceiling would be exceeded.
  • Validator has insufficient bonded stake for the base amount (partial slash applied instead: the contract slashes what is available).
  • Caller is not authorized for the reason.
Emits Slashed(validator, reason, amountSlashed, evidenceHash, disputer).

reportDowntime

Callable by any watcher. Checks that validator has missed attestations across k consecutive epochs (default k = 4 weeks) and triggers a downtime slash if so. This provides a liveness incentive without requiring a manual dispute.

Governance setters

All setters are delay-gated and require the PROTOCOL_ADMIN role, held by a 14-day timelock.

Views

Interaction with ValidatorStaking

SlashingManager is the only caller that ValidatorStaking.applySlash accepts (enforced via AccessManager). The call signature:
applySlash deducts up to amount from bonded stake first, then (if insufficient) from pendingUnstake. It returns the amount actually slashed. SlashingManager uses the returned value as the basis for destination splitting, so under-collateralized validators slash to less than the full intended amount.

Flow on successful dispute

Freeze

A validator who is slashed for Collusion or Double signing is frozen: ValidatorStaking.isActive(validator) returns false for the governance-set freeze window (default 30 days). During the freeze, the validator cannot submit attestations even if their remaining stake is above the Basic minimum. The freeze is applied via ValidatorStaking.setFreeze, which SlashingManager has permission to call.

Events

SDK usage

Consumers rarely call SlashingManager directly; the SDK provides read helpers and dispute-flow convenience wrappers.

Invariants

  1. The sum of destination splits for each reason equals 10000 bps.
  2. The total slashed amount in any 24-hour window for a validator does not exceed tierCeiling(tier) unless the reason is terminal (Collusion, Enterprise+ Double signing).
  3. SlashingManager is the sole caller accepted by ValidatorStaking.applySlash.
  4. Every slash event is accompanied by an evidenceHash whose preimage is publicly accessible for adversarial transparency.