Uniswap v3 (SwapRouter02)

B80/100

Base fork at block 52676196 (2026-10-16 09:08:59 UTC) · 2/2 flows executed · 34 cases · 1 high3 medium6 low1 info

Agent Readiness Score

ComponentPointsBasis
Task completion30 / 302 of 2 executed flows completed by the careful agent
Safety for a naive agent15 / 25price moved 125 bps / 124 bps against the trade: a careful agent's bound made the call revert (nothing lost); a bound-less agent lost up to 125 bps (60% for the bound working, 40% for loss below the move)
Input hardening11.9 / 155 of 24 weighted probe points were accepted unsafely
Error legibility5.3 / 10mean revert legibility 0.53 over 6 reverts raised by the protocol (7 raised by tokens not counted)
Approval surface10 / 10exact approvals suffice; spender is the entry contract
Interface clarity7.5 / 105 static interface finding(s)

Findings

high Output can be sent to the zero address · dynamic

Swap 1000 USDC for WETH on SwapRouter02: with recipient = 0x0 the call succeeded and the result did not reach the agent (checks failed: WETH balance increases; funds left the agent and the expected result did not arrive). A single wrong argument burns the agent's funds.

Fix. Revert when the recipient is address(0) with a named error such as `InvalidRecipient()`.

Where: SwapRouter02 (swap-usdc-weth) · Evidence: swap-usdc-weth.prober.zero-recipient

medium Reverts are hard for an agent to act on · dynamic

6 reverts were observed across the battery; mean legibility 0.53 (1 = named custom error with parameters; 7 more reverts raised by token contracts are not counted). 2 were empty, panics or errors missing from the published ABI; the rest were short string codes. Examples: Error("Too little received"); (empty revert).

Fix. Use named custom errors with parameters (`error InsufficientAllowance(uint256 have, uint256 need)`) and include them in the verified ABI; avoid numeric string codes.

Evidence: swap-usdc-weth.careful.mevswap-usdc-weth.prober.zero-amountswap-usdc-weth.prober.no-approval

medium Agents without an output bound lose ~125 bps when the price moves 125 bps (swap-usdc-weth) · dynamic

Swap 1000 USDC for WETH on SwapRouter02: after an attacker moved the pool price about 125 bps against the trade, the naive, slippage-insensitive, sandwich-prone agent(s) executed 125 bps below the careful baseline, while the careful agent's output bound made its own call revert instead (nothing lost). In this model the attacker's front-run and unwind netted +7.2655 USDC.

Fix. Make the output bound impossible to skip in agent-facing docs, SDKs and tool descriptions (default to quote minus 0.5%), and consider rejecting a zero minimum output for calls that come from registered agent wallets.

Where: SwapRouter02 · Evidence: swap-usdc-weth.naive.mevswap-usdc-weth.slippage-insensitive.mevswap-usdc-weth.sandwich-prone.mev

medium Agents without an output bound lose ~124 bps when the price moves 124 bps (swap-weth-usdc) · dynamic

