Execution

Execution primitives answer pre- and post-trade execution questions: “how much slippage on this swap?” and “did I get sandwiched?”

Two primitives: - CalculateSlippage — pre-trade slippage and price-impact decomposition for a proposed swap - DetectMEV — post-trade comparison of actual on-chain output vs the invariant-implied output

All primitives in the Agentic Primitives section follow the same contract: stateless construction, computation at .apply(), typed dataclass return.

Setup

[1]:
from defipy.twin import MockProvider, StateTwinBuilder

provider = MockProvider()
builder = StateTwinBuilder()
lp_v2 = builder.build(provider.snapshot("eth_dai_v2"))
tokens = lp_v2.factory.token_from_exchange[lp_v2.name]

CalculateSlippage

Purpose. Pre-trade slippage + price-impact decomposition. Reports execution price, slippage cost in token-out units, price impact, and the maximum trade size that stays under 1% slippage.

Signature.

CalculateSlippage().apply(
    lp, token_in, amount_in,
    lwr_tick=None, upr_tick=None,
) -> SlippageAnalysis

max_size_at_1pct is None for V3 (tick-crossing math); float for V2 (closed-form). V3 trades that cross multiple ticks have approximate price_impact_pct (single-tick assumption).

[2]:
from defipy import CalculateSlippage

# Quote a 10 ETH -> DAI swap.
result = CalculateSlippage().apply(lp_v2, tokens["ETH"], amount_in=10.0)
[3]:
print(f"spot_price:         {result.spot_price:.4f}")
print(f"execution_price:    {result.execution_price:.4f}")
print(f"slippage_pct:       {result.slippage_pct:.6f}")
print(f"slippage_cost:      {result.slippage_cost:.4f}")
print(f"price_impact_pct:   {result.price_impact_pct:.6f}")
print(f"max_size_at_1pct:   {result.max_size_at_1pct:.4f}")
spot_price:         100.0000
execution_price:    98.7158
slippage_pct:       0.012842
slippage_cost:      12.8420
price_impact_pct:   0.019675
max_size_at_1pct:   7.0920

DetectMEV

Purpose. Post-trade MEV-extraction detector. Compares actual on-chain actual_output against the invariant-predicted theoretical output for the same trade — gap above the threshold flags likely_frontrun.

Signature.

DetectMEV(frontrun_threshold_bps=50.0).apply(
    lp, token_in, amount_in, actual_output,
    lwr_tick=None, upr_tick=None,
) -> MEVDetectionResult

direction{"underdelivered", "overdelivered", "matches"}. likely_frontrun is True only when underdelivered AND the gap exceeds the threshold (overdelivery never flags). Caller is responsible for supplying lp at the correct historical state.

First example: actual ≈ theoretical → not a frontrun.

[4]:
from defipy import DetectMEV

result = DetectMEV().apply(
    lp_v2,
    token_in = tokens["ETH"],
    amount_in = 10.0,
    actual_output = 987.0,    # ≈ theoretical
)
print(f"theoretical_output:  {result.theoretical_output:.4f}")
print(f"actual_output:       {result.actual_output:.4f}")
print(f"extraction_bps:      {result.extraction_bps:.2f}")
print(f"direction:           {result.direction}")
print(f"likely_frontrun:     {result.likely_frontrun}")
theoretical_output:  987.1580
actual_output:       987.0000
extraction_bps:      1.60
direction:           underdelivered
likely_frontrun:     False

Second example: 50 ETH worth less DAI than expected → frontrun flagged.

[5]:
result = DetectMEV().apply(
    lp_v2,
    token_in = tokens["ETH"],
    amount_in = 10.0,
    actual_output = 937.0,    # ~5% short
)
print(f"extraction_amount:   {result.extraction_amount:.4f}")
print(f"extraction_bps:      {result.extraction_bps:.2f}")
print(f"direction:           {result.direction}")
print(f"likely_frontrun:     {result.likely_frontrun}")
extraction_amount:   50.1580
extraction_bps:      508.11
direction:           underdelivered
likely_frontrun:     True

Protocol coverage

MCP tool exposure

In the curated 10:

  • CalculateSlippage

Not in the curated 10:

  • DetectMEV — post-trade forensic; agents typically want to ask this after observing a settled trade, which is a less common workflow than pre-trade slippage. Composable when needed.