dig-slashing 0.1.3

Validator slashing, attestation participation, inactivity accounting, and fraud-proof appeals for the DIG Network L2 blockchain.
Documentation
# Changelog

All notable changes to this project are documented here.
This project adheres to [Semantic Versioning](https://semver.org) and
[Conventional Commits](https://www.conventionalcommits.org).

## [0.1.3] - 2026-07-19

### Refactor
- Extract shared attester-slashing predicate (evidence ⟺ appeal) (#3)

## [0.1.2] - 2026-07-19

### Documentation
- Correct dishonest "stub"/"not-yet-implemented" rustdoc (#2)

## [0.1.1] - 2026-07-12

### Testing
- **dsl-172:** Cover untested adjudicator + admission branches

### CI
- Add push/PR coverage gate (cargo-llvm-cov, ≥80% lines)- Enforce version increment in PRs (package.json / Cargo.toml)- Enforce Conventional Commits with commitlint on PRs- Enforce Conventional Commits with commitlint on PRs- Release automation (git-cliff changelog + tag on merge); publish is manual workflow_dispatch (#230)- Re-arm crates.io auto-publish on version tag (token in org secrets; auto-publish-everything #230)- Add flaky-test management (#489) (#1)

### Chores
- **changelog:** Add git-cliff config for Conventional-Commit changelog

## [0.1.0] - 2026-04-19

### Features
- **evidence:** Implement DSL-003 Checkpoint roundtrip- **evidence:** Implement DSL-004 AttestationData::signing_root- **evidence:** Implement DSL-005 IndexedAttestation::validate_structure- **evidence:** Implement DSL-007 AttesterSlashing::slashable_indices- **evidence:** Implement DSL-009 SignedBlockHeader roundtrip- **evidence:** Implement DSL-008 InvalidBlockProof + InvalidBlockReason- **evidence:** Implement DSL-002 SlashingEvidence::hash- **evidence:** Implement DSL-010 SlashingEvidence::slashable_validators- **evidence:** Implement DSL-006 IndexedAttestation::verify_signature- **evidence:** Implement DSL-011 verify_evidence OffenseTooOld- **evidence:** Implement DSL-012 verify_evidence ReporterIsAccused- **evidence:** Implement DSL-013 verify_proposer_slashing- **evidence:** Implement DSL-014 verify_attester_slashing double-vote- **evidence:** Implement DSL-015 verify_attester_slashing surround-vote- **evidence:** Implement DSL-016 verify_attester empty intersection- **evidence:** Implement DSL-017 verify_attester not slashable- **evidence:** Implement DSL-018 verify_invalid_block- **evidence:** Implement DSL-019 verify_invalid_block epoch mismatch- **evidence:** Implement DSL-020 verify_invalid_block oracle hook- **evidence:** Implement DSL-021 verify_evidence_for_inclusion- **lifecycle:** Implement DSL-022 submit_evidence base slash formula- **lifecycle:** Implement DSL-023 submit_evidence escrows reporter bond- **lifecycle:** Implement DSL-024 PendingSlash Accepted insertion- **lifecycle:** Implement DSL-025 submit_evidence reward routing- **lifecycle:** Implement DSL-026 AlreadySlashed dedup- **lifecycle:** Implement DSL-027 PendingBookFull capacity check- **lifecycle:** Implement DSL-028 BondLockFailed rejection- **lifecycle:** Implement DSL-029 finalise_expired_slashes- **lifecycle:** Implement DSL-030 correlation penalty- **lifecycle:** Implement DSL-031 finalise returns reporter bond- **lifecycle:** Implement DSL-032 finalise schedules exit lock- **lifecycle:** Implement DSL-033 finalise skips Reverted/Finalised- **appeal:** Implement DSL-034 ProposerAppeal HeadersIdentical- **appeal:** Implement DSL-035 ProposerAppeal ProposerIndexMismatch- **appeal:** Implement DSL-036 ProposerAppeal SignatureAInvalid- **appeal:** Implement DSL-037 ProposerAppeal SignatureBInvalid- **appeal:** Implement DSL-038 ProposerAppeal SlotMismatch- **appeal:** Implement DSL-039 ProposerAppeal ValidatorNotActiveAtEpoch- **appeal:** Implement DSL-040 proposer appeal rejected on false claim- **appeal:** Implement DSL-041 AttesterAppeal AttestationsIdentical- **appeal:** Implement DSL-042 AttesterAppeal NotSlashableByPredicate- **appeal:** Implement DSL-043 AttesterAppeal EmptyIntersection- **appeal:** Implement DSL-044 AttesterAppeal SignatureAInvalid- **appeal:** Implement DSL-045 AttesterAppeal SignatureBInvalid- **appeal:** Implement DSL-046 AttesterAppeal InvalidIndexedAttestationStructure- **appeal:** Implement DSL-047 AttesterAppeal ValidatorNotInIntersection- **appeal:** Implement DSL-048 AttesterAppeal rejected on genuine slash- **appeal:** Implement DSL-049 InvalidBlock BlockActuallyValid- **appeal:** Implement DSL-050 InvalidBlock ProposerSignatureInvalid- **appeal:** Implement DSL-051 InvalidBlock FailureReasonMismatch- **appeal:** Implement DSL-052 InvalidBlock EvidenceEpochMismatch- **appeal:** Implement DSL-053 InvalidBlock MissingOracle contract- **appeal:** Implement DSL-054 InvalidBlock rejected on genuine invalid block- **appeal:** Implement DSL-055 submit_appeal UnknownEvidence- **appeal:** Implement DSL-056 submit_appeal WindowExpired- **appeal:** Implement DSL-057 submit_appeal VariantMismatch- **appeal:** Implement DSL-058 submit_appeal DuplicateAppeal- **appeal:** Implement DSL-059 submit_appeal TooManyAttempts- **appeal:** Implement DSL-060 submit_appeal SlashAlreadyReverted- **appeal:** Implement DSL-061 submit_appeal SlashAlreadyFinalised- **appeal:** Implement DSL-062 submit_appeal appellant bond lock- **appeal:** Implement DSL-063 submit_appeal PayloadTooLarge- **appeal:** Implement DSL-064 adjudicate sustained reverts base slash- **appeal:** Implement DSL-065 adjudicate sustained reverts collateral- **appeal:** Implement DSL-066 adjudicate sustained restores status- **appeal:** Implement DSL-067 adjudicate sustained clawback rewards- **appeal:** Implement DSL-068 adjudicate sustained reporter-bond split- **appeal:** Implement DSL-069 adjudicate sustained reporter penalty- **appeal:** Implement DSL-070 adjudicate sustained status reverted- **appeal:** Implement DSL-071 adjudicate rejected appellant-bond split- **appeal:** Implement DSL-072 adjudicate rejected ChallengeOpen- **appeal:** Implement DSL-073 adjudicate clawback shortfall absorbed from bond- **participation:** Implement DSL-074 ParticipationFlags bits- **participation:** Implement DSL-075 classify_timeliness TIMELY_SOURCE- **participation:** Implement DSL-076 classify_timeliness TIMELY_TARGET- **participation:** Implement DSL-077 classify_timeliness TIMELY_HEAD- **participation:** Implement DSL-078 ParticipationTracker::record_attestation- **participation:** Implement DSL-079 ParticipationTracker non-ascending rejection- **participation:** Implement DSL-080 ParticipationTracker::rotate_epoch- **participation:** Implement DSL-081 base_reward formula- **participation:** Implement DSL-082 compute_flag_deltas reward on hit- **participation:** Implement DSL-083 compute_flag_deltas penalty (head exempt)- **participation:** Implement DSL-084 compute_flag_deltas stall zeroes rewards- **participation:** Implement DSL-085 proposer_inclusion_reward formula- **participation:** Implement DSL-086 WEIGHT_DENOMINATOR no sync committee- **inactivity:** Implement DSL-087 in_finality_stall threshold- **inactivity:** Implement DSL-088 InactivityScoreTracker hit decrement- **inactivity:** Implement DSL-089 miss+stall score increment- **inactivity:** Implement DSL-090 out-of-stall recovery (-16)- **inactivity:** Implement DSL-091 epoch_penalties no-stall empty- **inactivity:** Implement DSL-092 epoch_penalties formula- **inactivity:** Implement DSL-093 InactivityScoreTracker::resize_for- **protection:** Implement DSL-094 check_proposal_slot monotonic- **protection:** Implement DSL-095 check_attestation double-vote self-check- **protection:** Implement DSL-096 would_surround self-check- **protection:** Implement DSL-097 record_proposal/record_attestation persist- **protection:** Implement DSL-098 rewind_attestation_to_epoch- **protection:** Implement DSL-099 reconcile_with_chain_tip- **protection:** Implement DSL-100 legacy JSON backward compat- **protection:** Implement DSL-101 save/load roundtrip- **remark:** Implement DSL-102 evidence REMARK wire roundtrip- **remark:** Implement DSL-103 evidence puzzle reveal + hash- **remark:** Implement DSL-104 evidence admission matching coin- **remark:** Implement DSL-105 evidence admission mismatch rejected- **remark:** Implement DSL-106 evidence mempool expired rejection- **remark:** Implement DSL-107 evidence mempool duplicate rejection- **remark:** Implement DSL-108 evidence block cap- **remark:** Implement DSL-109 evidence payload cap- **remark:** Implement DSL-110 appeal REMARK wire roundtrip- **remark:** Implement DSL-111 appeal puzzle reveal + hash- **remark:** Implement DSL-112 appeal admission matching coin- **remark:** Implement DSL-113 appeal admission mismatch rejected- **remark:** Implement DSL-114 appeal mempool unknown-slash rejection- **remark:** Implement DSL-115 appeal mempool window expired rejection- **remark:** Implement DSL-116 appeal mempool terminal-status rejection- **remark:** Implement DSL-117 appeal mempool variant mismatch- **remark:** Implement DSL-118 appeal mempool duplicate rejection- **remark:** Implement DSL-119 appeal block cap- **remark:** Implement DSL-120 appeal payload cap- **bonds:** Implement DSL-121 BondEscrow::lock contract test- **bonds:** Implement DSL-122 BondEscrow::forfeit return contract- **bonds:** Implement DSL-123 BondEscrow::release full on finalise- **bonds:** Implement DSL-124 REPORTER_BOND_MOJOS constant pin- **bonds:** Implement DSL-125 APPELLANT_BOND_MOJOS constant pin- **bonds:** Implement DSL-126 BOND_AWARD_TO_WINNER_BPS 50/50 split- **orchestration:** Implement DSL-127 run_epoch_boundary fixed ordering- **system:** Implement DSL-128 SlashingSystem genesis initialisation- **manager:** Implement DSL-129 rewind_on_reorg- **orchestration:** Implement DSL-130 rewind_all_on_reorg- **traits:** Implement DSL-131 ValidatorEntry::slash_absolute saturation- **traits:** Implement DSL-132 ValidatorEntry::credit_stake- **traits:** Implement DSL-133 ValidatorEntry::restore_status- **traits:** Implement DSL-134 ValidatorEntry::is_active_at_epoch- **traits:** Implement DSL-135 ValidatorEntry::schedule_exit- **traits:** Implement DSL-136 ValidatorView::get / get_mut / len- **traits:** Implement DSL-137 EffectiveBalanceView contract- **traits:** Implement DSL-138 PublicKeyLookup blanket over ValidatorView- **traits:** Implement DSL-139 CollateralSlasher slash+credit symmetry- **traits:** Implement DSL-140 BondEscrow::escrowed read query- **traits:** Implement DSL-141 RewardPayout::pay accumulation- **traits:** Implement DSL-142 RewardClawback::claw_back partial- **traits:** Implement DSL-143 JustificationView full 5-method contract- **traits:** Implement DSL-144 ProposerView contract test- **traits:** Implement DSL-145 InvalidBlockOracle determinism- **lifecycle:** Implement DSL-146 PendingSlashBook basic ops test- **lifecycle:** Implement DSL-147 PendingSlashBook::expired_by- **lifecycle:** Implement DSL-148 SlashingManager::new + set_epoch- **lifecycle:** Implement DSL-149 SlashingManager::is_slashed- **lifecycle:** Implement DSL-150 SlashingManager is_processed + pending + prune- **lifecycle:** Implement DSL-151 correlation penalty saturation clamp- **lifecycle:** Implement DSL-152 submit_evidence ReporterIsAccused short-circuit- **participation:** Implement DSL-153 ParticipationTracker::rewind_on_reorg- **participation:** Implement DSL-154 ParticipationFlags serde roundtrip- **inactivity:** Implement DSL-155 InactivityScoreTracker::rewind_on_reorg- **protection:** Implement DSL-156 SlashingProtection::rewind_proposal_to_slot- **evidence:** Implement DSL-157 SlashingEvidence serde roundtrip- **evidence:** Implement DSL-158 IndexedAttestation serde roundtrip- **appeal:** Implement DSL-159 SlashAppeal::hash determinism + sensitivity- **appeal:** Implement DSL-160 SlashAppeal + SlashAppealPayload serde roundtrip- **appeal:** Implement DSL-161 PendingSlash + AppealAttempt + PendingSlashStatus serde- **lifecycle:** Implement DSL-162 submit_evidence skips already-slashed indices- **lifecycle:** Implement DSL-163 SlashingResult + PerValidatorSlash + FinalisationResult serde- **appeal:** Implement DSL-164 AppealAdjudicationResult serde- **orchestration:** Implement DSL-165 EpochBoundaryReport + ReorgReport + FlagDelta serde- **bonds:** Implement DSL-166 BondTag::Reporter vs Appellant distinguishable- **appeal:** Implement DSL-171 AppealVerdict::to_appeal_outcome- **orchestration:** Implement DSL-170 SlashingSystem carries network_id- **orchestration:** Implement DSL-169 run_epoch_boundary reward_payout + inactivity wiring- **appeal:** Implement DSL-167 adjudicate_appeal top-level dispatcher- **remark:** Implement DSL-168 process_block_admissions block-level entry point

### Documentation
- **evidence:** Finish DSL-003 tracking updates + gitignore .claude- **evidence:** Finish DSL-004 TRACKING.yaml update- Check off DSL-009 in IMPLEMENTATION_ORDER- **evidence:** Finish DSL-017 VERIFICATION.md row update- **evidence:** Finish DSL-018 VERIFICATION.md row update- **lifecycle:** Finish DSL-022 VERIFICATION.md row- **lifecycle:** Finish DSL-025 TRACKING.yaml update- **appeal:** Finish DSL-034/DSL-035 TRACKING rows- **appeal:** Finish DSL-040 VERIFICATION.md row- **appeal:** Finish DSL-042 VERIFICATION.md row- **requirements:** Add Phase 12 Integration Closures (DSL-167..171)- **readme:** Comprehensive LLM-friendly public API reference

### Chores
- Bootstrap crate + feat(evidence): implement DSL-001 OffenseType BPS mapping- **cargo:** Add crates.io publish metadata