Trigger Pattern MONETARY_PARAMETER flag (fee, rate, emission, cap, bps values) - Inject Into Breadth agents (merged via M4 hierarchy)
Trigger Pattern: MONETARY_PARAMETER flag (required) Inject Into: Breadth agents (merged via M4 hierarchy) Finding prefix:
[EDA-N]Rules referenced: R2, R10, R13, R14
rate|rebase|supply|burn|emission|inflation|peg|price_cap|price_floor|
fee|reward_rate|basis_points|bps|fee_bps|spread
Soroban arithmetic context: All numeric values use i128 (signed 128-bit). No floating-point. Fee/rate formulas use integer multiply-then-divide. Overflow panics unless checked_* used; unchecked release-mode i128 wraps silently. Division truncates toward zero.
For every monetary parameter setter (rate, fee, reward rate, emission, cap, floor, BPS values):
| Parameter | Setter Function | Min Value | Max Value | Enforced? | Impact at Min | Impact at Max |
|---|
For each: substitute min and max into ALL consuming functions.
Tag: [BOUNDARY:param=val -> outcome]
Soroban-specific boundary checks:
i128 overflow in multiply-then-divide? (amount * rate_bps overflows before division if both are large; check for checked_mul).checked_div() or explicit guard)i128 value cause unexpected behavior? (signed type allows negative rates if not bounds-checked)List all economic invariants the protocol must maintain:
| Invariant | Parameters Involved | Can Admin Break It? | Functions That Assume It |
|---|
For each setter: can changing this parameter break an invariant that user-facing functions depend on? If yes → finding.
Soroban-specific invariants:
i128 allows negative values — if subtraction underflows without checked math, balance can go negative silently.None, unwrap() panics; unwrap_or(0) may silently break the invariant.For protocols with multiple monetary parameters that interact:
| Parameter A | Parameter B | Interaction | Can A x B Produce Extreme Output? |
|---|
Check: can two independently-valid settings combine to create an extreme economic state? (Rule 14 constraint coherence)
Pick 3 representative fee rates and trace through the actual code formula:
| Fee Param | Value | Formula | Input Amount (i128) | Expected Output | Actual Output | Match? |
|---|
Tag: [BOUNDARY:fee_bps={val} -> effective_rate={computed_rate}]
Note: XLM uses 7 decimal places (1 XLM = 10_000_000 stroops). Verify formulas account for correct denomination.
Red flags:
amount * MAX / (MAX - fee) charges higher effective rate than fee/MAXi128 division truncates toward zero — verify intended directionamount * rate / MAX vs amount / MAX * rate — second loses precision for small amountsFor every fee computation, trace the base amount through ALL subsequent code paths:
| Fee Site | Base Amount Variable | Modified After Fee? | Modified How | Fee Recomputed? | Overcharge? |
|---|
Methodology: Identify fee base variable → trace FORWARD → if variable reduced (capped, slippage-adjusted) AFTER fee computed → fee charged on larger base than processed.
For protocols with multiple fee types:
| Fee A | Fee B | A Output Feeds B Input? | Combined Effective Rate | Independent Rate Sum | Discrepancy? |
|---|
If share-based accounting: does fee deduction change share price? Does it create deposit-vs-immediate-withdrawal spread? With i128 rounding, does deposit vs withdraw favor one direction consistently?
For protocols with emission/inflation/reward distribution:
transfer? zero rewards? proportional reduction?)| Emission Parameter | Max Rate | Vault Balance Required | Ledgers to Depletion at Max | Cap Exists? |
|---|
Soroban meters resources across CPU instructions, memory (bytes), and ledger I/O (entries read + written) — all per-transaction budgeted and network-configurable.
For batch operations (mass distributions, multi-user updates, bulk settlements):
| Operation | Ledger Entries Read | Ledger Entries Written | Memory Growth | Scales With N? | DoS via Large N? |
|---|
Key cost considerations:
size_bytes * fee_rate * extension_ledgers — unbounded extensions can drain operational budget| Storage Entry | Storage Type | Current TTL Strategy | Who Pays to Extend | Risk if Expired |
|---|
Checks:
instance().get() with unwrap() panic — contract unusable**ID**: [EDA-N]
**Verdict**: CONFIRMED / PARTIAL / REFUTED / CONTESTED
**Step Execution**: (see checklist below)
**Rules Applied**: [R2:___, R10:___, R13:___, R14:___]
**Severity**: Critical/High/Medium/Low/Info
**Location**: src/{file}.rs:LineN
**Title**: {parameter boundary violation / invariant break / economic unsustainability / TTL expiry DoS}
**Description**: {specific issue with code reference and numerical example using i128 values}
**Impact**: {quantified at worst-state operational parameters — Rule 10}
| Section | Required | Completed? | Notes |
|---|---|---|---|
| 1. Parameter Boundary Analysis | YES | ||
| 2. Economic Invariant Identification | YES | ||
| 3. Rate/Supply Interaction Matrix | IF >1 monetary param | ||
| 4. Fee Formula Verification at Normal Values | IF fee parameters detected | ||
| 5. Emission/Inflation Sustainability | IF emission/reward detected | ||
| 6. Resource Metering and Cost Economics | YES | ||
| 7. TTL Cost Economics | YES | Soroban-specific — never skip |
If any step skipped, document valid reason (N/A, single parameter, no emissions, no TTL-sensitive keys).