Parameters and configuration
The PT implementation splits configuration across several surfaces. Where a value lives determines who can change it and whether the workflow must be redeployed.
Configuration surfaces
| Surface | Controls | Change path |
|---|---|---|
PTParameterRegistry | Shared per-PT methodology parameters and eligibility | Registry updater transaction |
| Router route | Workflow destination, enablement, replay guard, publication delay, scalar step | Owner or route updater transaction |
AgentHub and RangeValidationModule | Agent enablement, injection delay, directional execution ranges | Agent administration transaction |
| Workflow configuration | Networks, addresses, schedule, gas, write simulation, risk deadbands, target definitions | Deployment-owned configuration and workflow deployment |
| Methodology code | Equations, encodings, domain checks, and fixed constants | Code review, tests, rebuild, redeployment, and route update |
No canonical deployment target or schedule is defined here. Deployment-owned configuration supplies those operational values.
PTParameterRegistry
PtMarketParams contains only the fields shared through the on-chain PT registry:
| Field | Type | Used by | Meaning |
|---|---|---|---|
enabled | bool | All workflows | Whether this PT is eligible for new records |
modelVersion | uint32 | All workflows | Methodology version included in record provenance |
emaSpan | uint32 | Market state | Number of observations in the EMA smoothing span |
emaFreshnessSeconds | uint64 | Discount and risk parameters | Maximum age of both the EMA observation and its source block |
thresholdBps | uint64 | Discount rate | Required absolute adapter-versus-market price deviation |
kReferenceEndpoint | uint64 | Risk parameters | Reference pool-proportion multiplier scaled by 10,000 |
emodeCategoryIds | uint16[] | Risk parameters | Governed eMode categories eligible for evaluation |
The registry requires a non-zero EMA span, freshness interval, reference multiplier, and non-empty eMode list. thresholdBps cannot exceed 10,000.
kReferenceEndpoint = 25_000 represents 2.5×. It uses 10,000 as a fixed-point scale, not ordinary percentage basis points.
Workflow configuration
Every workflow receives its schedule, source-chain identifiers, write-chain identifiers, contract addresses, and gas limit from deployment configuration.
The executable workflows also configure the router receiver, Forwarder, RiskOracle, AgentHub, and agent ID used for write simulation and publication.
The risk-parameter workflow also defines:
| Field | Meaning |
|---|---|
ltDeviationThresholdBps | Publish deadband for liquidation threshold |
ltvDeviationThresholdBps | Publish deadband for loan-to-value |
lbDeviationThresholdBps | Publish deadband for liquidation bonus |
targets[] | Methodology definitions available to the deployment |
Each target contains:
| Field | Meaning |
|---|---|
emodeId | Aave eMode category identifier |
label | Human-readable operational label |
categoryKey | Methodology category label |
underlyingKey | Underlying asset label |
ltCapBps | Maximum methodology liquidation threshold |
lbFloorBps | Minimum methodology liquidation bonus |
The registry list and deployment target list must intersect. Adding an ID only to the registry does not create a methodology target; adding one only to workflow configuration does not make it eligible.
Router controls
Each executable workflow route can define:
| Control | Meaning |
|---|---|
enabled | Whether the workflow identity may publish |
minDelaySeconds | Minimum interval per workflow, market, and update type |
maxStepBps | Relative scalar movement limit; not applied to tuple payloads |
maxReportAgeSeconds | Maximum accepted age of the signed consensus timestamp |
The router also requires strict timestamp ordering when its report-age guard is enabled. Disabling the route is the correct way to stop it without changing report encoding.
AgentHub and range controls
AgentHub provides a second timing and enablement boundary for execution. It tracks the last successfully injected update separately from the router's last publication.
RangeValidationModule supplies maximum increase and decrease values for each update type. Each direction can be:
- absolute, expressed in the parameter's native units; or
- relative, expressed against the current value.
Market-specific ranges take precedence over default ranges. The current workflows fail closed when required agent or range wiring is missing.
Fixed implementation constants
| Constant | Value | Purpose |
|---|---|---|
| Year | 31,536,000 seconds | Matches the PT adapter's 365-day convention |
| LTV/LT buffer | 200 bps | Derives LTV below liquidation threshold |
| Maximum market proportion | 96% | Bounds the stressed Pendle reference endpoint |
| Oracle price floor | 1e-9 | Avoids zero in intermediate calculations |
| Maximum EMA log rate | 10 | Rejects unsupported implied-rate input |
K_FACTOR_SCALE | 10,000 | Fixed-point scale for kReferenceEndpoint |
Changing these values changes methodology semantics and requires code-level review rather than a registry transaction.
Coordinating controls
The same recommendation can encounter controls at several layers:
- a workflow publication deadband decides whether a difference is material;
- router timing and replay controls decide whether the report may be stored;
- AgentHub timing decides whether a stored recommendation may be injected; and
- range validation and protocol invariants decide whether the action is safe.
A tighter downstream control is not bypassed by a looser workflow. It prevents execution or causes the publication preflight to reject the report.
Disable and pause controls
| Control | Scope | Effect |
|---|---|---|
Registry enabled = false | One PT across all three workflows | Workflows skip new records |
| Router route disabled | One executable workflow identity | Router rejects that workflow |
| Router paused | All router routes | Router rejects routed reports |
| Agent disabled | One execution path | Recommendation may remain stored, but that agent does not act |
None of these controls reverses an Aave parameter change that was already executed.