Swap 1 WETH for USDC on SwapRouter02: after an attacker moved the pool price about 124 bps against the trade, the naive, slippage-insensitive, sandwich-prone agent(s) executed 124 bps below the careful baseline, while the careful agent's output bound made its own call revert instead (nothing lost). In this model the attacker's front-run and unwind netted -0.1292 WETH (unprofitable at this trade size and pool depth: the agent's loss is the price move, not necessarily extractable value).

Fix. Make the output bound impossible to skip in agent-facing docs, SDKs and tool descriptions (default to quote minus 0.5%), and consider rejecting a zero minimum output for calls that come from registered agent wallets.

Where: SwapRouter02 · Evidence: swap-weth-usdc.naive.mevswap-weth-usdc.slippage-insensitive.mevswap-weth-usdc.sandwich-prone.mev

low A 1-unit amount is accepted and returns nothing · dynamic

Swap 1000 USDC for WETH on SwapRouter02: an amount of 1 base unit was taken and nothing came back, yet the call succeeded. The loss is only the dust, but an agent that trusts the transaction status will report success. Swap 1 WETH for USDC on SwapRouter02: an amount of 1 base unit was taken and nothing came back, yet the call succeeded. The loss is only the dust, but an agent that trusts the transaction status will report success.

Fix. Revert on amounts that round to zero shares or zero output (`ZeroShares()`), instead of taking the funds.

Where: SwapRouter02 (swap-usdc-weth, swap-weth-usdc) · Evidence: swap-usdc-weth.prober.dust-amountswap-weth-usdc.prober.dust-amount

low 6 swap functions cannot expire · static

exactInput, exactInputSingle, exactOutput, exactOutputSingle, swapExactTokensForTokens, swapTokensForExactTokens take no deadline; one exists only through the `multicall(uint256 deadline, bytes[] data)` wrapper, which an agent must know to use. A transaction left in the mempool can execute at a much later, worse price.

Fix. Add a `deadline` parameter that reverts with a named `Expired(uint256 deadline, uint256 timestamp)` error, or make the multicall-with-deadline path the documented default for agents.

Where: SwapRouter02.exactInput, exactInputSingle, exactOutput, exactOutputSingle, swapExactTokensForTokens, swapTokensForExactTokens ·

low No custom errors in the ABI · static

SwapRouter02 publishes no `error` definitions: failures reach an agent as strings, panics or empty reverts that it cannot decode against the ABI.

Fix. Use named custom errors with parameters (`error InsufficientOutput(uint256 received, uint256 minimum)`) and include them in the published ABI.

Where: SwapRouter02 ·

low No event definitions in the published ABI · static

The published ABI of SwapRouter02 contains no events, so a tool that decodes receipts from the ABI sees raw logs only. (The battery checks below whether the contract emits events anyway.)

Fix. Include every emitted event (including those defined in libraries) in the verified ABI, or emit them from the entry contract.

Where: SwapRouter02 ·

low 2 function(s) take parameters that must stay at a sentinel value · static

exactInputSingle, exactOutputSingle take `sqrtPriceLimitX96`: in the common case these must be 0 or empty, and a non-sentinel value silently changes behaviour (a price limit that partially fills, a referral id, a callback into the caller) instead of reverting.

Fix. Document the neutral value in the NatSpec and the SDK, validate unexpected values with a named error, or offer an overload without the parameter.

Where: SwapRouter02.exactInputSingle, exactOutputSingle ·

low 3 function(s) take wide structs · static

exactInputSingle, exactOutputSingle, mint pack five or more fields (addresses, amounts and limits mixed) into one struct; positional mistakes (swapping two amounts or two addresses) are easy for an agent and invisible to the type checker.

Fix. Publish a field-order table with units in the docs, and add a typed SDK helper; where possible give amount and limit fields distinct, self-describing names.

Where: SwapRouter02.exactInputSingle, exactOutputSingle, mint ·

info The entry contract emits no event for swap-usdc-weth, swap-weth-usdc · dynamic

The successful transactions of swap-usdc-weth, swap-weth-usdc carried no event from the configured contract(s); an agent can only confirm them from token transfer logs or by re-reading state.

Fix. Emit an event from the entry contract with the account, tokens and amounts.

Evidence: swap-usdc-weth.careful.baselineswap-weth-usdc.careful.baseline

What held

  • Swap 1000 USDC for WETH on SwapRouter02: the careful agent's output bound turned a 125 bps price move into a safe revert (0 bps lost).
  • Swap 1 WETH for USDC on SwapRouter02: the careful agent's output bound turned a 124 bps price move into a safe revert (0 bps lost).
  • No protocol contract called into the agent's wallet during 2 traced flow(s) (call trees checked).
  • A careful agent completed 2/2 flows (exact approval, simulation, bounded output, on-chain verification).

Agents

AgentCompletedRefused / revertedApproval leftGas (total)Worst loss under a price move
Careful
Approves exactly the amount, simulates before sending, bounds output at the quote minus 0.5%, sets a 20-minute deadline, verifies the result on chain and revokes leftover allowance.
2/20/0none385,5920 bps
Naive
Approves the maximum, accepts any output, sets a far-future deadline, never simulates, trusts the transaction status.
2/20/0unlimited392,272125 bps (12.5 USDC, ~$12.5)
Max-approve
Careful in everything except approving the maximum and never revoking: isolates the approval surface.
2/20/0unlimited392,416n/a
Slippage-insensitive
Careful in everything except accepting any output: isolates slippage exposure.
2/20/0none385,424125 bps (12.5 USDC, ~$12.5)
Re-entrancy probe
Careful, with the transaction's call tree analysed for calls from protocol contracts back into the agent's wallet. It does not deploy attacker contracts.
2/20/0none385,592n/a
Sandwich-prone
Bound-less, no simulation, far deadline; run after an attacker moved the pool price, then unwound by the attacker to measure extractable value.
2/20/0none385,448125 bps (12.5 USDC, ~$12.5)

Under a price move

An attacker moves the pool price against the trade after the agent has quoted and before its transaction lands. The careful agent's output bound reverts; agents without one execute at the worse price.

FlowPrice movedcarefulslippage-insensitivenaivesandwich-prone
swap-usdc-weth125 bpsreverted, 0 bps125 bps lost125 bps lost125 bps lost
attacker net +7.2655 USDC
swap-weth-usdc124 bpsreverted, 0 bps124 bps lost124 bps lost124 bps lost
attacker net -0.1292 WETH

Careless and hostile inputs

FlowInputProtocol responseRevert
swap-usdc-wethzero-amountrejectedError("AS")
swap-usdc-wethdust-amountaccepted unsafe—
swap-usdc-wethzero-recipientaccepted unsafe—
swap-usdc-wethno-approvalrejectedError("STF")
swap-usdc-wethoverspendrejectedError("STF")
swap-usdc-wethimpossible-min-outrejectedError("Too little received")
swap-usdc-wethnon-contract-tokenrejected(empty revert)
swap-weth-usdczero-amountrejectedError("AS")
swap-weth-usdcdust-amountaccepted unsafe—
swap-weth-usdczero-recipientrejectedError("TF")
swap-weth-usdcno-approvalrejectedError("STF")
swap-weth-usdcoverspendrejectedError("STF")
swap-weth-usdcimpossible-min-outrejectedError("Too little received")
swap-weth-usdcnon-contract-tokenrejected(empty revert)

6 protocol reverts observed (and 7 raised by token contracts, not counted), mean legibility 0.53 (1 = named custom error with parameters). Examples: Error("Too little received") · (empty revert)

Generated tasks

Task specs are generated from the ABI by deterministic templates (no language model). Each lists the exact call, the approvals and the on-chain checks that define success.

swap-usdc-weth · Swap 1000 USDC for WETH on SwapRouter02

Swap 1000 USDC for WETH using Uniswap v3 (SwapRouter02) (SwapRouter02 at 0x2626664c2603336E57B271c5C0b26F421741e481 on Base). Receive the WETH in your own wallet and do not lose more than 0.5% to price movement. Done when your WETH balance has increased and your USDC balance has decreased by 1000.

Call exactInputSingle((address,address,uint24,address,uint256,uint256,uint160)) on SwapRouter02 (0x2626664c2603336E57B271c5C0b26F421741e481). Approvals: 0x833589… → 0x262666…. Success is read from chain state: WETH balance increases; USDC balance decreases.

Generated by uniswap-v3 exactInputSingle (fee 100). fee tier 100 chosen by simulated output on the fork (0.407714084602727315 WETH for 1000 USDC)

swap-weth-usdc · Swap 1 WETH for USDC on SwapRouter02

Swap 1 WETH for USDC using Uniswap v3 (SwapRouter02) (SwapRouter02 at 0x2626664c2603336E57B271c5C0b26F421741e481 on Base). Receive the USDC in your own wallet and do not lose more than 0.5% to price movement. Done when your USDC balance has increased and your WETH balance has decreased by 1.

Call exactInputSingle((address,address,uint24,address,uint256,uint256,uint160)) on SwapRouter02 (0x2626664c2603336E57B271c5C0b26F421741e481). Approvals: 0x420000… → 0x262666…. Success is read from chain state: USDC balance increases; WETH balance decreases.

Generated by uniswap-v3 exactInputSingle (fee 500). fee tier 500 chosen by simulated output on the fork (2451.341055 USDC for 1 WETH)

Contracts and ABIs

ContractAddressABIProxy
SwapRouter020x2626664c2603336E57B271c5C0b26F421741e481sourcify (match) · 39 functionsno

Reproducible traces

Every case with calldata, selectors, gas, revert data and decoded reason. Re-run the whole battery with karatum-protocol-audit run on an Anvil fork at the same block: the config hash and report hash below let you check you got the same result.

swap-usdc-weth.careful.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0x35c995cc…4c0a0734
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3harnessexpected output
expected output 407714084602727315
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5agentexactInputSingle
minOut 405675514179713678, deadline 1792142951
success0x04e45aaf 0x0015afcd…01bb372a
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.careful.mev reverted

reverted: Error("Too little received") (pool moved 125 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0x35c995cc…4c0a0734
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3harnessexpected output
expected output 407714084602727315
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5attackerfront-run exactInputSingle
size 1000000000, quote moved 2 bps
success0x04e45aaf 0xa7b182ed…07b5762e
6attackerfront-run exactInputSingle
size 1500000000, quote moved 7 bps
success0x04e45aaf 0xf564954e…3e6210cf
7attackerfront-run exactInputSingle
size 2250000000, quote moved 15 bps
success0x04e45aaf 0x30b4048a…d94dd296
8attackerfront-run exactInputSingle
size 3375000000, quote moved 29 bps
success0x04e45aaf 0x3553c20a…c898deee
9attackerfront-run exactInputSingle
size 5062500000, quote moved 56 bps
success0x04e45aaf 0x90a47fd3…0c1fce9b
10attackerfront-run exactInputSingle
size 7593750000, quote moved 96 bps
success0x04e45aaf 0x9cac380e…c15598fe
11attackerfront-run exactInputSingle
size 5695312500, quote moved 125 bps
success0x04e45aaf 0x75ce7fcf…071ca2b3
12agentexactInputSingle
minOut 405675514179713678, deadline 1792142951
reverted
Error("Too little received")
0x04e45aaf 0x0015afcd…01bb372a
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
13agentrevoke USDC allowance
cleanup
success0x095ea7b3 0x197f8f3c…5b636bce
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000000000000000000
swap-usdc-weth.max-approve.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
max approval
success0x095ea7b3 0x150106c9…d2e973bb
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
3harnessexpected output
expected output 407714084602727315
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5agentexactInputSingle
minOut 405675514179713678, deadline 1792142951
success0x04e45aaf 0x4fbea2d8…e972d12d
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.naive.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
max approval
success0x095ea7b3 0xebd9192e…bce328e8
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x9d4d590d…f8d75363
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.naive.mev success

all on-chain checks passed (pool moved 125 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
max approval
success0x095ea7b3 0xebd9192e…bce328e8
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
3attackerfront-run exactInputSingle
size 1000000000, quote moved 2 bps
success0x04e45aaf 0xa7b182ed…07b5762e
4attackerfront-run exactInputSingle
size 1500000000, quote moved 7 bps
success0x04e45aaf 0xf564954e…3e6210cf
5attackerfront-run exactInputSingle
size 2250000000, quote moved 15 bps
success0x04e45aaf 0x30b4048a…d94dd296
6attackerfront-run exactInputSingle
size 3375000000, quote moved 29 bps
success0x04e45aaf 0x3553c20a…c898deee
7attackerfront-run exactInputSingle
size 5062500000, quote moved 56 bps
success0x04e45aaf 0x90a47fd3…0c1fce9b
8attackerfront-run exactInputSingle
size 7593750000, quote moved 96 bps
success0x04e45aaf 0x9cac380e…c15598fe
9attackerfront-run exactInputSingle
size 5695312500, quote moved 125 bps
success0x04e45aaf 0x75ce7fcf…071ca2b3
10agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x9d4d590d…f8d75363
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.dust-amount check failedaccepted unsafe

checks failed: WETH balance increases; funds left the agent and the expected result did not arrive

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0x61dc59cb…6620ddbd
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000000000000000001
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x64bbc615…28e5a275
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.impossible-min-out revertedrejected

reverted: Error("Too little received"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0x71c055b2…3fad8325
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3harnessexpected output
expected output 407714084602727315
ok
4agentexactInputSingle
minOut 4077140846027273150, deadline 4102444800
reverted
Error("Too little received")
0x04e45aaf 0x11493fd9…f040dd7f
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.no-approval revertedrejected

reverted: Error("STF"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("STF")
0x04e45aaf 0x2cef8542…315afeb0
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.non-contract-token revertedrejected

reverted: (empty revert); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentexactInputSingle
minOut 0, deadline 4102444800
reverted
(empty revert)
0x04e45aaf 0x86d0928f…93cf8713
0x04e45aaf000000000000000000000000000000000000000000000000000000000000dead000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.overspend revertedrejected

reverted: Error("STF"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0x28903757…80da2ac2
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e48100000000000000000000000000000000000000000000000000000000b2d05e01
3agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("STF")
0x04e45aaf 0xc783e608…e9a4be4c
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.zero-amount revertedrejected

reverted: Error("AS"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("AS")
0x04e45aaf 0x2025191f…2b81eb2e
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.prober.zero-recipient check failedaccepted unsafe

checks failed: WETH balance increases; funds left the agent and the expected result did not arrive

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0xaf4ca33f…f669adc8
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0xd410cc69…b0b4e061
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.reentrancy-probe.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0x6653e288…9129c4d3
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3harnessexpected output
expected output 407714084602727315
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5agentexactInputSingle
minOut 405675514179713678, deadline 1792142951
success0x04e45aaf 0x76887706…7fd3e8a8
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.sandwich-prone.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0xe86a0971…5f0d5e1a
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x79039562…73f626f1
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.sandwich-prone.mev success

all on-chain checks passed (pool moved 125 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0xe86a0971…5f0d5e1a
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3attackerfront-run exactInputSingle
size 1000000000, quote moved 2 bps
success0x04e45aaf 0xa7b182ed…07b5762e
4attackerfront-run exactInputSingle
size 1500000000, quote moved 7 bps
success0x04e45aaf 0xf564954e…3e6210cf
5attackerfront-run exactInputSingle
size 2250000000, quote moved 15 bps
success0x04e45aaf 0x30b4048a…d94dd296
6attackerfront-run exactInputSingle
size 3375000000, quote moved 29 bps
success0x04e45aaf 0x3553c20a…c898deee
7attackerfront-run exactInputSingle
size 5062500000, quote moved 56 bps
success0x04e45aaf 0x90a47fd3…0c1fce9b
8attackerfront-run exactInputSingle
size 7593750000, quote moved 96 bps
success0x04e45aaf 0x9cac380e…c15598fe
9attackerfront-run exactInputSingle
size 5695312500, quote moved 125 bps
success0x04e45aaf 0x75ce7fcf…071ca2b3
10agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x79039562…73f626f1
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
11attackerback-run exactInputSingle
sells 10734656566726644017 WETH
success0x04e45aaf 0x160fcd86…d47e3ce5
swap-usdc-weth.slippage-insensitive.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0xfc58a208…6ef83bc9
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
4agentexactInputSingle
minOut 0, deadline 1792142951
success0x04e45aaf 0xf5868e0d…20f93e48
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-usdc-weth.slippage-insensitive.mev success

all on-chain checks passed (pool moved 125 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
USDC balance 3000000000
ok
2agentapprove USDC to spender
exact approval
success0x095ea7b3 0xfc58a208…6ef83bc9
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481000000000000000000000000000000000000000000000000000000003b9aca00
3agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
4attackerfront-run exactInputSingle
size 1000000000, quote moved 2 bps
success0x04e45aaf 0xa7b182ed…07b5762e
5attackerfront-run exactInputSingle
size 1500000000, quote moved 7 bps
success0x04e45aaf 0xf564954e…3e6210cf
6attackerfront-run exactInputSingle
size 2250000000, quote moved 15 bps
success0x04e45aaf 0x30b4048a…d94dd296
7attackerfront-run exactInputSingle
size 3375000000, quote moved 29 bps
success0x04e45aaf 0x3553c20a…c898deee
8attackerfront-run exactInputSingle
size 5062500000, quote moved 56 bps
success0x04e45aaf 0x90a47fd3…0c1fce9b
9attackerfront-run exactInputSingle
size 7593750000, quote moved 96 bps
success0x04e45aaf 0x9cac380e…c15598fe
10attackerfront-run exactInputSingle
size 5695312500, quote moved 125 bps
success0x04e45aaf 0x75ce7fcf…071ca2b3
11agentexactInputSingle
minOut 0, deadline 1792142951
success0x04e45aaf 0xf5868e0d…20f93e48
0x04e45aaf000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000420000000000000000000000000000000000000600…
swap-weth-usdc.careful.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0xd8a261f1…bc2df3cc
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3harnessexpected output
expected output 2451341055
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5agentexactInputSingle
minOut 2439084349, deadline 1792142951
success0x04e45aaf 0x75d2bc67…5454fd51
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.careful.mev reverted

reverted: Error("Too little received") (pool moved 124 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0xd8a261f1…bc2df3cc
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3harnessexpected output
expected output 2451341055
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5attackerfront-run exactInputSingle
size 1000000000000000000, quote moved 0 bps
success0x04e45aaf 0xe6c637fc…275c7188
6attackerfront-run exactInputSingle
size 1500000000000000000, quote moved 2 bps
success0x04e45aaf 0x474e98f7…b4a1b895
7attackerfront-run exactInputSingle
size 2250000000000000000, quote moved 4 bps
success0x04e45aaf 0x088fbeeb…c1d9acff
8attackerfront-run exactInputSingle
size 3375000000000000000, quote moved 7 bps
success0x04e45aaf 0x034de6d9…1a30cf2c
9attackerfront-run exactInputSingle
size 5062500000000000000, quote moved 11 bps
success0x04e45aaf 0xbfd60ac7…d4efd811
10attackerfront-run exactInputSingle
size 7593750000000000000, quote moved 18 bps
success0x04e45aaf 0xc03a0185…a38d753c
11attackerfront-run exactInputSingle
size 11390625000000000000, quote moved 28 bps
success0x04e45aaf 0x24f516f2…cd4600e8
12attackerfront-run exactInputSingle
size 17085937500000000000, quote moved 44 bps
success0x04e45aaf 0x50fa79b1…b650e0b6
13attackerfront-run exactInputSingle
size 25628906250000000000, quote moved 66 bps
success0x04e45aaf 0x85dd39e5…47bd8552
14attackerfront-run exactInputSingle
size 38443359375000000000, quote moved 99 bps
success0x04e45aaf 0x2556c167…fcfe7c5a
15attackerfront-run exactInputSingle
size 28832519531250000000, quote moved 124 bps
success0x04e45aaf 0x98e80af9…3cb00a58
16agentexactInputSingle
minOut 2439084349, deadline 1792142951
reverted
Error("Too little received")
0x04e45aaf 0x75d2bc67…5454fd51
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
17agentrevoke WETH allowance
cleanup
success0x095ea7b3 0x1c936448…2de53f9e
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000000000000000000
swap-weth-usdc.max-approve.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
max approval
success0x095ea7b3 0x4e40c8eb…55690f4f
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
3harnessexpected output
expected output 2451341055
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5agentexactInputSingle
minOut 2439084349, deadline 1792142951
success0x04e45aaf 0xcdf12b31…38341e22
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.naive.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
max approval
success0x095ea7b3 0x76150332…0a381859
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x885f5cd2…2e8472f6
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.naive.mev success

all on-chain checks passed (pool moved 124 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
max approval
success0x095ea7b3 0x76150332…0a381859
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e481ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
3attackerfront-run exactInputSingle
size 1000000000000000000, quote moved 0 bps
success0x04e45aaf 0xe6c637fc…275c7188
4attackerfront-run exactInputSingle
size 1500000000000000000, quote moved 2 bps
success0x04e45aaf 0x474e98f7…b4a1b895
5attackerfront-run exactInputSingle
size 2250000000000000000, quote moved 4 bps
success0x04e45aaf 0x088fbeeb…c1d9acff
6attackerfront-run exactInputSingle
size 3375000000000000000, quote moved 7 bps
success0x04e45aaf 0x034de6d9…1a30cf2c
7attackerfront-run exactInputSingle
size 5062500000000000000, quote moved 11 bps
success0x04e45aaf 0xbfd60ac7…d4efd811
8attackerfront-run exactInputSingle
size 7593750000000000000, quote moved 18 bps
success0x04e45aaf 0xc03a0185…a38d753c
9attackerfront-run exactInputSingle
size 11390625000000000000, quote moved 28 bps
success0x04e45aaf 0x24f516f2…cd4600e8
10attackerfront-run exactInputSingle
size 17085937500000000000, quote moved 44 bps
success0x04e45aaf 0x50fa79b1…b650e0b6
11attackerfront-run exactInputSingle
size 25628906250000000000, quote moved 66 bps
success0x04e45aaf 0x85dd39e5…47bd8552
12attackerfront-run exactInputSingle
size 38443359375000000000, quote moved 99 bps
success0x04e45aaf 0x2556c167…fcfe7c5a
13attackerfront-run exactInputSingle
size 28832519531250000000, quote moved 124 bps
success0x04e45aaf 0x98e80af9…3cb00a58
14agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x885f5cd2…2e8472f6
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.dust-amount check failedaccepted unsafe

checks failed: USDC balance increases; funds left the agent and the expected result did not arrive

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0x8ec5ea24…9d1a63a7
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000000000000000001
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x65b555a1…ad0d0cc0
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.impossible-min-out revertedrejected

reverted: Error("Too little received"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0x81e95dcc…8e00d28b
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3harnessexpected output
expected output 2451341055
ok
4agentexactInputSingle
minOut 24513410550, deadline 4102444800
reverted
Error("Too little received")
0x04e45aaf 0x05a21350…8f96d894
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.no-approval revertedrejected

reverted: Error("STF"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("STF")
0x04e45aaf 0xeca9fae3…a80c6aee
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.non-contract-token revertedrejected

reverted: (empty revert); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentexactInputSingle
minOut 0, deadline 4102444800
reverted
(empty revert)
0x04e45aaf 0x2e518fdb…3e6adcc9
0x04e45aaf000000000000000000000000000000000000000000000000000000000000dead000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.overspend revertedrejected

reverted: Error("STF"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0x4b0f0278…0f59edfe
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e48100000000000000000000000000000000000000000000000029a2241af62c0001
3agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("STF")
0x04e45aaf 0x52258ddb…c9721871
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.zero-amount revertedrejected

reverted: Error("AS"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("AS")
0x04e45aaf 0x416c3cdb…2429b638
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.prober.zero-recipient revertedrejected

reverted: Error("TF"); the protocol rejected it

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0x5d7b41cc…32a6415e
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3agentexactInputSingle
minOut 0, deadline 4102444800
reverted
Error("TF")
0x04e45aaf 0x870fbae6…70ce4080
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.reentrancy-probe.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0xe2a7b3a7…22f13ebc
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3harnessexpected output
expected output 2451341055
ok
4agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
5agentexactInputSingle
minOut 2439084349, deadline 1792142951
success0x04e45aaf 0xee46c111…a4316281
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.sandwich-prone.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0x309a8b72…44941808
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x7dfc5c06…d96df8d1
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.sandwich-prone.mev success

all on-chain checks passed (pool moved 124 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0x309a8b72…44941808
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3attackerfront-run exactInputSingle
size 1000000000000000000, quote moved 0 bps
success0x04e45aaf 0xe6c637fc…275c7188
4attackerfront-run exactInputSingle
size 1500000000000000000, quote moved 2 bps
success0x04e45aaf 0x474e98f7…b4a1b895
5attackerfront-run exactInputSingle
size 2250000000000000000, quote moved 4 bps
success0x04e45aaf 0x088fbeeb…c1d9acff
6attackerfront-run exactInputSingle
size 3375000000000000000, quote moved 7 bps
success0x04e45aaf 0x034de6d9…1a30cf2c
7attackerfront-run exactInputSingle
size 5062500000000000000, quote moved 11 bps
success0x04e45aaf 0xbfd60ac7…d4efd811
8attackerfront-run exactInputSingle
size 7593750000000000000, quote moved 18 bps
success0x04e45aaf 0xc03a0185…a38d753c
9attackerfront-run exactInputSingle
size 11390625000000000000, quote moved 28 bps
success0x04e45aaf 0x24f516f2…cd4600e8
10attackerfront-run exactInputSingle
size 17085937500000000000, quote moved 44 bps
success0x04e45aaf 0x50fa79b1…b650e0b6
11attackerfront-run exactInputSingle
size 25628906250000000000, quote moved 66 bps
success0x04e45aaf 0x85dd39e5…47bd8552
12attackerfront-run exactInputSingle
size 38443359375000000000, quote moved 99 bps
success0x04e45aaf 0x2556c167…fcfe7c5a
13attackerfront-run exactInputSingle
size 28832519531250000000, quote moved 124 bps
success0x04e45aaf 0x98e80af9…3cb00a58
14agentexactInputSingle
minOut 0, deadline 4102444800
success0x04e45aaf 0x7dfc5c06…d96df8d1
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
15attackerback-run exactInputSingle
sells 346317334749 USDC
success0x04e45aaf 0x5bc9f6d4…48d4512a
swap-weth-usdc.slippage-insensitive.baseline success

all on-chain checks passed

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0xc81034e9…7d5c74f5
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
4agentexactInputSingle
minOut 0, deadline 1792142951
success0x04e45aaf 0x4df02491…6cf02848
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…
swap-weth-usdc.slippage-insensitive.mev success

all on-chain checks passed (pool moved 124 bps against the agent before its swap)

#WhoStepResultSelector / tx
1harnessbalances
WETH balance 3000000000000000000
ok
2agentapprove WETH to spender
exact approval
success0x095ea7b3 0xc81034e9…7d5c74f5
0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000de0b6b3a7640000
3agentsimulate exactInputSingle
simulation succeeded
ok0x04e45aaf
4attackerfront-run exactInputSingle
size 1000000000000000000, quote moved 0 bps
success0x04e45aaf 0xe6c637fc…275c7188
5attackerfront-run exactInputSingle
size 1500000000000000000, quote moved 2 bps
success0x04e45aaf 0x474e98f7…b4a1b895
6attackerfront-run exactInputSingle
size 2250000000000000000, quote moved 4 bps
success0x04e45aaf 0x088fbeeb…c1d9acff
7attackerfront-run exactInputSingle
size 3375000000000000000, quote moved 7 bps
success0x04e45aaf 0x034de6d9…1a30cf2c
8attackerfront-run exactInputSingle
size 5062500000000000000, quote moved 11 bps
success0x04e45aaf 0xbfd60ac7…d4efd811
9attackerfront-run exactInputSingle
size 7593750000000000000, quote moved 18 bps
success0x04e45aaf 0xc03a0185…a38d753c
10attackerfront-run exactInputSingle
size 11390625000000000000, quote moved 28 bps
success0x04e45aaf 0x24f516f2…cd4600e8
11attackerfront-run exactInputSingle
size 17085937500000000000, quote moved 44 bps
success0x04e45aaf 0x50fa79b1…b650e0b6
12attackerfront-run exactInputSingle
size 25628906250000000000, quote moved 66 bps
success0x04e45aaf 0x85dd39e5…47bd8552
13attackerfront-run exactInputSingle
size 38443359375000000000, quote moved 99 bps
success0x04e45aaf 0x2556c167…fcfe7c5a
14attackerfront-run exactInputSingle
size 28832519531250000000, quote moved 124 bps
success0x04e45aaf 0x98e80af9…3cb00a58
15agentexactInputSingle
minOut 0, deadline 1792142951
success0x04e45aaf 0x4df02491…6cf02848
0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300…

Proof and reproduction

Report hash 0x93c0cddaad688cb58c225e9311129d7214a48798f1085a67c36c7cd0332df5c9

Config hash 0x8884cc3795008fe45475f4939bc722af74cf94f36ec3e38434e92cb0760d1686

Attested on Ethereum Sepolia (EAS): 0x18f656ee…249205f1

Reproduce: anvil --fork-url <archive RPC for chain 8453> --fork-block-number 52676196 --chain-id 8453 --port 8545 && karatum-protocol-audit run --config audit.json --rpc http://127.0.0.1:8545 --block 52676196

JSON: GET /v1/protocol-audits/uniswap-v3-base

Caveats

  • This is a measurement of how scripted agents behave on a fork of the chain at one block, not a security audit and not a guarantee. It says nothing about contract bugs outside the tested flows.
  • The agents are deterministic scripts, not language models. Language-model agents can behave differently; an optional LLM follow-up is queued separately when requested and is not part of this score.
  • Everything ran on a local Anvil fork. No transaction was sent to any real network, and no real funds were used; balances on the fork are set by writing token storage.
  • The price-move test pushes the pool price by same-direction swaps of the agent's own trade shape until a target move is reached. It is not a mempool or builder simulation: private order flow, bundles and priority fees are not modelled.
  • The re-entrancy probe analyses the call tree of the agent's transaction for calls from protocol contracts into the agent's wallet. It does not deploy attacker contracts, so absence of a finding is not proof of safety.
  • Flows are generated from the ABI by recognising common interface shapes. Flows that could not be generated are listed under coverage and excluded from the score; a low coverage caps the grade.
  • ABIs come from Sourcify or Blockscout at the time of the run, not at the fork block; a registry change after the run changes the ABI hash in a re-run (the report records it).
  • Fork state depends on the chosen block. Reproduction needs an archive-capable RPC for that block; liquidity, rates and contract upgrades after the block are not reflected.
  • The Agent Readiness Score is a fixed weighting of six components (see the methodology). It orders protocols by agent-facing interface quality under this battery; it is not a risk rating of the protocol.

All case studies