All notable changes to the Soroban Keeper Network are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
register_tasknow rejectslock_ledgersoutside[MIN_LOCK_LEDGERS, MAX_LOCK_LEDGERS]andttl_ledgersbelowMIN_TTL_LEDGERS, returning the newInvalidTaskParamserror. Previously alock_ledgersof0let any keeper instantly re-claim a task from another keeper, an oversizedlock_ledgerslet one unresponsive keeper hold a task hostage until the deadline, and attl_ledgersof0risked stranding escrowed funds.
register_tasknow rejectscalldatalarger thanMAX_CALLDATA_LEN(1024 bytes) with a newCalldataTooLargeerror. Previouslycalldatawas unbounded, so a task owner could register a payload that every later lifecycle call (claim_task,execute_task, the permissionlessexpire_task) would have to re-read and re-write in full, pushing the storage and re-serialisation cost onto keepers and passers-by rather than the owner who chose the payload size.- Empty
calldatais intentionally still accepted; documented in the README. - Adding
CalldataTooLargechanges the contract's error ABI —VERSIONbumped from 1 to 2.
- Deployed
KeeperRegistryto Stellar testnet (CDJOYHBS7C2PVJS47BTRDLGBNG2YOE43VX6Y3EWIZPPPKOPRNYQQ54U4) and ran a full register → claim → execute → withdraw cycle on-chain. - Added docs/DEMO.md (transaction-by-transaction trace) and DEPLOYMENTS.md (canonical address record); surfaced the live deployment in the README.
increase_reward— owners can top up a task bounty (Pending/Claimed).extend_deadline— owners can push out a task's deadline.set_min_reward+min_rewardview — admin-set anti-dust floor for new tasks.is_claimableview — cheap keeper-side eligibility check.versionview +VERSIONconstant for ABI detection.- Governance events on pause/unpause, fee change, and admin transfer, plus
topup/extendtask events.
split_rewardaccounting-invariant sweep (conservation, bounds, formula).- Multi-keeper end-to-end conservation test across execute/expire/cancel.
- Test count grown from 38 to 52.
- CONTRIBUTING-facing repo setup:
.editorconfig,rustfmt.toml,.gitignore, Code of Conduct, issue templates (bug / feature / good-first-issue) + chooser, PR template,CODEOWNERS, a Wave-Program label taxonomy, and aMakefile. docs/ARCHITECTURE.mdanddocs/DEPLOYING.md; README documentation index.scripts/optimize.shbuild/optimize helper.
- CI: concurrency control (cancels superseded runs) and
--lockedbuilds. - Repository references updated to the
soroban-toolingorg.
- Cleared all compiler and
clippy -D warningsfindings and appliedrustfmtso the CI lint/format gates pass. Removed the ignored child-manifest[profile.release].
The KeeperRegistry contract's core lifecycle is now fully implemented and
tested (38 unit tests, full happy-path and error-path coverage):
claim_task— permissionless first-come-first-served claiming, with re-claim allowed only after the prior claimer's lock window elapses.execute_task— execution-proof submission, reward split between keeper and protocol fee, and CEI-safe keeper crediting.cancel_task— owner reclaims escrow of a still-Pending task.expire_task— permissionless deadline enforcement; anyone can refund a stuck task's escrow to its owner after the deadline.withdraw_rewards— keeper pulls its accrued balance (balance zeroed before transfer to prevent re-entrant double-spend).sweep_fees+FeesAccruedaccumulator — admin moves accrued protocol fees to a treasury; can never touch task escrow or keeper balances.- Admin controls —
pause/unpause(funds-recovery paths stay open during a pause),set_fee_bps(bounded, future-effective),transfer_admin(dual auth to prevent lock-out), andupgrade. - Views —
fees_accrued, alongside the existing task/keeper/state views.
- Retry with exponential back-off + jitter on transient RPC errors, skipping retries on permanent contract errors.
- Graceful shutdown (SIGINT/SIGTERM) that drains the in-flight round so a task is never left claimed-but-unexecuted.
- Optional permissionless expiry of past-deadline tasks to refund owners.
- Pinned
ed25519-dalekto 2.2.0 and committedCargo.lockso the test build is reproducible (soroban-env-hostwas resolving an incompatible 3.0.0).