All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
router-core: routes can now be registered with an optional TTL viaregister_route_with_ttl.resolve()returnsRouteExpiredonce the current ledger exceeds a route's expiry,get_all_routes()excludes expired routes, andextend_route_ttllets the admin extend a route's TTL before it expires.get_route_expiryreturns a route's expiry ledger, if any. Routes registered without a TTL remain permanent.router-access: blacklist entries can now include an optionalreasonand anexpires_attimestamp. Expired blacklist entries are treated as not blacklisted.router-registry:ContractEntryincludes an optionaldeprecation_reasonand thedeprecate()API accepts an optional reason which is emitted in thecontract_deprecatedevent.router-registry: newRegistryError::InvalidHealthFn = 12variant, returned byregister_with_checkwhenhealth_fnis not in the documented allow-list. Closes #828.metrics/alerts.yml: example Prometheus alerting rules for circuit breaker opens, high failure/error rates, and high request volume.
- Documentation: added a top-level
CHANGELOG.mdfollowing Keep a Changelog format.
router-registry:register_with_checknow restrictshealth_fnto a fixed allow-list of conventionally side-effect-free symbols —healthorping— and rejects any other symbol with the newInvalidHealthFnerror before dispatching any cross-contract call. Previously,try_invoke_contractwas invoked on the target address with an arbitrary admin-supplied symbol, allowing an admin (operator error, compromised key, or misleading naming on the target) to trigger state-mutating entry points on the registered contract during what was meant to be a passive liveness probe. The doc comment onregister_with_checkis updated with explicit security notes covering the invariant.
router-execution: execution pipeline with simulation, retries, and fee estimationrouter-quote: read-only quote preview contract for expected output, fees, and route detailsrouter-middleware: circuit breaker functionality with auto-recoveryrouter-middleware: call logging with configurable retentionrouter-core: route metadata support (description, tags, owner)router-core: route aliasing systemrouter-core: route scoring and best route selectionmetrics: Prometheus/OpenTelemetry metrics exporter
router-core: admin() now panics on uninitialized contract instead of returning Resultrouter-middleware: admin() now panics on uninitialized contract instead of returning Result
router-middleware: rate limit state no longer written when route is disabled before commitrouter-middleware: call log retention now correctly enforces maximum entries
router-middleware: rate limiting per route with configurable windowsrouter-middleware: global and per-route enable/disable controlsrouter-middleware: pre_call and post_call hooksrouter-timelock: delayed execution queue for sensitive operationsrouter-multicall: batch multiple cross-contract calls in one transactionrouter-core: pause/unpause controls at global and per-route levelrouter-core: total_routed counter- Integration tests for cross-contract interactions
router-core: route removal now cleans up dangling aliases- Event naming convention: all events now use past tense verbs in snake_case
router-core: central dispatcher with route registration and resolutionrouter-registry: versioned contract address registry with deprecation supportrouter-access: role-based access control with blacklisting- Basic event emission for all route operations
- Docker Compose setup for local development
- Comprehensive unit test suite for all contracts
- README with architecture diagrams and usage examples