{"data":{"id":"pa_d712c4c53a08af47","slug":"uniswap-v3-base","status":"complete","visibility":"public","featured":true,"protocol":"Uniswap v3 (SwapRouter02)","chainId":8453,"forkBlock":"52676196","score":80,"grade":"B","summary":{"cap":null,"cases":34,"flows":{"executed":2,"requested":2},"grade":"B","score":80,"findings":{"low":6,"high":1,"info":1,"medium":3,"critical":0},"forkBlock":"52676196","carefulSuccess":2},"reportHash":"0x93c0cddaad688cb58c225e9311129d7214a48798f1085a67c36c7cd0332df5c9","configHash":"0x8884cc3795008fe45475f4939bc722af74cf94f36ec3e38434e92cb0760d1686","attestation":{"uid":"0x18f656ee46723ad2d6b31b9c1ad49aeb16b631af4871a7ffe1e52543249205f1","tx":"0x295fcfdfc696c359df3317166ee57778415f15aaa883ae14b59c2aeb1fe5933a","network":"eip155:11155111","url":"https://sepolia.easscan.org/attestation/view/0x18f656ee46723ad2d6b31b9c1ad49aeb16b631af4871a7ffe1e52543249205f1"},"createdAt":"2026-10-16T09:09:31.236Z","startedAt":"2026-10-16T09:09:31.283Z","finishedAt":"2026-10-16T09:12:10.770Z","position":0,"error":null,"followups":[],"report":{"fork":{"block":"52676196","timestamp":"1792141739"},"score":{"cap":null,"grade":"B","total":80,"components":[{"id":"completion","title":"Task completion","detail":"2 of 2 executed flows completed by the careful agent","points":30,"weight":30},{"id":"naive_safety","title":"Safety for a naive agent","detail":"price 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)","points":15,"weight":25},{"id":"input_hardening","title":"Input hardening","detail":"5 of 24 weighted probe points were accepted unsafely","points":11.9,"weight":15},{"id":"error_legibility","title":"Error legibility","detail":"mean revert legibility 0.53 over 6 reverts raised by the protocol (7 raised by tokens not counted)","points":5.3,"weight":10},{"id":"approval_surface","title":"Approval surface","detail":"exact approvals suffice; spender is the entry contract","points":10,"weight":10},{"id":"interface_clarity","title":"Interface clarity","detail":"5 static interface finding(s)","points":7.5,"weight":10}]},"tasks":[{"id":"swap-usdc-weth","args":[["$tokenIn","$tokenOut","100","$recipient","$amountIn","$minOut","0"]],"kind":"swap","notes":["fee tier 100 chosen by simulated output on the fork (0.407714084602727315 WETH for 1000 USDC)"],"title":"Swap 1000 USDC for WETH on SwapRouter02","amount":"1000000000 base units of USDC","checks":["WETH balance increases","USDC balance decreases"],"origin":"uniswap-v3 exactInputSingle (fee 100)","tokenIn":{"symbol":"USDC","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","decimals":6},"contract":"SwapRouter02 (0x2626664c2603336E57B271c5C0b26F421741e481)","function":"exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))","requires":[],"tokenOut":{"symbol":"WETH","address":"0x4200000000000000000000000000000000000006","decimals":18},"approvals":[{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","spender":"0x2626664c2603336E57B271c5C0b26F421741e481"}],"instruction":"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."},{"id":"swap-weth-usdc","args":[["$tokenIn","$tokenOut","500","$recipient","$amountIn","$minOut","0"]],"kind":"swap","notes":["fee tier 500 chosen by simulated output on the fork (2451.341055 USDC for 1 WETH)"],"title":"Swap 1 WETH for USDC on SwapRouter02","amount":"1000000000000000000 base units of WETH","checks":["USDC balance increases","WETH balance decreases"],"origin":"uniswap-v3 exactInputSingle (fee 500)","tokenIn":{"symbol":"WETH","address":"0x4200000000000000000000000000000000000006","decimals":18},"contract":"SwapRouter02 (0x2626664c2603336E57B271c5C0b26F421741e481)","function":"exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))","requires":[],"tokenOut":{"symbol":"USDC","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","decimals":6},"approvals":[{"token":"0x4200000000000000000000000000000000000006","spender":"0x2626664c2603336E57B271c5C0b26F421741e481"}],"instruction":"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."}],"static":[{"errors":0,"events":0,"address":"0x2626664c2603336E57B271c5C0b26F421741e481","contract":"SwapRouter02","userFacing":[{"flags":["no-deadline"],"inputs":1,"outputs":1,"selector":"0xb858183f","signature":"exactInput((bytes,address,uint256,uint256))","mutability":"payable"},{"flags":["no-deadline","wide-tuple","sentinel-params"],"inputs":1,"outputs":1,"selector":"0x04e45aaf","signature":"exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))","mutability":"payable"},{"flags":["no-deadline"],"inputs":1,"outputs":1,"selector":"0x09b81346","signature":"exactOutput((bytes,address,uint256,uint256))","mutability":"payable"},{"flags":["no-deadline","wide-tuple","sentinel-params"],"inputs":1,"outputs":1,"selector":"0x5023b4df","signature":"exactOutputSingle((address,address,uint24,address,uint256,uint256,uint160))","mutability":"payable"},{"flags":["wide-tuple"],"inputs":1,"outputs":1,"selector":"0x11ed56c9","signature":"mint((address,address,uint24,int24,int24,uint256,uint256,address))","mutability":"payable"},{"flags":["no-deadline"],"inputs":4,"outputs":1,"selector":"0x472b43f3","signature":"swapExactTokensForTokens(uint256,uint256,address[],address)","mutability":"payable"},{"flags":["no-deadline"],"inputs":4,"outputs":1,"selector":"0x42712a67","signature":"swapTokensForExactTokens(uint256,uint256,address[],address)","mutability":"payable"}],"stateChanging":33,"totalFunctions":39}],"battery":{"cases":34,"agents":[{"id":"careful","title":"Careful","behaviour":"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."},{"id":"naive","title":"Naive","behaviour":"Approves the maximum, accepts any output, sets a far-future deadline, never simulates, trusts the transaction status."},{"id":"max-approve","title":"Max-approve","behaviour":"Careful in everything except approving the maximum and never revoking: isolates the approval surface."},{"id":"slippage-insensitive","title":"Slippage-insensitive","behaviour":"Careful in everything except accepting any output: isolates slippage exposure."},{"id":"reentrancy-probe","title":"Re-entrancy probe","behaviour":"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."},{"id":"sandwich-prone","title":"Sandwich-prone","behaviour":"Bound-less, no simulation, far deadline; run after an attacker moved the pool price, then unwound by the attacker to measure extractable value."}],"mevMoveBps":100},"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."],"metrics":{"mev":[{"flowId":"swap-usdc-weth","byAgent":{"naive":{"lossBps":125,"outcome":"success","attackerNet":null,"attackerProfit":null},"careful":{"lossBps":0,"outcome":"reverted","attackerNet":null,"attackerProfit":null},"sandwich-prone":{"lossBps":125,"outcome":"success","attackerNet":"+7.2655 USDC","attackerProfit":"7265527"},"slippage-insensitive":{"lossBps":125,"outcome":"success","attackerNet":null,"attackerProfit":null}},"moveBps":125},{"flowId":"swap-weth-usdc","byAgent":{"naive":{"lossBps":124,"outcome":"success","attackerNet":null,"attackerProfit":null},"careful":{"lossBps":0,"outcome":"reverted","attackerNet":null,"attackerProfit":null},"sandwich-prone":{"lossBps":124,"outcome":"success","attackerNet":"-0.1292 WETH","attackerProfit":"-129270026516390815"},"slippage-insensitive":{"lossBps":124,"outcome":"success","attackerNet":null,"attackerProfit":null}},"moveBps":124}],"flows":[{"id":"swap-usdc-weth","kind":"swap","title":"Swap 1000 USDC for WETH on SwapRouter02","byAgent":{"naive":"success","careful":"success","max-approve":"success","sandwich-prone":"success","reentrancy-probe":"success","slippage-insensitive":"success"},"careful":"success","txCareful":2,"gasCareful":"199285"},{"id":"swap-weth-usdc","kind":"swap","title":"Swap 1 WETH for USDC on SwapRouter02","byAgent":{"naive":"success","careful":"success","max-approve":"success","sandwich-prone":"success","reentrancy-probe":"success","slippage-insensitive":"success"},"careful":"success","txCareful":2,"gasCareful":"186307"}],"agents":[{"id":"careful","flows":2,"refused":0,"success":2,"txTotal":4,"gasTotal":"385592","reverted":0,"checkFailed":0,"fundsAtRisk":null,"unsupported":0,"worstLossBps":0,"approvalResidual":"none"},{"id":"naive","flows":2,"refused":0,"success":2,"txTotal":4,"gasTotal":"392272","reverted":0,"checkFailed":0,"fundsAtRisk":{"usd":12.5,"amount":"12.5","symbol":"USDC"},"unsupported":0,"worstLossBps":125,"approvalResidual":"unlimited"},{"id":"max-approve","flows":2,"refused":0,"success":2,"txTotal":4,"gasTotal":"392416","reverted":0,"checkFailed":0,"fundsAtRisk":null,"unsupported":0,"worstLossBps":null,"approvalResidual":"unlimited"},{"id":"slippage-insensitive","flows":2,"refused":0,"success":2,"txTotal":4,"gasTotal":"385424","reverted":0,"checkFailed":0,"fundsAtRisk":{"usd":12.5,"amount":"12.5","symbol":"USDC"},"unsupported":0,"worstLossBps":125,"approvalResidual":"none"},{"id":"reentrancy-probe","flows":2,"refused":0,"success":2,"txTotal":4,"gasTotal":"385592","reverted":0,"checkFailed":0,"fundsAtRisk":null,"unsupported":0,"worstLossBps":null,"approvalResidual":"none"},{"id":"sandwich-prone","flows":2,"refused":0,"success":2,"txTotal":4,"gasTotal":"385448","reverted":0,"checkFailed":0,"fundsAtRisk":{"usd":12.5,"amount":"12.5","symbol":"USDC"},"unsupported":0,"worstLossBps":125,"approvalResidual":"none"}],"probes":[{"probe":"zero-amount","title":"zero-amount","caseId":"swap-usdc-weth.prober.zero-amount","flowId":"swap-usdc-weth","revert":"Error(\"AS\")","verdict":"rejected"},{"probe":"dust-amount","title":"dust-amount","caseId":"swap-usdc-weth.prober.dust-amount","flowId":"swap-usdc-weth","revert":null,"verdict":"accepted_unsafe"},{"probe":"zero-recipient","title":"zero-recipient","caseId":"swap-usdc-weth.prober.zero-recipient","flowId":"swap-usdc-weth","revert":null,"verdict":"accepted_unsafe"},{"probe":"no-approval","title":"no-approval","caseId":"swap-usdc-weth.prober.no-approval","flowId":"swap-usdc-weth","revert":"Error(\"STF\")","verdict":"rejected"},{"probe":"overspend","title":"overspend","caseId":"swap-usdc-weth.prober.overspend","flowId":"swap-usdc-weth","revert":"Error(\"STF\")","verdict":"rejected"},{"probe":"impossible-min-out","title":"impossible-min-out","caseId":"swap-usdc-weth.prober.impossible-min-out","flowId":"swap-usdc-weth","revert":"Error(\"Too little received\")","verdict":"rejected"},{"probe":"non-contract-token","title":"non-contract-token","caseId":"swap-usdc-weth.prober.non-contract-token","flowId":"swap-usdc-weth","revert":"(empty revert)","verdict":"rejected"},{"probe":"zero-amount","title":"zero-amount","caseId":"swap-weth-usdc.prober.zero-amount","flowId":"swap-weth-usdc","revert":"Error(\"AS\")","verdict":"rejected"},{"probe":"dust-amount","title":"dust-amount","caseId":"swap-weth-usdc.prober.dust-amount","flowId":"swap-weth-usdc","revert":null,"verdict":"accepted_unsafe"},{"probe":"zero-recipient","title":"zero-recipient","caseId":"swap-weth-usdc.prober.zero-recipient","flowId":"swap-weth-usdc","revert":"Error(\"TF\")","verdict":"rejected"},{"probe":"no-approval","title":"no-approval","caseId":"swap-weth-usdc.prober.no-approval","flowId":"swap-weth-usdc","revert":"Error(\"STF\")","verdict":"rejected"},{"probe":"overspend","title":"overspend","caseId":"swap-weth-usdc.prober.overspend","flowId":"swap-weth-usdc","revert":"Error(\"STF\")","verdict":"rejected"},{"probe":"impossible-min-out","title":"impossible-min-out","caseId":"swap-weth-usdc.prober.impossible-min-out","flowId":"swap-weth-usdc","revert":"Error(\"Too little received\")","verdict":"rejected"},{"probe":"non-contract-token","title":"non-contract-token","caseId":"swap-weth-usdc.prober.non-contract-token","flowId":"swap-weth-usdc","revert":"(empty revert)","verdict":"rejected"}],"reverts":{"total":6,"byKind":{"empty":2,"error_string":4},"examples":["Error(\"Too little received\")","(empty revert)"],"external":7,"meanLegibility":0.53},"coverage":{"ratio":1,"skipped":[],"executed":2,"requested":2},"approvals":[{"flowId":"swap-usdc-weth","spender":"0x2626664c2603336E57B271c5C0b26F421741e481","naiveResidual":"115792089237316195423570985008687907853269984665640564039457584007912129639935","carefulResidual":"0","spenderUpgradeable":false},{"flowId":"swap-weth-usdc","spender":"0x2626664c2603336E57B271c5C0b26F421741e481","naiveResidual":"115792089237316195423570985008687907853269984665640564039457584007913129639935","carefulResidual":"0","spenderUpgradeable":false}],"callbacks":[{"flowId":"swap-usdc-weth","toAgent":0,"withValue":0,"callbackLoops":1,"delegateCalls":3,"contractsTouched":5},{"flowId":"swap-weth-usdc","toAgent":0,"withValue":0,"callbackLoops":1,"delegateCalls":1,"contractsTouched":5}]},"version":"karatum.protocol-readiness.v1","findings":[{"id":"dynamic:probe:zero-recipient:SwapRouter02","fix":"Revert when the recipient is address(0) with a named error such as `InvalidRecipient()`.","rule":"probe-zero-recipient","title":"Output can be sent to the zero address","where":"SwapRouter02 (swap-usdc-weth)","detail":"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.","source":"dynamic","evidence":["swap-usdc-weth.prober.zero-recipient"],"severity":"high"},{"id":"dynamic:error-opacity","fix":"Use named custom errors with parameters (`error InsufficientAllowance(uint256 have, uint256 need)`) and include them in the verified ABI; avoid numeric string codes.","rule":"error-opacity","title":"Reverts are hard for an agent to act on","where":null,"detail":"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).","source":"dynamic","evidence":["swap-usdc-weth.careful.mev","swap-usdc-weth.prober.zero-amount","swap-usdc-weth.prober.no-approval"],"severity":"medium"},{"id":"dynamic:price-move-exposure:swap-usdc-weth","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.","rule":"price-move-exposure","title":"Agents without an output bound lose ~125 bps when the price moves 125 bps (swap-usdc-weth)","where":"SwapRouter02","detail":"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.","source":"dynamic","evidence":["swap-usdc-weth.naive.mev","swap-usdc-weth.slippage-insensitive.mev","swap-usdc-weth.sandwich-prone.mev"],"severity":"medium"},{"id":"dynamic:price-move-exposure:swap-weth-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.","rule":"price-move-exposure","title":"Agents without an output bound lose ~124 bps when the price moves 124 bps (swap-weth-usdc)","where":"SwapRouter02","detail":"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).","source":"dynamic","evidence":["swap-weth-usdc.naive.mev","swap-weth-usdc.slippage-insensitive.mev","swap-weth-usdc.sandwich-prone.mev"],"severity":"medium"},{"id":"dynamic:probe:dust-amount:SwapRouter02","fix":"Revert on amounts that round to zero shares or zero output (`ZeroShares()`), instead of taking the funds.","rule":"probe-dust-amount","title":"A 1-unit amount is accepted and returns nothing","where":"SwapRouter02 (swap-usdc-weth, swap-weth-usdc)","detail":"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.","source":"dynamic","evidence":["swap-usdc-weth.prober.dust-amount","swap-weth-usdc.prober.dust-amount"],"severity":"low"},{"id":"static:deadline-missing:SwapRouter02","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.","rule":"deadline-missing","title":"6 swap functions cannot expire","where":"SwapRouter02.exactInput, exactInputSingle, exactOutput, exactOutputSingle, swapExactTokensForTokens, swapTokensForExactTokens","detail":"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.","source":"static","evidence":[],"severity":"low"},{"id":"static:no-custom-errors:SwapRouter02","fix":"Use named custom errors with parameters (`error InsufficientOutput(uint256 received, uint256 minimum)`) and include them in the published ABI.","rule":"no-custom-errors","title":"No custom errors in the ABI","where":"SwapRouter02","detail":"SwapRouter02 publishes no `error` definitions: failures reach an agent as strings, panics or empty reverts that it cannot decode against the ABI.","source":"static","evidence":[],"severity":"low"},{"id":"static:no-events:SwapRouter02","fix":"Include every emitted event (including those defined in libraries) in the verified ABI, or emit them from the entry contract.","rule":"no-events","title":"No event definitions in the published ABI","where":"SwapRouter02","detail":"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.)","source":"static","evidence":[],"severity":"low"},{"id":"static:sentinel-params:SwapRouter02","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.","rule":"sentinel-params","title":"2 function(s) take parameters that must stay at a sentinel value","where":"SwapRouter02.exactInputSingle, exactOutputSingle","detail":"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.","source":"static","evidence":[],"severity":"low"},{"id":"static:wide-tuple:SwapRouter02","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.","rule":"wide-tuple","title":"3 function(s) take wide structs","where":"SwapRouter02.exactInputSingle, exactOutputSingle, mint","detail":"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.","source":"static","evidence":[],"severity":"low"},{"id":"dynamic:no-protocol-event:swap-usdc-weth+swap-weth-usdc","fix":"Emit an event from the entry contract with the account, tokens and amounts.","rule":"no-protocol-event","title":"The entry contract emits no event for swap-usdc-weth, swap-weth-usdc","where":null,"detail":"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.","source":"dynamic","evidence":["swap-usdc-weth.careful.baseline","swap-weth-usdc.careful.baseline"],"severity":"info"}],"protocol":{"name":"Uniswap v3 (SwapRouter02)","chain":"Base","chainId":8453,"docsUrl":"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"},"caseIndex":[{"agent":"careful","probe":null,"caseId":"swap-usdc-weth.careful.baseline","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0xb28e69a271c325f4ad1608eaf6281bde13551db620eb1fd1001abfa81da4ef6c","condition":"baseline"},{"agent":"naive","probe":null,"caseId":"swap-usdc-weth.naive.baseline","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x28853faa3c1d5758a58a92c979d4fe9341a5bf10afdbed15b1f27e63b9844696","condition":"baseline"},{"agent":"max-approve","probe":null,"caseId":"swap-usdc-weth.max-approve.baseline","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x65b98e32cb79ba5faacd73708aac1abc44e8abe488017df8dbd4a30b76bb7749","condition":"baseline"},{"agent":"slippage-insensitive","probe":null,"caseId":"swap-usdc-weth.slippage-insensitive.baseline","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0xfd857f13356549424cdbb0e8861273c3a971b82879102510a134117b9541f516","condition":"baseline"},{"agent":"reentrancy-probe","probe":null,"caseId":"swap-usdc-weth.reentrancy-probe.baseline","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x9e77a684f011cb8625333ec36ca1ed072c9d1525826a1c6949eb8902fde3a975","condition":"baseline"},{"agent":"sandwich-prone","probe":null,"caseId":"swap-usdc-weth.sandwich-prone.baseline","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x98bcc1884e8b5cbe97a395ec490e94f351d051e1dab34a46d44a931b5733123d","condition":"baseline"},{"agent":"careful","probe":null,"caseId":"swap-usdc-weth.careful.mev","flowId":"swap-usdc-weth","outcome":"reverted","verdict":"n/a","caseHash":"0xe897783e718af2015682c63678272dc31661a14bee5c78fcec7b4c1d93c11bb5","condition":"mev"},{"agent":"naive","probe":null,"caseId":"swap-usdc-weth.naive.mev","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x14d021b007fa5d9d56b9011d11c56309386e8c355cc632afa3ed379db9765a37","condition":"mev"},{"agent":"slippage-insensitive","probe":null,"caseId":"swap-usdc-weth.slippage-insensitive.mev","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x02e90fdc2911c78027f669516c67a8253781cb5dbeca3c78f4dfedbe1e71c240","condition":"mev"},{"agent":"sandwich-prone","probe":null,"caseId":"swap-usdc-weth.sandwich-prone.mev","flowId":"swap-usdc-weth","outcome":"success","verdict":"n/a","caseHash":"0x5d6ea35a33edee4145c1068dc00dc7c28056f942ae4d66b19734e64c90238757","condition":"mev"},{"agent":"prober","probe":"zero-amount","caseId":"swap-usdc-weth.prober.zero-amount","flowId":"swap-usdc-weth","outcome":"reverted","verdict":"rejected","caseHash":"0xdc920dcf03302c15e8aaaefa206e6448c18b130acc501e4da83e46560a21a487","condition":"probe"},{"agent":"prober","probe":"dust-amount","caseId":"swap-usdc-weth.prober.dust-amount","flowId":"swap-usdc-weth","outcome":"check_failed","verdict":"accepted_unsafe","caseHash":"0xc30462bd26cb6344c5fdf57e60aab17a6f4d17a65f23980a23d335e835b2eb6d","condition":"probe"},{"agent":"prober","probe":"zero-recipient","caseId":"swap-usdc-weth.prober.zero-recipient","flowId":"swap-usdc-weth","outcome":"check_failed","verdict":"accepted_unsafe","caseHash":"0xfff90815faa65732e3539241e8b1e5beb248baf04b218362933afafb8b68c53b","condition":"probe"},{"agent":"prober","probe":"no-approval","caseId":"swap-usdc-weth.prober.no-approval","flowId":"swap-usdc-weth","outcome":"reverted","verdict":"rejected","caseHash":"0xbb1bf7a369a684fdff140e51869c38e125319c2c1216baed733389dc6f509882","condition":"probe"},{"agent":"prober","probe":"overspend","caseId":"swap-usdc-weth.prober.overspend","flowId":"swap-usdc-weth","outcome":"reverted","verdict":"rejected","caseHash":"0xdeaf8a1f7af08cf38f6ef34b44d7eeca4ab1a5c382664a456ea13b6c620bdef3","condition":"probe"},{"agent":"prober","probe":"impossible-min-out","caseId":"swap-usdc-weth.prober.impossible-min-out","flowId":"swap-usdc-weth","outcome":"reverted","verdict":"rejected","caseHash":"0x5f65c6c3dac4daf338652ae0df40707c843c1f7b322c8bcaf42ec91f5985643d","condition":"probe"},{"agent":"prober","probe":"non-contract-token","caseId":"swap-usdc-weth.prober.non-contract-token","flowId":"swap-usdc-weth","outcome":"reverted","verdict":"rejected","caseHash":"0xc8f9bbe104ffcf24e77b4f2eb274b06a8c8513f2431a9527959dd754977a0b4c","condition":"probe"},{"agent":"careful","probe":null,"caseId":"swap-weth-usdc.careful.baseline","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0xe2943bef6c69e653dc2434bc1990d3afe01adf16a876abc3d6f2aeeee7d317c9","condition":"baseline"},{"agent":"naive","probe":null,"caseId":"swap-weth-usdc.naive.baseline","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0x8ace61e41e35801cf543ef937cfbe775cd81970d5999dfaa8f5a1669701684ef","condition":"baseline"},{"agent":"max-approve","probe":null,"caseId":"swap-weth-usdc.max-approve.baseline","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0xcdd2f035aa8e4178639772c34be6e910afd1e3c9d93434e5232908627ab55697","condition":"baseline"},{"agent":"slippage-insensitive","probe":null,"caseId":"swap-weth-usdc.slippage-insensitive.baseline","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0x5de1b4cce8edfd63e4a3543bbe9373ba6a97dc70641eee0c0a603a5653e829fb","condition":"baseline"},{"agent":"reentrancy-probe","probe":null,"caseId":"swap-weth-usdc.reentrancy-probe.baseline","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0x2a3c377c6e910051bc9ac415f8a026293567b7812f2024421fd347d387e68d86","condition":"baseline"},{"agent":"sandwich-prone","probe":null,"caseId":"swap-weth-usdc.sandwich-prone.baseline","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0x7a2d227ef9896d3c4b0bff892618398139d1e350d2d5f5a9126f145dd9dec1dc","condition":"baseline"},{"agent":"careful","probe":null,"caseId":"swap-weth-usdc.careful.mev","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"n/a","caseHash":"0xcb484d1c92efb84c7ae79a7dec5a09a8e145de8fdbbedf5291c23cb73c4d5666","condition":"mev"},{"agent":"naive","probe":null,"caseId":"swap-weth-usdc.naive.mev","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0xb21c94ec2eadb8d3b64c824b85fcdd75215e9dd5a3a002541240babfd07c8c38","condition":"mev"},{"agent":"slippage-insensitive","probe":null,"caseId":"swap-weth-usdc.slippage-insensitive.mev","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0x4e3674357dcf7d718ea5fc8f988b3827f46f84f70d5931b3298cc5e831c58500","condition":"mev"},{"agent":"sandwich-prone","probe":null,"caseId":"swap-weth-usdc.sandwich-prone.mev","flowId":"swap-weth-usdc","outcome":"success","verdict":"n/a","caseHash":"0x31190cf3c3dfa9b426a38c6ccd5655c90d8013ab49199edec5ed95603e968609","condition":"mev"},{"agent":"prober","probe":"zero-amount","caseId":"swap-weth-usdc.prober.zero-amount","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"rejected","caseHash":"0x605ff200fb1c2224bfd55ac41a3715baa40848848369d97e82a6e76fe0089eca","condition":"probe"},{"agent":"prober","probe":"dust-amount","caseId":"swap-weth-usdc.prober.dust-amount","flowId":"swap-weth-usdc","outcome":"check_failed","verdict":"accepted_unsafe","caseHash":"0x9f04b7ec135c8b86a8e255d81299686a885b261d8ccd54aae1b8a56ed388a262","condition":"probe"},{"agent":"prober","probe":"zero-recipient","caseId":"swap-weth-usdc.prober.zero-recipient","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"rejected","caseHash":"0x16a90e9c9e4b3cb2e02450a7197170e6ab1d28dba15f56f4fd1b4868d89062c3","condition":"probe"},{"agent":"prober","probe":"no-approval","caseId":"swap-weth-usdc.prober.no-approval","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"rejected","caseHash":"0xae31dfd0337c7db33845c9130b0f3f8411984075da24b8f5d5908ef7efc73db9","condition":"probe"},{"agent":"prober","probe":"overspend","caseId":"swap-weth-usdc.prober.overspend","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"rejected","caseHash":"0xfa84f06c9baa928dea3542cbf3ce7e7257cb82919199dbdb0a790563443cee79","condition":"probe"},{"agent":"prober","probe":"impossible-min-out","caseId":"swap-weth-usdc.prober.impossible-min-out","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"rejected","caseHash":"0xc937865bee17ebf362fa0fc0a79a4682d5f429180d8da7ea8749ede7efe4f5c5","condition":"probe"},{"agent":"prober","probe":"non-contract-token","caseId":"swap-weth-usdc.prober.non-contract-token","flowId":"swap-weth-usdc","outcome":"reverted","verdict":"rejected","caseHash":"0x82b6e974789c94b0c099e367575170c36f9d5b71a621c1c8f8b827bba1ca56cd","condition":"probe"}],"contracts":[{"name":"SwapRouter02","proxy":null,"abiHash":"0xe890a5353b7cb04778e52084ed35f73d74f167622e8516a852dce6bb59ed638c","address":"0x2626664c2603336E57B271c5C0b26F421741e481","abiMatch":"match","codeHash":"0x38bd640f47df62b2fd5a6755a63f4976ad847dc9b946ae0d145d21d16bb124e4","codeSize":24497,"deployed":false,"abiSource":"sourcify","functions":39}],"followups":{"llmAgents":{"note":"Not requested for this audit.","status":"not_requested"}},"reproduce":{"chainId":8453,"command":"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","forkBlock":"52676196"},"strengths":["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)."],"configHash":"0x8884cc3795008fe45475f4939bc722af74cf94f36ec3e38434e92cb0760d1686","methodology":"protocol-readiness-v1"}},"disclaimer":"An Agent Readiness report measures how scripted agents (careful, naive, adversarial) behave against a protocol on a fork of the chain at one block: task completion, input hardening, price-move exposure, approval surface and error legibility. It is not a security audit or a risk rating of the protocol, and the agents are not language models. Nothing was broadcast to any real network. Methodology: docs/methodology/protocol-readiness.md."}