{"assessments":[],"deployments":[{"attestationHash":"eb3209a191a16990c3e1700634d3aefc817cf4c5d99dcea0e2126635bbebe410","chainId":1,"contracts":[{"address":"0xe8d079af3f8e7fddbc6183e43330d2942a2e7c63","blockNumber":26193918,"name":"USDCDepositClaim","role":"other","txHash":"0x4af5476bb33986e229336476a2239048a0861c7128aff0fc68773cf8b240cd79"}],"id":"1f403228-7b27-432c-822a-c130ae716264","manifestHash":"d9ce14f4a229772aa291504f903d453b8744daeea5d4028d085f8c83cd7d82ce","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"1a03986b-3673-4b55-88c1-b5e529b2bd34","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"e253d02f4a07e4fe9b4cc59e9ebf80ac417ae0b6df08d55da26a3a0ae420cab7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"b59ce230c23b86ab02f1bb97760e4118cae99e583d765e7e21d56ecb1f2d26c7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"52fbdfdbcf43eaed72613d1382d5862388bea513f1c30749ec3f8ae48d9b9938","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"dce60b2c2a0d98c3bc466d54eda4eb8222184b0c6f58d8a67f7797c4e97317e0","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"113d47b646e91c2bbd50afe33d563a980dfc0f8eebbad100bd2aaa6c0506ef14","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ee7bbfccb89004d00f8f0f4b00525cd6268b5f31b7c21b15fef6cf6746cb980b","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"7222e6938986511af4bd79222f2b5e4e6e4a715b583d90aef925a1d48e9e73b7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a0c7a1ef1ce308db568994d7d272cae18624f02f2050f47d193b867f2bc69f4c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"I want you to create a basic deposit and claim contract. Only the owner can deposit $usdc (contract address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) funds to the contract with a wallet that the $usdc funds belong to. if that wallet already is saved on the contract then the $usdc value is added to the total. Then only that wallet can claim the funds that it has. and it should reset their amount to 0. pretty basic.","parentJobId":null,"planHash":"d7ed8fbd68b684d54f0785ac0d908606bf6c71fc86edce7a36d1b0f75cfa108c","previousHash":"dc34e633591d234f46be99146273de49289025031f59d370ef8ad6e029728aaf","projectId":"1a03986b-3673-4b55-88c1-b5e529b2bd34","publication":{"commit":"b68dad2e0d690cd74f47e863773715f0f19f493b","deliveredAt":"2026-10-14T23:05:23.014Z","repoUrl":"https://github.com/identity-md-launches/launch-1791-i-want-you-create"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"1f1d12383dddfc480480304ce61876ba503f9fe7f512c18eaf868220929d0c8e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"759c614fdc84ff66","findings":[],"hash":"113d47b646e91c2bbd50afe33d563a980dfc0f8eebbad100bd2aaa6c0506ef14","nodeId":"72aead29-339a-454e-93b2-4de119aaeed1","outcome":"completed","summary":"I found no access-control defects I could prove in `src/USDCDepositClaim.sol`, so `.imd-findings.json` has an empty findings list. Its coverage record gives all 4 entry points the verdict `holds`, plus 3 extra rows for things I checked. The existing tests pass (40 of 40), and I changed no source files.\n\n**What I checked, using the Access Control, Asymmetry and Trust Gap guides:**\n- **`deposit(address,uint256)`**:\n  - Only the owner can call it, and it can't be re-entered.\n  - It pulls USDC only from the caller, so an approval left behind by a previous owner or an outsider can't be spent.\n  - It rejects a zero amount and a recipient of zero, the contract itself or USDC.\n  - It credits only after confirming the exact amount arrived, and repeat deposits add to the wallet's existing total.\n- **`claim()`**:\n  - It uses only the caller's own address, with no recipient or amount argument, so no one can claim another wallet's funds.\n  - It sets the balance to 0 before sending, and any failed or short payment undoes the whole call.\n- **`transferOwnership` / `acceptOwnership`**: the standard OpenZeppelin two-step handover. A nomination can be replaced or cancelled, and only the nominee can accept. The new owner gets only the right to deposit from their own wallet and can't touch funds already credited.\n- **Trust gaps**:\n  - The owner has no way to sweep, rescue or move credited USDC; the only way funds leave is a recipient claiming their own balance.\n  - The owner role can't be dropped: renouncing always reverts, and the contract can't be deployed with a zero owner.\n- **The static-analysis \"high\" (reentrancy at line 45)**: not a real issue. Both functions share one reentrancy lock, USDC makes no callbacks, and the existing reentrancy fuzz test passes. The \"centralization\" note is just the owner role the brief asks for.\n\n**Two design limits, not reported as defects** (they come from the brief or depend on an owner mistake):\n- If USDC freezes a recipient's wallet for good, their balance is stuck forever. Letting them claim to another address would let a frozen wallet get around the freeze, so it isn't a safe fix.\n- If the owner deposits to a wallet that can never call `claim()`, such as an exchange deposit address or a mistyped address, those funds are locked for good. That follows from \"only that wallet can claim.\"\n\nI reviewed the whole contract within my area and left nothing unchecked.","treeHash":null,"usage":{"cachedInputTokens":280810,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":6001,"runtime":"claude","turns":7,"wallClockMs":83243}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dedd4428da8fa41e","findings":[{"citation":"resolved","description":"The provenance record says it holds each vendored file's SHA-256, but two files hash differently. The specialist reports the difference is line wrapping only, so contract behavior does not change. The README's provenance check still fails. The fix touches lib/, so the maintainer has to make it.","line":14,"path":"lib/dependencies.json","reproduction":"sha256sum lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol -> da646f23...621d and ad185236...a80a; expected per lib/dependencies.json lines 14 and 10: ac1fd9fa...c082 and 9c3a75a9...991b. Reproduced.","severity":"info","snippet":"      \"contracts/token/ERC20/utils/SafeERC20.sol\": \"ac1fd9fa99b194a8db8dfa9ae8e3ff44feaa8f16668241fd2b66ae8b47d7c082\",","title":"lib/dependencies.json hashes do not match two vendored OpenZeppelin files (whitespace-only reformat)"},{"citation":"resolved","description":"This merges the economics specialist's two low findings, which share one root cause. claim() pays msg.sender only, and the contract has no sweep or reassign function. A credit to a wallet that USDC blacklists, or to a wrong address, stays locked. USDC sent with a plain transfer is never credited to anyone. The brief asks for exactly this: only the credited wallet can claim. The README documents the limitation, so this is recorded as a trust assumption and not a defect. Severity is lowered to info.","line":59,"path":"src/USDCDepositClaim.sol","reproduction":"owner approves and calls deposit(alice,10e6). alice is then blacklisted on USDC. alice.claim() reverts, claimable[alice] stays 10e6, and no function can move it. Separately, owner calls USDC.transfer(escrow,5e6): totalClaimable stays 0 and the 5e6 cannot be withdrawn.","severity":"info","snippet":"    function claim() external nonReentrant {","title":"USDC has no recovery path: credits for a blacklisted or mistyped recipient, and direct transfers, stay locked"}],"hash":"52fbdfdbcf43eaed72613d1382d5862388bea513f1c30749ec3f8ae48d9b9938","nodeId":"a4298a98-be80-4b30-9d38-efed89abcd27","outcome":"completed","summary":"I found no defect that should block the launch or reopen the author's work. The report is in `.imd-findings.json` with two info notes and a coverage record. I changed no other files.\n\n**Entry points.** All four hold:\n- **`deposit`:** only the owner can call it, and it can't be re-entered. It rejects a zero amount and a recipient that is the zero address, the contract itself or USDC. It checks the contract received exactly the amount, then adds it to the recipient's existing balance.\n- **`claim`:** pays only the caller's own balance, and sets it to zero before sending.\n- **`transferOwnership` / `acceptOwnership`:** standard OpenZeppelin two-step handover. Giving up ownership is disabled.\n\nThe aderyn high (reentrancy, state changed after an external call) doesn't hold. Both functions are guarded against re-entry, and `claim` sets the balance to zero before it transfers. The project's 52 tests pass.\n\n**Specialist findings:**\n1. **audit_flow (info), reproduced and kept as info.** Two vendored OpenZeppelin files don't match the hashes recorded in `lib/dependencies.json`. `sha256sum` gives `da646f23…` for `SafeERC20.sol` and `ad185236…` for `IERC1363.sol`, against the recorded `ac1fd9fa…` and `9c3a75a9…`. The specialist reports the difference is line wrapping only, so the contract behaves the same. The fix touches `lib/`, which only the maintainer can change.\n2. **audit_economics, two lows, merged into one info note.** They share one cause: the contract has no way to recover USDC. A balance credited to a blacklisted or mistyped wallet can never be claimed, and USDC sent straight to the contract is never credited to anyone. The brief asks for exactly this (only the credited wallet can claim), and the README documents it, so I recorded it as a design trade-off rather than a defect.\n3. **audit_economics, info on the hard-coded USDC address, not kept.** The brief names that address. On a chain without USDC at it, deposits and claims fail before any funds move, and the existing tests cover that.\n\n**Manifest.** `launch.json` passes the schema checks. It deploys one contract whose only constructor argument is `$owner`.","treeHash":null,"usage":{"cachedInputTokens":152979,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2769,"runtime":"claude","turns":4,"wallClockMs":54906}},{"artifacts":[],"attempt":1,"bundleHash":"b3f450ebaea814fce40d563e15e62deb9dc73aae91d3c6bd6d5ef1687e2b7266","device":"ca0f4e05e864c332","findings":[],"hash":"7222e6938986511af4bd79222f2b5e4e6e4a715b583d90aef925a1d48e9e73b7","nodeId":"742f3d13-a55b-4c29-b394-d095d43c2b86","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/1a03986b-3673-4b55-88c1-b5e529b2bd34/742f3d13-a55b-4c29-b394-d095d43c2b86/launch.json) for `USDCDepositClaim` with constructor argument `$owner`.\n\nManifest structure and compiled constructor ABI checks passed. `forge build` succeeded; all 40 tests passed with the specified fuzz seed.\n\nOnly `launch.json` changed.","treeHash":"216f467636c1ef8551dd8dca02fd5ea53a727688","usage":{"cachedInputTokens":205568,"inputTokens":22164,"model":"gpt-6-astra","outputTokens":1977,"runtime":"codex","turns":3,"wallClockMs":51240}},{"artifacts":[],"attempt":1,"bundleHash":"592e5d52b18394654ab1199925356c5dd9886c2a17341ef5f663988730b51e30","device":"b3280f20e86b4e0d","findings":[],"hash":"a0c7a1ef1ce308db568994d7d272cae18624f02f2050f47d193b867f2bc69f4c","nodeId":"28ace6c1-e67f-4c60-ad51-0eef5ee4e179","outcome":"completed","summary":"Added adversarial fuzz tests and fixed-supply invariants covering ownership changes, recipient balances, donations, and failed operations.\n\nOffline verification with the required seed passed:\n- `forge build`\n- `forge test`: **52 passed, 0 failed**\n- **40,960 invariant calls**\n\nOnly `test/` changed. No implementation defect was reproduced.","treeHash":"8e8ea0761177863c65b6af292bac1c571eddaaa1","usage":{"cachedInputTokens":886272,"inputTokens":72198,"model":"gpt-6-astra","outputTokens":16048,"runtime":"codex","turns":6,"wallClockMs":352102}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"629987aaf6c7aa88","findings":[{"citation":"resolved","description":"README.md states that lib/dependencies.json records each vendored file's SHA-256 and that 'Vendored source is unchanged'. Two vendored files were reformatted (line wrapping at 110 columns) after vendoring, so their bytes no longer hash to the recorded values: contracts/token/ERC20/utils/SafeERC20.sol hashes to da646f23b6d7dd8dc4feb4c78a2826ae26f1dc4c48f5aadc99379d85f149621d (recorded ac1fd9fa…) and contracts/interfaces/IERC1363.sol hashes to ad1852364ca835625e3e75ee244405695f62e10a797147854098c016c8e3a80a (recorded 9c3a75a9…). I diffed both files against the @openzeppelin/contracts 5.4.0 npm release: the differences are whitespace only (error declaration and two function signatures split across lines), so there is no semantic change to SafeERC20 or the interface and no runtime impact on USDCDepositClaim. The defect is that the provenance check the repository advertises fails for those two files, so a release reviewer running the recorded hashes gets a mismatch and must fall back to a manual diff. The other nine OpenZeppelin files match the recorded hashes and upstream byte-for-byte. Fix: either restore the exact upstream bytes for these two files or record the hashes of the reformatted files and drop the 'unchanged' claim; note both touch lib/, which worker submissions may not modify, so this needs the maintainer.","line":14,"path":"lib/dependencies.json","reproduction":"In the repository root run: sha256sum lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol. Expected (per lib/dependencies.json lines 10 and 14): ac1fd9fa99b194a8db8dfa9ae8e3ff44feaa8f16668241fd2b66ae8b47d7c082 and 9c3a75a925a6dac9e88b03cddc58d42fe3131b0aaaad84408521f3f7af2f991b. Actual: da646f23b6d7dd8dc4feb4c78a2826ae26f1dc4c48f5aadc99379d85f149621d and ad1852364ca835625e3e75ee244405695f62e10a797147854098c016c8e3a80a. Diffing against the npm 5.4.0 tarball shows only line-wrapping changes at SafeERC20.sol lines 27-29 and 57-60 and IERC1363.sol lines 66-68.","severity":"info","snippet":"      \"contracts/token/ERC20/utils/SafeERC20.sol\": \"ac1fd9fa99b194a8db8dfa9ae8e3ff44feaa8f16668241fd2b66ae8b47d7c082\",","title":"Dependency provenance record does not match two vendored OpenZeppelin files"}],"hash":"b59ce230c23b86ab02f1bb97760e4118cae99e583d765e7e21d56ecb1f2d26c7","nodeId":"94617d9b-866b-44e2-acd2-3cbc66d64232","outcome":"completed","summary":"The review is complete. The findings file is written, the tree is otherwise untouched, and the snippet on line 14 of the dependency manifest matches the file exactly.\n\n**Outcome:** no defect in the contract itself. One info-level provenance finding.\n\n**What I checked, from the Execution Trace, Periphery and First Principles guides:**\n\n- **deposit** holds. Owner-only and guarded, exact balance-delta check after the pull, both accounting fields written together, every token failure mode reverts the whole call. The aderyn reentrancy lead is a state write inside a guarded function against a fixed token with no hooks, and the suite's callback wallet confirms reentry fails in both directions.\n- **claim** holds. Pays only the caller, zeroes credit before the transfer, verifies both the escrow decrease and the recipient increase exactly. I added a scratch trace where the issuer burns escrow balance, and the claim reverts without touching accounting.\n- **transferOwnership and acceptOwnership** hold. Scratch traces covered a pending owner claiming as a recipient before acceptance, the former owner keeping and claiming its own credit after handover, accept replay, and nominating the contract itself. All behaved as intended. Renounce is disabled as documented.\n- **Periphery:** I downloaded the OpenZeppelin 5.4.0 npm release and diffed every vendored file. Nine are byte-identical. SafeERC20 and IERC1363 differ only by line wrapping, so there is no semantic change.\n\n**The one finding:** the dependency manifest records upstream hashes, and the README claims vendored source is unchanged, but the two reformatted files no longer hash to the recorded values. Anyone running the advertised provenance check gets a mismatch. The fix touches lib/, so it needs the maintainer rather than a worker.\n\n**Coverage:** all four listed entry points plus the constructor, renounce, the solvency invariant, the vendored libraries and the static-analysis leads have rows. Nothing was left unreached. The owner's inability to correct a mistyped recipient and USDC issuer powers over custody are design trust assumptions the README already documents, not defects.","treeHash":null,"usage":{"cachedInputTokens":616456,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":17194,"runtime":"claude","turns":26,"wallClockMs":310448}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"22c9b760d0a15149","findings":[],"hash":"dce60b2c2a0d98c3bc466d54eda4eb8222184b0c6f58d8a67f7797c4e97317e0","nodeId":"25857fca-02a3-48d8-839c-af2424c073a1","outcome":"completed","summary":"The findings file is in place and excluded from the tree by the repository's own exclude rules, the scratch directory is removed, and no tracked file changed.\n\n**Result: no defects found in the assigned area.** The findings list is empty and the coverage record answers all four entry points plus five invariant rows.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides:**\n\n- **Arithmetic.** The contract has six checked add/sub operations and no multiplication, division, scaling constant, or narrowing cast. Overflow of a recipient credit or the running total reverts with a panic and rolls the token pull back, which I confirmed with a scratch test. The subtraction in claim cannot underflow because deposit keeps the total equal to the sum of credits under checked math.\n- **External call boundaries.** All four balance reads, both transfers and both code-length checks were walked through the guide's corner cases: no code at the token, void or false returns, fee-on-transfer, no-op and over-delivering transfers, pause and blocklist, zero and max amounts. Each either reverts cleanly with credit preserved or behaves as the README states.\n- **Seams.** A donation plus a hundred one-unit deposits and claims produced no drift between the total and the per-recipient sum, and no claimant could take the donation. A recipient whose own balance would overflow on receipt keeps their credit.\n- **Static analysis leads.** The aderyn reentrancy line on deposit is blocked by the shared guard, and mainnet USDC has no transfer hooks. The centralization lines are the owner role the brief asked for.\n\n**One item I deliberately did not report.** The exact-payout check in claim would make every credit permanently unclaimable if Circle upgraded USDC to charge a transfer fee. That requires the token issuer to act, and the README and SECURITY files accept it as a documented assumption, so it fails the validation gates and is recorded only as a note.\n\n**Unreached.** There is no launch.json in the tree yet, so the manifest row is marked unreached with the owner address the README names for when it exists.","treeHash":null,"usage":{"cachedInputTokens":834411,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":16572,"runtime":"claude","turns":26,"wallClockMs":231583}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"99e4819277ea59fc","findings":[{"citation":"resolved","description":"Economic Security guide, 'Break dependencies': a dependency failure that permanently blocks claims. The only way a credited balance leaves the contract is claim(), which pays msg.sender only. If the recipient is blacklisted by Circle (USDC's transfer reverts for a blacklisted `to`), or the owner typed a wrong address, or the recipient key is lost, the credited USDC and the matching contract balance are locked forever. The owner cannot reassign, cancel or rescue. The README (lines 39 and 79) documents this as accepted, and the brief asks for no recovery, so this is recorded as a design limitation and trust assumption rather than a permission bypass: the loss is real but requires either owner input error or a privileged third party (Circle). Same mechanism if Circle blacklists the escrow contract itself: every claim reverts and all credits freeze. Suggested minimal change, if the requester wants one: an owner-only function that moves an unclaimed credit from one recipient to another (or back to the owner), which preserves the agreed 'only that wallet can claim' rule for any wallet that has not been reassigned.","line":59,"path":"src/USDCDepositClaim.sol","reproduction":"State: owner approved and called deposit(alice, 10e6); claimable[alice]=10e6, escrow balance 10e6. Then Circle blacklists alice (in tests: token.setBlacklisted(alice,true)). alice calls claim() -> reverts Blacklisted; claimable[alice] stays 10e6. Owner calls any selector such as rescue(address,uint256) or reassign(address,address) -> call fails (no such function; fallback absent). Expected (for a recoverable design): owner can redirect the 10e6. Actual: the 10e6 USDC are locked in the contract indefinitely. Verified with test/scratch/Stranded.t.sol test_blacklistedRecipientCreditIsStranded.","severity":"low","snippet":"    function claim() external nonReentrant {\n        uint256 amount = claimable[msg.sender];\n        if (amount == 0) revert NothingToClaim();","title":"Credit to a recipient that can never claim is stranded: no owner path to reassign or recover it"},{"citation":"resolved","description":"Invariant guide, conservation: the contract keeps balance == totalClaimable + surplus, but surplus can only grow. deposit() requires the exact balance delta from the owner's transferFrom (lines 45-50), so a pre-existing balance is never credited, and claim() pays exactly claimable[msg.sender] (lines 69-75). There is no sweep. Any USDC sent with a plain transfer (owner funding by mistake, a third party, or an airdrop) is stranded. The README line 39 documents this as intended. Reported as a low-severity economic limitation; the invariant totalClaimable <= balance itself holds on every path.","line":19,"path":"src/USDCDepositClaim.sol","reproduction":"State: owner holds USDC. owner calls USDC.transfer(escrow, 5e6) instead of deposit. totalClaimable stays 0, no recipient is credited. Later deposit(alice,10e6) and alice.claim() leave balance 5e6 with totalClaimable 0. Owner calls sweep() or any other selector -> fails, nothing exists. Expected if recoverable: owner can withdraw the 5e6 surplus. Actual: 5e6 USDC locked forever. Verified with test/scratch/Stranded.t.sol test_directTransferIsStranded.","severity":"low","snippet":"    uint256 public totalClaimable;","title":"USDC transferred directly to the contract is untracked and has no path out"},{"citation":"resolved","description":"Trust assumption record, not a defect: the brief names this address, and the README restricts deployment to chain ID 1. Two external dependencies follow. (1) If the launch policy's chain is not Ethereum mainnet, the address has no code there, _requireToken() reverts with TokenUnavailable on every deposit and claim, and the deployment is useless (no funds at risk because nothing can be deposited). The reviewer could not read the pinned chain from the tree, so the judge should confirm the launch chain is 1. (2) On mainnet the address is Circle's upgradeable FiatTokenProxy; Circle can pause the token, blacklist the escrow, a recipient or the owner, or change transfer semantics by upgrade. The code's exact-delta checks fail closed in those cases (state is restored, no phantom credit), which is the right behavior, but claimants depend on Circle for liveness.","line":16,"path":"src/USDCDepositClaim.sol","reproduction":"Chain with no code at 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (test: vm.etch(USDC_ADDRESS, \"\")): owner approves nothing, calls deposit(alice, 1e6) -> reverts TokenUnavailable; alice.claim() with a prior credit -> reverts TokenUnavailable. Expected on the intended chain: both succeed. Covered by the existing tests test_missingTokenCodeRejectsFunding and test_missingTokenCodePreservesExistingClaims.","severity":"info","snippet":"    IERC20 public constant USDC = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);","title":"Hard-coded mainnet USDC address makes the contract inert on any other chain and bound to Circle's upgrade and freeze powers"}],"hash":"e253d02f4a07e4fe9b4cc59e9ebf80ac417ae0b6df08d55da26a3a0ae420cab7","nodeId":"ccb9e833-ffdd-4764-8b71-b07c8d6ef855","outcome":"completed","summary":"The review is complete. No tracked file was modified; only the findings file and a scratch test exist as new files.\n\n**Outcome:** the contract holds under the Economic Security, Invariant and Flow Gap guides. I found no fund-loss, misdirected-payment or invariant-breaking defect. The findings file at `.imd-findings.json` records three low or informational items and eight coverage rows, all four verifier-listed entry points answered.\n\n**What I checked**\n- **Economic Security:** blacklist, pause, false-return, void-return, short, extra and zero transfers all fail closed with state restored. The exact balance-delta checks on both deposit and claim prevent phantom credit. No fees, rounding, caps or shared capacity exist to starve or farm.\n- **Invariant:** totalClaimable equals the sum of credits and never exceeds the escrow balance on any path. The existing invariant suite with donate, blacklist and failed-transfer handlers passes at 256 runs by depth 64. Round-trips at 1 base unit and the uint256 maximum return exactly what was deposited.\n- **Flow Gap:** the aderyn reentrancy lead at line 45 is not reachable. Mainnet USDC has no transfer hooks, both functions carry nonReentrant, and the callback-wallet tests show re-entry reverts. Ownership handover mid-flow does not touch credits.\n\n**Findings recorded**\n1. **Low:** a credit whose recipient is blacklisted by Circle, mistyped, or has lost their key is locked forever. The owner has no reassign or rescue path. The README documents this as accepted, so it is a design limitation, not a bypass.\n2. **Low:** USDC sent by plain transfer is untracked and can never leave the contract. Also documented in the README.\n3. **Info:** the hard-coded mainnet USDC address makes the contract inert on any other chain and ties liveness to Circle's pause, blacklist and upgrade powers. I could not read the pinned launch chain from the tree, so the judge should confirm it is chain ID 1.\n\nBoth stranding scenarios were confirmed with a scratch test under test/scratch, which passes on the current code as a demonstration. No finding carries a proof file because none is high or critical.","treeHash":null,"usage":{"cachedInputTokens":954634,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":15206,"runtime":"claude","turns":24,"wallClockMs":273448}},{"artifacts":[],"attempt":1,"bundleHash":"d335f0783bd581fb9ac552b9fb50bd411bbee19a6e568c6fe58663565f4bf302","device":"4f646c6931822e60","findings":[],"hash":"ee7bbfccb89004d00f8f0f4b00525cd6268b5f31b7c21b15fef6cf6746cb980b","nodeId":"0c10781d-dcc0-423e-9cca-d035b0cdbd0e","outcome":"completed","summary":"Implemented `USDCDepositClaim` with owner-only funding, accumulating recipient balances, recipient-only full claims, and reentrancy protection.\n\nValidation passed:\n\n- `forge build`\n- `forge test` with the supplied seed: 40 tests passed\n- `forge fmt --check`\n- Invariants across 16,384 randomized operations\n\nDependencies are vendored. Deployment parameters, usage, and operational risks are documented in [README.md](/home/imd5/.identitymd/work/1a03986b-3673-4b55-88c1-b5e529b2bd34/0c10781d-dcc0-423e-9cca-d035b0cdbd0e/README.md).\n\nFund through `deposit()`; direct token transfers create no claimable balance and cannot be recovered. Independent security review remains required before release.","treeHash":"de9f4ee8cc34d6049e12e1824299418d01cf7f21","usage":{"cachedInputTokens":465024,"inputTokens":69404,"model":"gpt-6-astra","outputTokens":23735,"runtime":"codex","turns":5,"wallClockMs":455287}}],"verification":[{"checks":[{"durationMs":1433,"exitCode":0,"name":"build","output":"Compiling 34 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.35s\nCompiler run successful!\n","passed":true},{"durationMs":2462,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/USDCDepositClaim.t.sol:USDCDepositClaimTest\n[PASS] testFuzz_depositAndClaimConserveFunds(uint96,uint96,uint96) (runs: 1000, μ: 694697, ~: 694657)\n[PASS] testFuzz_reentrancyCannotEnterEitherFunction(bool,bool) (runs: 1000, μ: 1299488, ~: 1304465)\n[PASS] test_blacklistedOwnerCannotFundAndBlacklistedEscrowPreservesCredit() (gas: 696451)\n[PASS] test_blacklistedRecipientDoesNotBlockOthersAndCanRetryWhenUnblocked() (gas: 626394)\n[PASS] test_claimPaysCallerAndClearsOnlyTheirBalance() (gas: 574469)\n[PASS] test_claimTransferFailuresPreserveCreditAndCanBeRetried() (gas: 761316)\n[PASS] test_claimTwiceRejectedAndNewDepositCanBeClaimed() (gas: 531646)\n[PASS] test_depositPullsFromOwnerAndCreditsRecipient() (gas: 252655)\n[PASS] test_directTransfersDoNotAssignCreditOrIncreaseClaimPayout() (gas: 342691)\n[PASS] test_factoryDeploysWithExplicitLaunchOwnerOnEmptyChain() (gas: 245882)\n[PASS] test_failedTopUpPreservesPriorCredit() (gas: 409389)\n[PASS] test_falseReturningTokenRollsBackDepositAndTokenMovement() (gas: 264718)\n[PASS] test_inexactDepositsRejectedEvenWithExistingDonation() (gas: 724854)\n[PASS] test_inexactPayoutsCannotEraseCredit() (gas: 660910)\n[PASS] test_initialConfiguration() (gas: 54405)\n[PASS] test_insufficientOwnerBalanceDoesNotCredit() (gas: 136034)\n[PASS] test_invalidRecipientsRejected() (gas: 105138)\n[PASS] test_invalidReturnDataRollsBackDeposit() (gas: 264432)\n[PASS] test_missingOrInsufficientApprovalDoesNotCredit() (gas: 170750)\n[PASS] test_missingTokenCodePreservesExistingClaims() (gas: 230517)\n[PASS] test_missingTokenCodeRejectsFunding() (gas: 51058)\n[PASS] test_nativeEtherAndUnknownCallsRejected() (gas: 61569)\n[PASS] test_noReturnTokenSupportsDepositAndClaim() (gas: 308806)\n[PASS] test_nonOwnerCannotNominateOwnerOrRenounce() (gas: 41845)\n[PASS] test_oneBaseUnitCanBeFundedAndClaimed() (gas: 265077)\n[PASS] test_outsiderCannotClaimAnotherRecipientsFunds() (gas: 231742)\n[PASS] test_outsiderCannotDepositEvenWithApproval() (gas: 162390)\n[PASS] test_ownerCanBeRecipientButCannotTakeSomeoneElsesCredit() (gas: 420567)\n[PASS] test_ownerCannotRenounce() (gas: 25698)\n[PASS] test_ownershipTransferRequiresAcceptanceAndUsesNewOwnersFunds() (gas: 809250)\n[PASS] test_pausedTokenRejectsDepositsAndClaimsWithoutLosingCredit() (gas: 561998)\n[PASS] test_pendingOwnerCanBeReplacedOrCancelled() (gas: 189672)\n[PASS] test_repeatedDepositsAccumulateAndRecipientsStaySeparate() (gas: 469687)\n[PASS] test_revertingCallbackRestoresClaimAndGuard() (gas: 1323976)\n[PASS] test_revertingTokenRollsBackDeposit() (gas: 235717)\n[PASS] test_runtimeContainsNoForbiddenOpcodesOrLibraryLinks() (gas: 1093138)\n[PASS] test_uint256MaximumCanBeFundedAndClaimedWithoutTruncation() (gas: 336121)\n[PASS] test_zeroDepositRejected() (gas: 42201)\n[PASS] test_zeroOwnerRejected() (gas: 4147)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 55.45ms (118.64ms CPU time)\n\nRan 1 test for test/USDCDepositClaim.invariant.t.sol:USDCDepositClaimInvariantTest\n[PASS]\nUSDCDepositClaimInvariantTest invariants:\n[PASS] invariant_creditsEqualFundedUnclaimedAmounts\n[PASS] invariant_escrowAlwaysBacksAllCreditsAndKeepsDonationsSeparate\n[PASS] invariant_onlyRecipientsReceiveTheirClaims\n USDCDepositClaimInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+---------------------+-------+---------+----------╮\n| Contract            | Selector            | Calls | Reverts | Discards |\n+========================================================================+\n| DepositClaimHandler | blockedClaim        | 2714  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | claim               | 2700  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | deposit             | 2741  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | donate              | 2731  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | failedDeposit       | 2780  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | unauthorizedDeposit | 2718  | 0       | 0        |\n╰---------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1978\n  Bound result 8000000\n  Bound result 201793169489\n  Bound result 3\n  Bound result 35000000\n  Bound result 1000000\n  Bound result 127\n  Bound result 3000000\n  Bound result 4087\n  Bound result 133152737466\n  Bound result 3000000\n  Bound result 163\n  Bound result 3394\n  Bound result 3\n  Bound result 637642886758\n  Bound result 201842175555\n  Bound result 100000000\n  Bound result 20000000\n  Bound result 1721\n  Bound result 6022\n  Bound result 1000000000000\n  Bound result 244\n  Bound result 100000000\n  Bound result 50000000\n  Bound result 694\n  Bound result 201813169490\n  Bound result 816\n  Bound result 2413\n  Bound result 1000000000000\n  Bound result 897656409494\n  Bound result 18058028111\n  Bound result 508\n  Bound result 711499210573\n  Bound result 1325\n  Bound result 219484801461\n  Bound result 60727034244\n  Bound result 6\n  Bound result 2534\n  Bound result 96\n  Bound result 7000000\n  Bound result 95\n  Bound result 6687\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.39s (2.39s CPU time)\n\nRan 2 test suites in 2.39s (2.44s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"USDCDepositClaim.acceptOwnership()\",\"USDCDepositClaim.claim()\",\"USDCDepositClaim.deposit(address,uint256)\",\"USDCDepositClaim.transferOwnership(address)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":106,\"SECURITY.md\":30,\"foundry.toml\":21,\"launch.json\":10,\"remappings.txt\":2,\"src/USDCDepositClaim.sol\":88,\"test/USDCDepositClaim.invariant.t.sol\":144,\"test/USDCDepositClaim.t.sol\":559,\"test/helpers/CallbackWallet.sol\":46,\"test/helpers/MockUSDC.sol\":124},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7222e6938986511af4bd79222f2b5e4e6e4a715b583d90aef925a1d48e9e73b7","verifiedTreeHash":"216f467636c1ef8551dd8dca02fd5ea53a727688","verifierVersion":"0.1.0+aca6c688"},{"checks":[{"durationMs":5050,"exitCode":0,"name":"build","output":"Compiling 36 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.81s\nCompiler run successful!\n","passed":true},{"durationMs":11631,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/USDCDepositClaim.adversarial.t.sol:USDCDepositClaimAdversarialTest\n[PASS] testFuzz_arbitraryCreditedWalletExclusivelyReceivesItsFunds(address,uint128) (runs: 1000, μ: 442874, ~: 442583)\n[PASS] testFuzz_failedTopUpWithSurplusPreservesAllStateAndCanRetry(uint128,uint128,uint128) (runs: 1000, μ: 677543, ~: 677522)\n[PASS] testFuzz_splitDepositsReachUint256Maximum(uint256,bool) (runs: 1000, μ: 944978, ~: 891762)\nLogs:\n  Bound result 1\n\n[PASS] test_newOwnerCannotUseFormerOwnersBalanceOrAllowance() (gas: 795254)\n[PASS] test_reentrantDepositFailureRestoresPriorCreditAllowanceAndGuard() (gas: 1602951)\n[PASS] test_relayCannotClaimOriginsCreditAndReceivesOnlyItsOwnAllocation() (gas: 834157)\n[PASS] test_relayCannotUseOwnerOriginToDeposit() (gas: 516569)\n[PASS] test_splitMaximumAcrossRecipientsAtLastBaseUnit() (gas: 999888)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n\n[PASS] test_splitMaximumAtOneBaseUnitBoundaries() (gas: 890900)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 237.82ms (677.19ms CPU time)\n\nRan 39 tests for test/USDCDepositClaim.t.sol:USDCDepositClaimTest\n[PASS] testFuzz_depositAndClaimConserveFunds(uint96,uint96,uint96) (runs: 1000, μ: 694697, ~: 694657)\n[PASS] testFuzz_reentrancyCannotEnterEitherFunction(bool,bool) (runs: 1000, μ: 1299488, ~: 1304465)\n[PASS] test_blacklistedOwnerCannotFundAndBlacklistedEscrowPreservesCredit() (gas: 696451)\n[PASS] test_blacklistedRecipientDoesNotBlockOthersAndCanRetryWhenUnblocked() (gas: 626394)\n[PASS] test_claimPaysCallerAndClearsOnlyTheirBalance() (gas: 574469)\n[PASS] test_claimTransferFailuresPreserveCreditAndCanBeRetried() (gas: 761316)\n[PASS] test_claimTwiceRejectedAndNewDepositCanBeClaimed() (gas: 531646)\n[PASS] test_depositPullsFromOwnerAndCreditsRecipient() (gas: 252655)\n[PASS] test_directTransfersDoNotAssignCreditOrIncreaseClaimPayout() (gas: 342691)\n[PASS] test_factoryDeploysWithExplicitLaunchOwnerOnEmptyChain() (gas: 245882)\n[PASS] test_failedTopUpPreservesPriorCredit() (gas: 409389)\n[PASS] test_falseReturningTokenRollsBackDepositAndTokenMovement() (gas: 264718)\n[PASS] test_inexactDepositsRejectedEvenWithExistingDonation() (gas: 724854)\n[PASS] test_inexactPayoutsCannotEraseCredit() (gas: 660910)\n[PASS] test_initialConfiguration() (gas: 54405)\n[PASS] test_insufficientOwnerBalanceDoesNotCredit() (gas: 136034)\n[PASS] test_invalidRecipientsRejected() (gas: 105138)\n[PASS] test_invalidReturnDataRollsBackDeposit() (gas: 264432)\n[PASS] test_missingOrInsufficientApprovalDoesNotCredit() (gas: 170750)\n[PASS] test_missingTokenCodePreservesExistingClaims() (gas: 230517)\n[PASS] test_missingTokenCodeRejectsFunding() (gas: 51058)\n[PASS] test_nativeEtherAndUnknownCallsRejected() (gas: 61569)\n[PASS] test_noReturnTokenSupportsDepositAndClaim() (gas: 308806)\n[PASS] test_nonOwnerCannotNominateOwnerOrRenounce() (gas: 41845)\n[PASS] test_oneBaseUnitCanBeFundedAndClaimed() (gas: 265077)\n[PASS] test_outsiderCannotClaimAnotherRecipientsFunds() (gas: 231742)\n[PASS] test_outsiderCannotDepositEvenWithApproval() (gas: 162390)\n[PASS] test_ownerCanBeRecipientButCannotTakeSomeoneElsesCredit() (gas: 420567)\n[PASS] test_ownerCannotRenounce() (gas: 25698)\n[PASS] test_ownershipTransferRequiresAcceptanceAndUsesNewOwnersFunds() (gas: 809250)\n[PASS] test_pausedTokenRejectsDepositsAndClaimsWithoutLosingCredit() (gas: 561998)\n[PASS] test_pendingOwnerCanBeReplacedOrCancelled() (gas: 189672)\n[PASS] test_repeatedDepositsAccumulateAndRecipientsStaySeparate() (gas: 469687)\n[PASS] test_revertingCallbackRestoresClaimAndGuard() (gas: 1323976)\n[PASS] test_revertingTokenRollsBackDeposit() (gas: 235717)\n[PASS] test_runtimeContainsNoForbiddenOpcodesOrLibraryLinks() (gas: 1093138)\n[PASS] test_uint256MaximumCanBeFundedAndClaimedWithoutTruncation() (gas: 336121)\n[PASS] test_zeroDepositRejected() (gas: 42201)\n[PASS] test_zeroOwnerRejected() (gas: 4147)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 245.98ms (498.42ms CPU time)\n\nRan 1 test for test/USDCDepositClaim.invariant.t.sol:USDCDepositClaimInvariantTest\n[PASS]\nUSDCDepositClaimInvariantTest invariants:\n[PASS] invariant_creditsEqualFundedUnclaimedAmounts\n[PASS] invariant_escrowAlwaysBacksAllCreditsAndKeepsDonationsSeparate\n[PASS] invariant_onlyRecipientsReceiveTheirClaims\n USDCDepositClaimInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+---------------------+-------+---------+----------╮\n| Contract            | Selector            | Calls | Reverts | Discards |\n+========================================================================+\n| DepositClaimHandler | blockedClaim        | 2714  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | claim               | 2700  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | deposit             | 2741  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | donate              | 2731  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | failedDeposit       | 2780  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | unauthorizedDeposit | 2718  | 0       | 0        |\n╰---------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1978\n  Bound result 2000000\n  Bound result 201793169489\n  Bound result 5000000\n  Bound result 13000000\n  Bound result 255\n  Bound result 40000000\n  Bound result 24576\n  Bound result 4087\n  Bound result 133152737466\n  Bound result 16000000\n  Bound result 7182\n  Bound result 3395\n  Bound result 3\n  Bound result 637642886758\n  Bound result 201824200129\n  Bound result 9999999\n  Bound result 1000000\n  Bound result 1758\n  Bound result 6099\n  Bound result 100000000\n  Bound result 35000000\n  Bound result 9999999\n  Bound result 8000000\n  Bound result 714\n  Bound result 201794194064\n  Bound result 778\n  Bound result 2359\n  Bound result 100000000\n  Bound result 897656409494\n  Bound result 18058028111\n  Bound result 507\n  Bound result 711499210573\n  Bound result 1326\n  Bound result 219484801461\n  Bound result 60727034244\n  Bound result 1\n  Bound result 2543\n  Bound result 10000000\n  Bound result 95\n  Bound result 35000000\n  Bound result 6688\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.83s (5.82s CPU time)\n\nRan 3 tests for test/USDCDepositClaim.ownership.invariant.t.sol:USDCDepositClaimOwnershipInvariantTest\n[PASS]\nUSDCDepositClaimOwnershipInvariantTest invariants:\n[PASS] invariant_everyWalletKeepsItsOwnFundsAndCredits\n[PASS] invariant_onlyAcceptedNomineesBecomeOwner\n USDCDepositClaimOwnershipInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------------+---------------------+-------+---------+----------╮\n| Contract                   | Selector            | Calls | Reverts | Discards |\n+===============================================================================+\n| OwnershipAccountingHandler | accept              | 2676  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | claim               | 2752  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | deposit             | 2731  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | donate              | 2676  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | failedClaim         | 2852  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | failedDeposit       | 2760  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | nominate            | 2666  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | unauthorizedAdmin   | 2736  | 0       | 0        |\n|----------------------------+---------------------+-------+---------+----------|\n| OwnershipAccountingHandler | unauthorizedDeposit | 2727  | 0       | 0        |\n╰----------------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000\n  Bound result 2000000\n  Bound result 3000000\n  Bound result 4000000\n  Bound result 8000000\n  Bound result 12465\n  Bound result 15000000\n  Bound result 30000000\n  Bound result 12752\n  Bound result 9000000\n  Bound result 24\n  Bound result 2753\n  Bound result 100000000\n  Bound result 13\n  Bound result 649\n  Bound result 93\n  Bound result 14601\n  Bound result 791394394203\n  Bound result 9748\n  Bound result 1000000000000\n  Bound result 992655422061\n  Bound result 107477462\n  Bound result 14000000\n  Bound result 2018\n  Bound result 13000000\n  Bound result 5\n  Bound result 4999603391\n  Bound result 413209\n  Bound result 1879474684\n  Bound result 895\n  Bound result 8\n  Bound result 8000000\n  Bound result 2334950966\n  Bound result 1\n  Bound result 2832269994\n  Bound result 594430792834\n  Bound result 1\n  Bound result 1\n  Bound result 574\n  Bound result 1\n  Bound result 3081\n  Bound result 11599\n  Bound result 1\n  Bound result 4287\n  Bound result 2\n  Bound result 1000000\n  Bound result 100000000\n  Bound result 1\n  Bound result 688397795211\n  Bound result 718\n  Bound result 243893866\n  Bound result 12886\n  Bound result 7\n  Bound result 2\n  Bound result 0\n\n[PASS] test_handlerExercisesEveryFailureAndOwnershipTransition() (gas: 9270909)\nLogs:\n  Bound result 1000000\n  Bound result 2000000\n  Bound result 3000000\n  Bound result 4000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 11000000\n  Bound result 12000000\n  Bound result 13000000\n  Bound result 14000000\n  Bound result 15000000\n  Bound result 16000000\n  Bound result 1\n\n[PASS] test_handlerExercisesExhaustedOwnerAndFullBalanceDeposit() (gas: 1737914)\nLogs:\n  Bound result 1000000\n  Bound result 2000000\n  Bound result 3000000\n  Bound result 4000000\n  Bound result 999990000000\n  Bound result 1\n  Bound result 1\n  Bound result 1000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 11.34s (11.34s CPU time)\n\nRan 4 test suites in 11.34s (17.65s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":93,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"USDCDepositClaim.acceptOwnership()\",\"USDCDepositClaim.claim()\",\"USDCDepositClaim.deposit(address,uint256)\",\"USDCDepositClaim.transferOwnership(address)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":106,\"SECURITY.md\":30,\"foundry.toml\":21,\"remappings.txt\":2,\"src/USDCDepositClaim.sol\":88,\"test/README.md\":67,\"test/USDCDepositClaim.adversarial.t.sol\":260,\"test/USDCDepositClaim.invariant.t.sol\":144,\"test/USDCDepositClaim.ownership.invariant.t.sol\":315,\"test/USDCDepositClaim.t.sol\":559,\"test/helpers/CallbackWallet.sol\":46,\"test/helpers/MockUSDC.sol\":124},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a0c7a1ef1ce308db568994d7d272cae18624f02f2050f47d193b867f2bc69f4c","verifiedTreeHash":"8e8ea0761177863c65b6af292bac1c571eddaaa1","verifierVersion":"0.1.0+aca6c688"},{"checks":[{"durationMs":1275,"exitCode":0,"name":"build","output":"Compiling 34 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.20s\nCompiler run successful!\n","passed":true},{"durationMs":2623,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/USDCDepositClaim.t.sol:USDCDepositClaimTest\n[PASS] testFuzz_depositAndClaimConserveFunds(uint96,uint96,uint96) (runs: 1000, μ: 694697, ~: 694657)\n[PASS] testFuzz_reentrancyCannotEnterEitherFunction(bool,bool) (runs: 1000, μ: 1299488, ~: 1304465)\n[PASS] test_blacklistedOwnerCannotFundAndBlacklistedEscrowPreservesCredit() (gas: 696451)\n[PASS] test_blacklistedRecipientDoesNotBlockOthersAndCanRetryWhenUnblocked() (gas: 626394)\n[PASS] test_claimPaysCallerAndClearsOnlyTheirBalance() (gas: 574469)\n[PASS] test_claimTransferFailuresPreserveCreditAndCanBeRetried() (gas: 761316)\n[PASS] test_claimTwiceRejectedAndNewDepositCanBeClaimed() (gas: 531646)\n[PASS] test_depositPullsFromOwnerAndCreditsRecipient() (gas: 252655)\n[PASS] test_directTransfersDoNotAssignCreditOrIncreaseClaimPayout() (gas: 342691)\n[PASS] test_factoryDeploysWithExplicitLaunchOwnerOnEmptyChain() (gas: 245882)\n[PASS] test_failedTopUpPreservesPriorCredit() (gas: 409389)\n[PASS] test_falseReturningTokenRollsBackDepositAndTokenMovement() (gas: 264718)\n[PASS] test_inexactDepositsRejectedEvenWithExistingDonation() (gas: 724854)\n[PASS] test_inexactPayoutsCannotEraseCredit() (gas: 660910)\n[PASS] test_initialConfiguration() (gas: 54405)\n[PASS] test_insufficientOwnerBalanceDoesNotCredit() (gas: 136034)\n[PASS] test_invalidRecipientsRejected() (gas: 105138)\n[PASS] test_invalidReturnDataRollsBackDeposit() (gas: 264432)\n[PASS] test_missingOrInsufficientApprovalDoesNotCredit() (gas: 170750)\n[PASS] test_missingTokenCodePreservesExistingClaims() (gas: 230517)\n[PASS] test_missingTokenCodeRejectsFunding() (gas: 51058)\n[PASS] test_nativeEtherAndUnknownCallsRejected() (gas: 61569)\n[PASS] test_noReturnTokenSupportsDepositAndClaim() (gas: 308806)\n[PASS] test_nonOwnerCannotNominateOwnerOrRenounce() (gas: 41845)\n[PASS] test_oneBaseUnitCanBeFundedAndClaimed() (gas: 265077)\n[PASS] test_outsiderCannotClaimAnotherRecipientsFunds() (gas: 231742)\n[PASS] test_outsiderCannotDepositEvenWithApproval() (gas: 162390)\n[PASS] test_ownerCanBeRecipientButCannotTakeSomeoneElsesCredit() (gas: 420567)\n[PASS] test_ownerCannotRenounce() (gas: 25698)\n[PASS] test_ownershipTransferRequiresAcceptanceAndUsesNewOwnersFunds() (gas: 809250)\n[PASS] test_pausedTokenRejectsDepositsAndClaimsWithoutLosingCredit() (gas: 561998)\n[PASS] test_pendingOwnerCanBeReplacedOrCancelled() (gas: 189672)\n[PASS] test_repeatedDepositsAccumulateAndRecipientsStaySeparate() (gas: 469687)\n[PASS] test_revertingCallbackRestoresClaimAndGuard() (gas: 1323976)\n[PASS] test_revertingTokenRollsBackDeposit() (gas: 235717)\n[PASS] test_runtimeContainsNoForbiddenOpcodesOrLibraryLinks() (gas: 1093138)\n[PASS] test_uint256MaximumCanBeFundedAndClaimedWithoutTruncation() (gas: 336121)\n[PASS] test_zeroDepositRejected() (gas: 42201)\n[PASS] test_zeroOwnerRejected() (gas: 4147)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 61.43ms (141.67ms CPU time)\n\nRan 1 test for test/USDCDepositClaim.invariant.t.sol:USDCDepositClaimInvariantTest\n[PASS]\nUSDCDepositClaimInvariantTest invariants:\n[PASS] invariant_creditsEqualFundedUnclaimedAmounts\n[PASS] invariant_escrowAlwaysBacksAllCreditsAndKeepsDonationsSeparate\n[PASS] invariant_onlyRecipientsReceiveTheirClaims\n USDCDepositClaimInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+---------------------+-------+---------+----------╮\n| Contract            | Selector            | Calls | Reverts | Discards |\n+========================================================================+\n| DepositClaimHandler | blockedClaim        | 2714  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | claim               | 2700  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | deposit             | 2741  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | donate              | 2731  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | failedDeposit       | 2780  | 0       | 0        |\n|---------------------+---------------------+-------+---------+----------|\n| DepositClaimHandler | unauthorizedDeposit | 2718  | 0       | 0        |\n╰---------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1978\n  Bound result 8000000\n  Bound result 896882307480\n  Bound result 3\n  Bound result 35000000\n  Bound result 1000000\n  Bound result 127\n  Bound result 3000000\n  Bound result 4087\n  Bound result 133152737466\n  Bound result 3000000\n  Bound result 163\n  Bound result 3394\n  Bound result 3\n  Bound result 637642886758\n  Bound result 896931309459\n  Bound result 100000000\n  Bound result 20000000\n  Bound result 1722\n  Bound result 6022\n  Bound result 1000000000000\n  Bound result 244\n  Bound result 100000000\n  Bound result 50000000\n  Bound result 695\n  Bound result 793982623171\n  Bound result 816\n  Bound result 2413\n  Bound result 1000000000000\n  Bound result 897656409494\n  Bound result 18058028111\n  Bound result 508\n  Bound result 711499210573\n  Bound result 1325\n  Bound result 219484801461\n  Bound result 60727034244\n  Bound result 6\n  Bound result 2534\n  Bound result 96\n  Bound result 7000000\n  Bound result 95\n  Bound result 6687\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.53s (2.53s CPU time)\n\nRan 2 test suites in 2.53s (2.59s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":49,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"USDCDepositClaim.acceptOwnership()\",\"USDCDepositClaim.claim()\",\"USDCDepositClaim.deposit(address,uint256)\",\"USDCDepositClaim.transferOwnership(address)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":106,\"SECURITY.md\":30,\"foundry.toml\":21,\"remappings.txt\":2,\"src/USDCDepositClaim.sol\":88,\"test/USDCDepositClaim.invariant.t.sol\":144,\"test/USDCDepositClaim.t.sol\":559,\"test/helpers/CallbackWallet.sol\":46,\"test/helpers/MockUSDC.sol\":124},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":473,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":240,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/USDCDepositClaim.sol:45: Reentrancy: State change after external call (4 places)\n[low] centralization-risk at src/USDCDepositClaim.sol:13: Centralization Risk (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ee7bbfccb89004d00f8f0f4b00525cd6268b5f31b7c21b15fef6cf6746cb980b","verifiedTreeHash":"de9f4ee8cc34d6049e12e1824299418d01cf7f21","verifierVersion":"0.1.0+aca6c688"}]}