Description:
Detect and penalise solvers that repeatedly accept intents without filling (locking user funds for the fill window) via escalating cooldowns, capacity reductions, and reputation impact.
Problem Statement & Context:
A griefing solver can accept many intents to block competitors and users, paying at most one slash per intent. Pre-slash controls are needed to limit the blast radius.
Scope & Acceptance Criteria:
- Rolling unfilled-accept ratio per solver; thresholds trigger cooldown (no accepts for T), then reduced concurrency cap, then suspension.
- Controls enforced at accept time with clear error codes; all actions audited.
- Parameters configurable; dashboard metrics per solver.
- Out of scope: on-chain penalties beyond existing slashing.
Implementation Guidelines:
- Key Files/Modules:
src/intents/intents.controller.ts (accept), src/solvers/solvers.service.ts, src/intents/intents-sweeper.service.ts.
- Design/Architecture: Policy engine object evaluated in the accept critical section.
- Edge Cases/Constraints: Legitimate failures due to chain outages should be excludable by admin incident flag.
- Testing: Simulation tests with a griefing solver; fairness tests with honest solvers.
Definition of "Done": Common DoD.
Resources:
- Design reference: N/A (backend-only)
src/intents/intents.service.ts (getAcceptedCountBySolver)
Common Definition of "Done" (applies in addition to the criteria above):
- Code written, tested, and documented (TSDoc on public APIs, README/runbook/ADR updates where behaviour changes).
- All acceptance criteria met;
npm run lint, npm run typecheck, npm test, npm run test:e2e pass in CI.
- PR follows
.github/PULL_REQUEST_TEMPLATE, uses a Conventional Commit title (enforced by commitlint), includes test output / metrics screenshots, and references the issue.
- New env vars are added to
.env.example variants and src/config/env.validation.ts (the check:env-drift script must pass).
- Reviewed and approved by at least one CODEOWNER.
Description:
Detect and penalise solvers that repeatedly accept intents without filling (locking user funds for the fill window) via escalating cooldowns, capacity reductions, and reputation impact.
Problem Statement & Context:
A griefing solver can accept many intents to block competitors and users, paying at most one slash per intent. Pre-slash controls are needed to limit the blast radius.
Scope & Acceptance Criteria:
Implementation Guidelines:
src/intents/intents.controller.ts(accept),src/solvers/solvers.service.ts,src/intents/intents-sweeper.service.ts.Definition of "Done": Common DoD.
Resources:
src/intents/intents.service.ts(getAcceptedCountBySolver)Common Definition of "Done" (applies in addition to the criteria above):
npm run lint,npm run typecheck,npm test,npm run test:e2epass in CI..github/PULL_REQUEST_TEMPLATE, uses a Conventional Commit title (enforced by commitlint), includes test output / metrics screenshots, and references the issue..env.examplevariants andsrc/config/env.validation.ts(thecheck:env-driftscript must pass).