{"assessments":[],"deployments":[],"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":"99ed48ba-f9b9-4df5-a508-d39b86bb5871","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"526ca576ec7b96de0be709d1d9fe49f3cbee308de598c7d4669d9ad48c5a473b","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":"4b88858387a403195fc2756bebf0a0e8e81ba97606a0be6c617b9df5409adebe","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":"71ee430cfa1dc3674ae24b9e3aa685d6eac6cfbe4a4fc4405a39882c069b6c95","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":"66c1385b5df745230ac7da3216732da14275014862acde1f0b2708c2904e849f","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":"2f2a7b60971dfa141cf1f1081ea734b215a9b57bc5121dfd6d9637bdc409fc20","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":"4176e633c5e71ec9664484dab3924a689520f9003e625fb388c48d279a64558b","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":"5d85ee2ca13464ac7f92c5298eee58ada57374faecf2bbc692cc442bb375a2a9","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"82e1a1c64e21e786cf44bdc5c8f02e929e72b07a6ee1513a2bc56849aa39a43d","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Bankers (BANKERS).\nToken name: Bankers\nToken symbol: BANKERS\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"fac5b98de2aafe672e25b6164c143736c0a4e053b7c30c5619ec561f42ab8ed4","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"99ed48ba-f9b9-4df5-a508-d39b86bb5871","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1505-bankers"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51331","feedbackHash":"9a4c5da74a86ec05bc1d922cd18053b4d9137a2f434a32000bab82d797580a5f","nodeKey":"audit_economics","submissionHash":"526ca576ec7b96de0be709d1d9fe49f3cbee308de598c7d4669d9ad48c5a473b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52666","feedbackHash":"a2357f9f767f1b0b1f6432dfc116152461c780eed9a3f0ce6cff5b6706d26d81","nodeKey":"audit_flow","submissionHash":"4b88858387a403195fc2756bebf0a0e8e81ba97606a0be6c617b9df5409adebe","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52265","feedbackHash":"977f02b45e97e047954675bd359e969c96d2d18be6d6b827b79c7129a395ec85","nodeKey":"audit_judge","submissionHash":"71ee430cfa1dc3674ae24b9e3aa685d6eac6cfbe4a4fc4405a39882c069b6c95","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51427","feedbackHash":"28af6075d8907eb7c152799cf24f4a57418bb338c1d2ab7fe01ac086658c7dff","nodeKey":"audit_math","submissionHash":"66c1385b5df745230ac7da3216732da14275014862acde1f0b2708c2904e849f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51420","feedbackHash":"a9b61675d99f755c98e0e16066aa7174c3c9d50190887905f105850a3bd7f2eb","nodeKey":"audit_permissions","submissionHash":"2f2a7b60971dfa141cf1f1081ea734b215a9b57bc5121dfd6d9637bdc409fc20","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50965","feedbackHash":"9a4c47f93c70da98c32d171880fbd1f040dcb4c7fb0efafb7f5d635116bd573b","nodeKey":"build_contract_project","submissionHash":"4176e633c5e71ec9664484dab3924a689520f9003e625fb388c48d279a64558b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51475","feedbackHash":"0a0c861134eeaff1f23a70ee77f47cc2d31d58753850d476b6c1893733f88656","nodeKey":"manifest","submissionHash":"5d85ee2ca13464ac7f92c5298eee58ada57374faecf2bbc692cc442bb375a2a9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51180","feedbackHash":"bdc9f0ced5ee841404e248364df72dbc1c6e4cb0eeaabba614eaf8be15e753b1","nodeKey":"write_foundry_tests","submissionHash":"82e1a1c64e21e786cf44bdc5c8f02e929e72b07a6ee1513a2bc56849aa39a43d","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5ed7ea4adb3cf65151471ec633227bf26755ee13c5285b96de27c1f70cfef709","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e382bd4d2b3e471f","findings":[{"citation":"resolved","description":"The README (lines 80-83) states that dependencies.lock.json 'records exact upstream commits, archive URLs, and SHA-256 hashes for every vendored file' and that lib/forge-std contains 'unmodified src/ files' from forge-std v1.9.6 (commit 3b20d60d). Recomputing sha256 over the tree shows six forge-std files whose hash does not equal the lock entry: StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol and interfaces/IMulticall3.sol. The lock hashes equal the upstream files at the pinned commit; the vendored copies were re-wrapped (forge fmt style, whitespace-only: the token stream is identical to upstream), so the lock describes files that are not the ones in the tree. Trust-gap impact: a reviewer or the admission step that uses the lock file to verify the test harness provenance gets a failed check, and the README's 'unmodified' assurance about the assertion library (the code that decides whether every test in this repository passes) is not literally true. All five vendored OpenZeppelin files match upstream v5.0.2 byte for byte and their lock hashes are correct, so the deployed token is unaffected; this is a documentation/provenance defect in test-only material.","line":60,"path":"dependencies.lock.json","reproduction":"State: the committed tree at 50b54c1. Input: for each entry in dependencies.lock.json run `sha256sum <path>` and compare with the recorded sha256. Expected: every hash matches (README: 'records exact ... SHA-256 hashes for every vendored file'). Actual: `sha256sum lib/forge-std/src/StdAssertions.sol` = 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384 while dependencies.lock.json line 60 records d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780 (the upstream hash). The same mismatch occurs for StdJson.sol (lock 0211b47e..., actual 61bbf9b3...), StdToml.sol (lock de3fb35a..., actual 187d2f0c...), Vm.sol (lock 37cdc224..., actual 9ef7ee8c...), console.sol (lock 896c5a5a..., actual a2e632dc...) and interfaces/IMulticall3.sol (lock 6620d9c5..., actual 1b63ca78...). `diff` against https://raw.githubusercontent.com/foundry-rs/forge-std/3b20d60d14b343ee4f908cb8079495c07f5e8981/src/<file> shows line-wrapping differences only. Fix: either re-vendor the six files byte-identical to upstream (which restores the lock hashes) or recompute the lock hashes and drop the 'unmodified' wording from the README.","severity":"low","snippet":"        \"path\": \"lib/forge-std/src/StdAssertions.sol\",\n        \"sha256\": \"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780\"","title":"dependencies.lock.json records SHA-256 hashes that do not match six vendored forge-std files; README's 'unmodified' and 'exact hashes' provenance claims are false for them"}],"hash":"2f2a7b60971dfa141cf1f1081ea734b215a9b57bc5121dfd6d9637bdc409fc20","nodeId":"cb821202-9403-4c57-9071-98ca1a46583e","outcome":"completed","summary":"Review complete. The findings file is written and the tree is otherwise untouched.\n\n**Result:** the Bankers token holds across the Access Control, Trust Gap and Asymmetry guides. It is the unmodified OpenZeppelin v5.0.2 ERC20 with a single constructor mint of exactly 10^27 base units to msg.sender. One low-severity provenance defect was found outside the token itself.\n\n**What I verified**\n\n- The compiled ABI exposes exactly three state-changing functions, approve, transfer and transferFrom. There is no owner, initializer, pause, blacklist, mint, burn, permit, receive or fallback, and the runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- Each entry point acts only on the caller's own balance or allowance. The deployer or factory keeps no power after construction and needs an allowance like anyone else. A scratch fuzz test confirmed transfer and transferFrom move identical amounts under identical checks.\n- All five vendored OpenZeppelin files are byte-identical to the upstream v5.0.2 commit, and their lock-file hashes are correct.\n- The existing 39 tests pass, including the launch-flow settlement test and the 128-run invariant suite. The static analysis lead about the large numeric literal is correct arithmetic, not a defect.\n\n**Finding reported (low):** six vendored forge-std files were reformatted, so the SHA-256 hashes recorded in the lock file do not match the files in the tree. The differences are whitespace-only against upstream, so the test harness behaves correctly, but the README's claims that the files are unmodified and that the lock records exact hashes are false for them. The reproduction and fix are in the findings file.\n\n**Coverage:** all three verifier-listed entry points are marked `holds`, plus rows for the constructor mint, the no-privileged-entry-point invariant, supply conservation, the factory-holds-supply trust assumption, and dependency integrity, which carries the finding. No proof test was needed since nothing reached high or critical.","treeHash":null,"usage":{"cachedInputTokens":536308,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":14114,"runtime":"claude","turns":20,"wallClockMs":226478}},{"artifacts":[],"attempt":1,"bundleHash":"c08d1a772226325201ca6c4f5ce2beeecf67cde4513c59847822b4e94be28987","device":"1272a65455eb54ca","findings":[],"hash":"4176e633c5e71ec9664484dab3924a689520f9003e625fb388c48d279a64558b","nodeId":"d5257b4a-ce64-443e-a015-ffd93803cbc5","outcome":"completed","summary":"Implemented Bankers (BANKERS): 1,000,000,000 tokens with 18 decimals, minted once to the deployer. Dependencies are vendored, and deployment parameters and operational responsibilities are documented in README.md.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` — passed\n- `forge test` — 39 passed\n- `forge fmt --check` — passed\n\nA clean copy also passed offline with an empty environment. No deployment was performed.","treeHash":"e49c50b61ae146a3113db4101dd4a0915f98f9e3","usage":{"cachedInputTokens":446848,"inputTokens":62055,"model":"gpt-6-astra","outputTokens":15420,"runtime":"codex","turns":5,"wallClockMs":418527}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30bcdea6dcb9ee40","findings":[],"hash":"4b88858387a403195fc2756bebf0a0e8e81ba97606a0be6c617b9df5409adebe","nodeId":"6e5beb73-3ef9-4dec-8148-c8c4a5e214ca","outcome":"completed","summary":"The review is complete. The Bankers token has no defects in the Execution Trace, Periphery or First Principles areas, and the findings file records a clean result with full coverage.\n\n**What the token is.** A single contract that inherits the vendored OpenZeppelin v5.0.2 ERC20 and adds only a constant supply and a constructor mint to msg.sender. It has no owner, minter, hooks, fees, exemptions, receive or fallback.\n\n**What I verified.**\n- All three listed entry points were traced through the OpenZeppelin internals. Allowance is spent before the balance move, so a reverting transferFrom leaves allowance untouched. Zero sender, zero recipient and zero spender are rejected. The unlimited allowance is never decremented.\n- The constructor mints exactly 10^27 base units to the direct deployer, which is the factory under CREATE2, and not to the transaction origin.\n- The compiled ABI contains only the standard ERC-20 surface plus the supply constant. The deployed bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CREATE, CALL or ORIGIN opcodes.\n- The five vendored OpenZeppelin files are byte-identical to the upstream v5.0.2 tag and to the lock file. Six vendored forge-std files have lock-hash mismatches, but they are identical to the pinned v1.9.6 commit apart from formatter whitespace, and forge-std is test-only code.\n- The full project suite passed, including the invariant suite, with 39 tests and no failures.\n\n**What I could not reach.** The protected launch test depends on v4-core and launch library sources that this tree does not vendor, so it could not be executed here. It is marked unreached in the coverage record. The project's own tests cover the token-side equivalent of that flow.\n\n**Leads from static analysis.** The aderyn large-literal note points at the supply constant. Its value evaluates to 10^27 as the brief requires, so it is a style note and not a defect.\n\nThe findings file holds zero findings and ten coverage rows, one for each entry point plus invariant and periphery rows. No repository files were changed.","treeHash":null,"usage":{"cachedInputTokens":673531,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":11089,"runtime":"claude","turns":20,"wallClockMs":206694}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d2d5a117dd72f6b4","findings":[],"hash":"526ca576ec7b96de0be709d1d9fe49f3cbee308de598c7d4669d9ad48c5a473b","nodeId":"1effa053-34b2-4106-b333-8ac4b472928e","outcome":"completed","summary":"The review is complete. No defects were found in the Bankers token, and the findings file holds an empty findings list with nine coverage rows.\n\n**What was reviewed.** The token at `src/Bankers.sol` is OpenZeppelin 5.0.2 ERC-20 plus a constructor that mints the full supply to the deployer. I verified the vendored OpenZeppelin files against the lock file hashes, then checked the three entry points against the Senior Auditor's Mindset and the Economic Security, Invariant and Flow Gap guides.\n\n**Results by area.**\n- **Economic security.** No external dependencies, oracles, fee formulas or price logic exist. The zero address is rejected as sender, recipient and spender. Native ETH to the contract reverts.\n- **Invariants.** Total supply is fixed at 1e27. The only mint is in the constructor, and no public path reaches a burn. Sum of balances equals supply across the project's invariant suite and a wider scratch fuzz that included the token address and a code-bearing recipient.\n- **Flow gaps.** The 10%/88%/2% split, distributor claims, pool-manager settlement by direct transfer and router-style transferFrom all deliver exact amounts, down to 1 wei and full balances. A trader can buy and sell back to zero.\n\n**Checks run.** The project suite passed with 39 tests, including the 128-run invariant campaign. A scratch suite of five additional tests passed and was removed afterwards. The aderyn large-literal lead evaluates to exactly 1e27 and is a style note only.\n\n**One observation, not a finding.** Six vendored forge-std files in this checkout differ from the hashes in `dependencies.lock.json`. The lock matches upstream v1.9.6, so the difference is in this working copy, affects tests only, and does not touch deployable bytecode.\n\n**Trust assumptions.** The approve replace-allowance race is inherent to ERC-20 and documented in the README. There is no owner, pause, or admin power to document.","treeHash":null,"usage":{"cachedInputTokens":913547,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":10552,"runtime":"claude","turns":14,"wallClockMs":191182}},{"artifacts":[],"attempt":1,"bundleHash":"ef55c86bc065b0b76690f6ea4a800458a5ad9dbbda3ce08ed0843e554e30e559","device":"4d218e2d11a36af4","findings":[],"hash":"5d85ee2ca13464ac7f92c5298eee58ada57374faecf2bbc692cc442bb375a2a9","nodeId":"548ccda3-c0dd-40b0-a260-b274a6dc3e11","outcome":"completed","summary":"Created [launch.json](/home/ubuntu/.identitymd/work/99ed48ba-f9b9-4df5-a508-d39b86bb5871/548ccda3-c0dd-40b0-a260-b274a6dc3e11/launch.json) with Bankers’ exact supply, empty constructor arguments, and the required pool and economics values.\n\nManifest checks passed. `forge build` succeeded offline; `forge test` passed all 39 tests. Only `launch.json` is changed for submission.","treeHash":"833f24fa41676ed43c42254e33343edff52e3cbb","usage":{"cachedInputTokens":169600,"inputTokens":37614,"model":"gpt-6-astra","outputTokens":2114,"runtime":"codex","turns":3,"wallClockMs":90711}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5b9c505a673e1a8a","findings":[{"citation":"resolved","description":"The lock file and README state that every vendored file is unmodified and record a SHA-256 per file. All six OpenZeppelin files match their recorded hashes and the upstream v5.0.2 commit, so the deployed token's dependency chain is intact. Six forge-std files do not match: lib/forge-std/src/Vm.sol, console.sol, StdAssertions.sol, StdJson.sol, StdToml.sol and interfaces/IMulticall3.sol. The recorded hashes equal the upstream files at commit 3b20d60d14b343ee4f908cb8079495c07f5e8981; the local copies differ only by `forge fmt` line-wrapping (e.g. multi-line function signatures collapsed to one line in Vm.sol:770, console.sol:5-21). No semantic change, and these files are test-only and never deployed, so there is no impact on the token's math or launch. It is a provenance record that a verifier re-hashing the tree will flag as a mismatch; the author should either re-vendor the pristine upstream files or re-record the hashes after formatting.","line":107,"path":"dependencies.lock.json","reproduction":"From the repository root run: for each file F listed in dependencies.lock.json, compare `sha256sum F` with the recorded sha256. Expected: every line matches. Actual: lib/forge-std/src/Vm.sol hashes to 9ef7ee8c9a0a4fb18b830e85ce5cd31a56b97781e126ad1e7801389c49b0f408 while line 108 records 37cdc22402df6c218ca65502e7fa2a24a3ce5b796eaaee330ad84fb9578bc73c; console.sol, StdAssertions.sol, StdJson.sol, StdToml.sol and interfaces/IMulticall3.sol mismatch the same way. `diff <(curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/3b20d60d14b343ee4f908cb8079495c07f5e8981/src/Vm.sol) lib/forge-std/src/Vm.sol` shows only whitespace/line-wrap differences.","severity":"info","snippet":"        \"path\": \"lib/forge-std/src/Vm.sol\",\n        \"sha256\": \"37cdc22402df6c218ca65502e7fa2a24a3ce5b796eaaee330ad84fb9578bc73c\"","title":"dependencies.lock.json hashes do not match six vendored forge-std files (test-only, whitespace reflow)"}],"hash":"66c1385b5df745230ac7da3216732da14275014862acde1f0b2708c2904e849f","nodeId":"95a7c139-8aff-4a63-abc6-78361039141d","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. No math defects were found in the Bankers token.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides**\n\n- **Supply constant.** The literal on line 10 of `src/Bankers.sol` evaluates to exactly 1e27, which is the manifest supply. The aderyn large-literal lead is correct code, not a defect.\n- **Arithmetic paths.** The token adds nothing to OpenZeppelin v5.0.2. Every unchecked add or subtract in the inherited `_update` and `_spendAllowance` sits behind an explicit guard, and every balance is bounded by the fixed supply. I probed 0, 1 wei, exact balance, balance plus one, whole supply, max uint, max minus one allowance, and self transfers in a scratch test. All nine probes passed, and I then removed the scratch file.\n- **Launch split.** Ten, eighty-eight and two percent of 1e27 divide with no remainder and sum back to the supply exactly.\n- **Pool limits.** The supply is far below the int128 and uint128 limits Uniswap v4 uses, so no downcast saturates during the seed or a swap.\n- **Boundaries.** There are no external calls, no payable paths, no bytes decoding and no fee or rounding branch. The only sentinel branches are the zero-address reverts and the unlimited-allowance skip, both traced.\n- **Vendored code.** All six OpenZeppelin files match their recorded hashes and the pinned upstream commit.\n\n**One info-level finding.** Six forge-std files under `lib/` differ from the hashes in `dependencies.lock.json`. The diff against upstream is only `forge fmt` line-wrapping in test-only files, so there is no effect on the deployed token. I reported it because the lock file claims the files are unmodified, and a verifier re-hashing the tree will flag it.\n\n**Coverage.** All three entry points are recorded as `holds`, plus six invariant rows covering the constructor, launch split, pool limits, balance conservation, boundary surface and metadata. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":564417,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11081,"runtime":"claude","turns":19,"wallClockMs":190763}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8db4eebdd7bd2744","findings":[{"citation":"resolved","description":"README.md line 77 states that dependencies.lock.json 'records exact upstream commits, archive URLs, and SHA-256 hashes for every vendored file', and line 80 states lib/forge-std holds 'unmodified src/ files' from forge-std v1.9.6 (commit 3b20d60d14b343ee4f908cb8079495c07f5e8981). Recomputing sha256 over every path in the lock file shows 26 of 32 entries match and six do not: lib/forge-std/src/StdAssertions.sol (lock line 60), StdJson.sol (line 80), StdToml.sol (line 96), Vm.sol (line 108), console.sol (line 112) and interfaces/IMulticall3.sol (line 140). The recorded hashes are the hashes of the upstream files at the pinned commit (fetched from raw.githubusercontent.com and re-hashed: they equal the lock values), so the lock describes files that are not the ones in the tree. A diff of each vendored copy against upstream shows only line re-wrapping (forge fmt style, e.g. multi-line function signatures and the console.sol staticcall collapsed to one line); after collapsing whitespace the token streams are identical, so nothing changes semantically. All six OpenZeppelin files, including the ERC20.sol the token inherits, match both the lock hashes and upstream v5.0.2 byte for byte, so the deployed token's dependency chain is intact. Impact: a verifier or admission step that re-hashes the tree against the lock file gets a failed provenance check for the test harness, and the README's assurance that the assertion library (which decides whether every test here passes) is unmodified is not literally true. Test-only material; no effect on the token's bytecode or behaviour. Both specialists (audit_permissions as low, audit_math as info) reported the same root cause; kept once at low. Fix: re-vendor the six files byte-identical to upstream (restores the lock hashes and the README claim), or recompute the six hashes in dependencies.lock.json and drop the 'unmodified' wording from README.md line 80.","line":60,"path":"dependencies.lock.json","reproduction":"State: the committed tree at HEAD (5bf12ce), no changes. Input: from the repository root, for each entry in dependencies.lock.json run `sha256sum <path>` and compare with the recorded sha256 (equivalently: python3 -I -c 'import json,hashlib; [print(f[\"path\"], hashlib.sha256(open(f[\"path\"],\"rb\").read()).hexdigest()==f[\"sha256\"]) for d in json.load(open(\"dependencies.lock.json\")) for f in d[\"files\"]]'). Expected (per README line 77): every entry True. Actual: six False. `sha256sum lib/forge-std/src/StdAssertions.sol` = 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384 but line 60 records d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780; StdJson.sol actual 61bbf9b3219f3636d459e74799e642ee80a9e4d51ef66e793814a032ed97cb83 vs line 80 0211b47e...; StdToml.sol actual 187d2f0cc66b5ebac7da23dd9d68980149a8331bb2f1060128ce2e5091d66518 vs line 96 de3fb35a...; Vm.sol actual 9ef7ee8c9a0a4fb18b830e85ce5cd31a56b97781e126ad1e7801389c49b0f408 vs line 108 37cdc224...; console.sol actual a2e632dcbc787bb096e2c06bad26c6e5e09bafca18466b236b1f2687c2ad79e9 vs line 112 896c5a5a...; interfaces/IMulticall3.sol actual 1b63ca78b27d9893596a9e3667b4dbc32506100cd99a96e8dfff0ac96068053b vs line 140 6620d9c5.... Fetching https://raw.githubusercontent.com/foundry-rs/forge-std/3b20d60d14b343ee4f908cb8079495c07f5e8981/src/<file> for each of the six and hashing it reproduces the lock value exactly, and `diff` against the vendored copy shows whitespace/line-wrap changes only (e.g. console.sol lines 5-6 upstream `address constant CONSOLE_ADDRESS =\\n        0x0000...6c6f67;` vs vendored single line). The OpenZeppelin ERC20.sol at the same pinned commit diffs with zero lines against lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol.","severity":"low","snippet":"        \"sha256\": \"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780\"","title":"dependencies.lock.json records SHA-256 hashes that do not match six vendored forge-std files; README's 'unmodified' and 'SHA-256 for every vendored file' provenance claims are false for them (merged f"}],"hash":"71ee430cfa1dc3674ae24b9e3aa685d6eac6cfbe4a4fc4405a39882c069b6c95","nodeId":"c6b5f4d7-ff4e-4e43-b098-fe750fdab735","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. Nothing in the tracked tree was changed. The findings file is ignored by git, so the working tree stays clean.\n\n**Outcome: one low finding kept, everything else holds.**\n\n- **Kept, merged, reproduced:** both audit_permissions and audit_math reported the same root cause, so they are one finding at low. Six vendored forge-std files hash differently from what `dependencies.lock.json` records. I recomputed every hash in the lock, fetched the six upstream files at the pinned commit, and confirmed the lock values are the upstream hashes while the vendored copies differ only by line re-wrapping. The OpenZeppelin ERC20 the token inherits is byte-identical to upstream, so the deployed code is unaffected. This is a provenance defect in test-only material, which is why it stays low rather than info.\n- **Dropped:** nothing else was reported by the specialists. The aderyn large-literal lead is the supply constant, which equals the manifest's total supply exactly, so it is not a defect.\n\n**My own pass found no defects.** The token is a bare OpenZeppelin v5.0.2 ERC20 with a constant supply minted to the deployer. All three entry points trace cleanly through the standard checks and revert paths. The compiled ABI exposes no mint, burn, owner, pause or blacklist. Creation and runtime bytecode are well under the size limits, and a PUSH-aware scan found no DELEGATECALL, CALLCODE or SELFDESTRUCT. The manifest uses only schema keys, with no constructor arguments matching the no-argument constructor, lowercase addresses, and a supply of 10^27 matching the code.\n\n**Checks run:**\n\n| Check | Result |\n| --- | --- |\n| forge build, solc 0.8.26 | success |\n| forge test | 54 passed, 0 failed |\n| Lock file hashes | 26 of 32 match |\n\nThe protected launch test could not be run here because it imports v4-core and launch libraries this repository does not vendor. I verified each of its assertions by tracing instead: exact-amount transfers for the factory, distributor and pool-manager flows, no supply growth, no privileged freeze or seizure, and clean opcodes.\n\nThe coverage record answers all three listed entry points as holds, plus three invariant rows for the constructor and supply, deployability and manifest, and the project test suites.","treeHash":null,"usage":{"cachedInputTokens":734092,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":10526,"runtime":"claude","turns":14,"wallClockMs":224796}},{"artifacts":[],"attempt":1,"bundleHash":"ab1e09235d2006a245ea542dcc625604ed7e3cf9ad1f83566f15ac51efe0e518","device":"fef70a876212b4f0","findings":[],"hash":"82e1a1c64e21e786cf44bdc5c8f02e929e72b07a6ee1513a2bc56849aa39a43d","nodeId":"324187bd-ec8b-411b-a3c0-bd7b3bf63255","outcome":"completed","summary":"Added 15 boundary, failure-path, and fuzz tests; strengthened four stateful invariants with independent balance and allowance tracking.\n\n`forge build` and `forge test` passed offline: 54 tests, including 32,768 invariant handler calls. No confirmed defects found. Changes are confined to `test/`.","treeHash":"04e829014f7089c7b49356c7bd39b0ec3de79b0c","usage":{"cachedInputTokens":842240,"inputTokens":73806,"model":"gpt-6-astra","outputTokens":12209,"runtime":"codex","turns":6,"wallClockMs":357888}}],"verification":[{"checks":[{"durationMs":1103,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.02s\nCompiler run successful!\n","passed":true},{"durationMs":738,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/Bankers.t.sol:BankersTest\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 512, μ: 55251, ~: 55004)\nLogs:\n  Bound result 11000000000000000000\n\n[PASS] testFuzz_TransferAboveBalanceAlwaysReverts(uint256) (runs: 512, μ: 59274, ~: 59602)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039468584007913129639935\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 93217, ~: 93318)\nLogs:\n  Bound result 244\n\n[PASS] testFuzz_TransferFromAboveAllowanceIsAtomic(uint256,uint256) (runs: 512, μ: 123463, ~: 124015)\nLogs:\n  Bound result 40000000000000000000\n  Bound result 8800\n\n[PASS] testFuzz_TransferFromHonorsAllowance(uint256,uint256) (runs: 512, μ: 161734, ~: 163666)\nLogs:\n  Bound result 117693335129210036841\n\n[PASS] test_ApprovalCanReplaceExistingAllowance() (gas: 90243)\n[PASS] test_ApproveEmitsEventWithoutMovingTokens() (gas: 88809)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 62422)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 9841)\n[PASS] test_ContractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 298012)\n[PASS] test_DeployerCannotSpendHoldersTokensWithoutApproval() (gas: 95367)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 214758)\n[PASS] test_InsufficientBalanceRevertsAllowanceSpend() (gas: 189269)\n[PASS] test_LaunchTransfersClaimsAndPoolRoundTripArriveWhole() (gas: 658406)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 108584)\n[PASS] test_NoAdministrativeMintBurnFreezeOrUpgradeEntryPoints() (gas: 1640753)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 64681)\n[PASS] test_RevokedApprovalCannotBeSpent() (gas: 144273)\n[PASS] test_RuntimeFitsDeploymentLimitAndHasNoForbiddenOpcodes() (gas: 2510968)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51451)\n[PASS] test_SelfTransferStillRequiresEnoughBalance() (gas: 43143)\n[PASS] test_SpenderCannotUseAnotherOwnersApproval() (gas: 159755)\n[PASS] test_SpenderCannotUseAnotherSpendersApproval() (gas: 105618)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93539)\n[PASS] test_TransferEntireBalance() (gas: 161809)\n[PASS] test_TransferFromCanConsumeExactAllowance() (gas: 167750)\n[PASS] test_TransferFromMovesExactAmountAndSpendsAllowance() (gas: 229889)\n[PASS] test_TransferFromOwnBalanceStillRequiresAllowance() (gas: 36018)\n[PASS] test_TransferFromRejectsInsufficientAllowance() (gas: 116169)\n[PASS] test_TransferFromRejectsZeroSourceEvenForZeroAmount() (gas: 55365)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103305)\n[PASS] test_TransferFromZeroRecipientRevertsAllowanceSpend() (gas: 114360)\n[PASS] test_TransferRejectsInsufficientBalanceWithoutStateChanges() (gas: 120486)\n[PASS] test_TransferRejectsZeroRecipient() (gas: 47860)\n[PASS] test_TransferToContractDoesNotCallRecipient() (gas: 171920)\n[PASS] test_ZeroTransferAlsoRejectsZeroRecipient() (gas: 30576)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73482)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81559)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 15.42ms (94.69ms CPU time)\n\nRan 1 test for test/Bankers.invariant.t.sol:BankersInvariantTest\n[PASS]\nBankersInvariantTest invariants:\n[PASS] invariant_BalancesConserveEntireSupply\n[PASS] invariant_TotalSupplyNeverChanges\n BankersInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| BankersHandler | approve      | 2693  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| BankersHandler | transfer     | 2762  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| BankersHandler | transferFrom | 2737  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4021471580123811012216\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3996\n  Bound result 5375\n  Bound result 6041\n  Bound result 29465379163546141726\n  Bound result 0\n  Bound result 6145\n  Bound result 1120\n  Bound result 3000000000000000000\n  Bound result 9\n  Bound result 3\n  Bound result 100000000000000000000\n  Bound result 40\n  Bound result 4648\n  Bound result 1160\n  Bound result 1000000000\n  Bound result 77725016272583290488556659\n  Bound result 149579308414839053693559371\n  Bound result 29\n  Bound result 3535\n  Bound result 8800\n  Bound result 15\n  Bound result 1\n  Bound result 1069\n  Bound result 1000\n  Bound result 370\n  Bound result 123000000000000000000\n  Bound result 1572\n  Bound result 2614\n  Bound result 9999999999999999991\n  Bound result 10000000000000000000\n  Bound result 11\n  Bound result 6\n  Bound result 4009\n  Bound result 0\n  Bound result 7\n  Bound result 8\n  Bound result 1506\n  Bound result 18\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 660.81ms (659.22ms CPU time)\n\nRan 2 test suites in 661.87ms (676.23ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":27,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Bankers.approve(address,uint256)\",\"Bankers.transfer(address,uint256)\",\"Bankers.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":82,\"dependencies.lock.json\":148,\"foundry.toml\":21,\"remappings.txt\":2,\"src/Bankers.sol\":16,\"test/Bankers.invariant.t.sol\":91,\"test/Bankers.t.sol\":473},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":366,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":179,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Bankers.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4176e633c5e71ec9664484dab3924a689520f9003e625fb388c48d279a64558b","verifiedTreeHash":"e49c50b61ae146a3113db4101dd4a0915f98f9e3","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":1134,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.04s\nCompiler run successful!\n","passed":true},{"durationMs":690,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/Bankers.t.sol:BankersTest\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 512, μ: 55255, ~: 55004)\nLogs:\n  Bound result 275321978845288774462610993\n\n[PASS] testFuzz_TransferAboveBalanceAlwaysReverts(uint256) (runs: 512, μ: 59280, ~: 59602)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039477584007913129639935\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 93219, ~: 93318)\nLogs:\n  Bound result 791792135176609055935909039\n\n[PASS] testFuzz_TransferFromAboveAllowanceIsAtomic(uint256,uint256) (runs: 512, μ: 123298, ~: 123414)\nLogs:\n  Bound result 134001353957597813472628008\n  Bound result 780900331983611575638225954\n\n[PASS] testFuzz_TransferFromHonorsAllowance(uint256,uint256) (runs: 512, μ: 161612, ~: 163666)\nLogs:\n  Bound result 1849267925230313280634\n\n[PASS] test_ApprovalCanReplaceExistingAllowance() (gas: 90243)\n[PASS] test_ApproveEmitsEventWithoutMovingTokens() (gas: 88809)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 62422)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 9841)\n[PASS] test_ContractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 298012)\n[PASS] test_DeployerCannotSpendHoldersTokensWithoutApproval() (gas: 95367)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 214758)\n[PASS] test_InsufficientBalanceRevertsAllowanceSpend() (gas: 189269)\n[PASS] test_LaunchTransfersClaimsAndPoolRoundTripArriveWhole() (gas: 658406)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 108584)\n[PASS] test_NoAdministrativeMintBurnFreezeOrUpgradeEntryPoints() (gas: 1640753)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 64681)\n[PASS] test_RevokedApprovalCannotBeSpent() (gas: 144273)\n[PASS] test_RuntimeFitsDeploymentLimitAndHasNoForbiddenOpcodes() (gas: 2510968)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51451)\n[PASS] test_SelfTransferStillRequiresEnoughBalance() (gas: 43143)\n[PASS] test_SpenderCannotUseAnotherOwnersApproval() (gas: 159755)\n[PASS] test_SpenderCannotUseAnotherSpendersApproval() (gas: 105618)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93539)\n[PASS] test_TransferEntireBalance() (gas: 161809)\n[PASS] test_TransferFromCanConsumeExactAllowance() (gas: 167750)\n[PASS] test_TransferFromMovesExactAmountAndSpendsAllowance() (gas: 229889)\n[PASS] test_TransferFromOwnBalanceStillRequiresAllowance() (gas: 36018)\n[PASS] test_TransferFromRejectsInsufficientAllowance() (gas: 116169)\n[PASS] test_TransferFromRejectsZeroSourceEvenForZeroAmount() (gas: 55365)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103305)\n[PASS] test_TransferFromZeroRecipientRevertsAllowanceSpend() (gas: 114360)\n[PASS] test_TransferRejectsInsufficientBalanceWithoutStateChanges() (gas: 120486)\n[PASS] test_TransferRejectsZeroRecipient() (gas: 47860)\n[PASS] test_TransferToContractDoesNotCallRecipient() (gas: 171920)\n[PASS] test_ZeroTransferAlsoRejectsZeroRecipient() (gas: 30576)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73482)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81559)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 15.95ms (93.17ms CPU time)\n\nRan 1 test for test/Bankers.invariant.t.sol:BankersInvariantTest\n[PASS]\nBankersInvariantTest invariants:\n[PASS] invariant_BalancesConserveEntireSupply\n[PASS] invariant_TotalSupplyNeverChanges\n BankersInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| BankersHandler | approve      | 2798  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| BankersHandler | transfer     | 2686  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| BankersHandler | transferFrom | 2708  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4575\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 13\n  Bound result 81878214010587391956809342\n  Bound result 10000\n  Bound result 384\n  Bound result 200\n  Bound result 14\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 127\n  Bound result 101089594353703294039645282\n  Bound result 7\n  Bound result 329\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 593\n  Bound result 146565602614768137473738870\n  Bound result 0\n  Bound result 255\n  Bound result 2\n  Bound result 10000000000000000000\n  Bound result 720\n  Bound result 0\n  Bound result 5439\n  Bound result 244\n  Bound result 244\n  Bound result 40000000000000000000\n  Bound result 9\n  Bound result 17\n  Bound result 1672\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 618.37ms (617.08ms CPU time)\n\nRan 2 test suites in 619.70ms (634.31ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Bankers.approve(address,uint256)\",\"Bankers.transfer(address,uint256)\",\"Bankers.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":82,\"dependencies.lock.json\":148,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/Bankers.sol\":16,\"test/Bankers.invariant.t.sol\":91,\"test/Bankers.t.sol\":473},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5d85ee2ca13464ac7f92c5298eee58ada57374faecf2bbc692cc442bb375a2a9","verifiedTreeHash":"833f24fa41676ed43c42254e33343edff52e3cbb","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":1657,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.53s\nCompiler run successful!\n","passed":true},{"durationMs":13064,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/Bankers.t.sol:BankersTest\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 512, μ: 55279, ~: 55004)\nLogs:\n  Bound result 14\n\n[PASS] testFuzz_TransferAboveBalanceAlwaysReverts(uint256) (runs: 512, μ: 59252, ~: 59602)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639949\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 92848, ~: 93306)\nLogs:\n  Bound result 13865\n\n[PASS] testFuzz_TransferFromAboveAllowanceIsAtomic(uint256,uint256) (runs: 512, μ: 123613, ~: 124032)\nLogs:\n  Bound result 17488\n  Bound result 255\n\n[PASS] testFuzz_TransferFromHonorsAllowance(uint256,uint256) (runs: 512, μ: 162023, ~: 163666)\nLogs:\n  Bound result 1\n\n[PASS] test_ApprovalCanReplaceExistingAllowance() (gas: 90243)\n[PASS] test_ApproveEmitsEventWithoutMovingTokens() (gas: 88809)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 62422)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 9841)\n[PASS] test_ContractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 298012)\n[PASS] test_DeployerCannotSpendHoldersTokensWithoutApproval() (gas: 95367)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 214758)\n[PASS] test_InsufficientBalanceRevertsAllowanceSpend() (gas: 189269)\n[PASS] test_LaunchTransfersClaimsAndPoolRoundTripArriveWhole() (gas: 658406)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 108584)\n[PASS] test_NoAdministrativeMintBurnFreezeOrUpgradeEntryPoints() (gas: 1640753)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 64681)\n[PASS] test_RevokedApprovalCannotBeSpent() (gas: 144273)\n[PASS] test_RuntimeFitsDeploymentLimitAndHasNoForbiddenOpcodes() (gas: 2510968)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51451)\n[PASS] test_SelfTransferStillRequiresEnoughBalance() (gas: 43143)\n[PASS] test_SpenderCannotUseAnotherOwnersApproval() (gas: 159755)\n[PASS] test_SpenderCannotUseAnotherSpendersApproval() (gas: 105618)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93539)\n[PASS] test_TransferEntireBalance() (gas: 161809)\n[PASS] test_TransferFromCanConsumeExactAllowance() (gas: 167750)\n[PASS] test_TransferFromMovesExactAmountAndSpendsAllowance() (gas: 229889)\n[PASS] test_TransferFromOwnBalanceStillRequiresAllowance() (gas: 36018)\n[PASS] test_TransferFromRejectsInsufficientAllowance() (gas: 116169)\n[PASS] test_TransferFromRejectsZeroSourceEvenForZeroAmount() (gas: 55365)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103305)\n[PASS] test_TransferFromZeroRecipientRevertsAllowanceSpend() (gas: 114360)\n[PASS] test_TransferRejectsInsufficientBalanceWithoutStateChanges() (gas: 120486)\n[PASS] test_TransferRejectsZeroRecipient() (gas: 47860)\n[PASS] test_TransferToContractDoesNotCallRecipient() (gas: 171920)\n[PASS] test_ZeroTransferAlsoRejectsZeroRecipient() (gas: 30576)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73482)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81559)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 71.13ms (328.40ms CPU time)\n\nRan 15 tests for test/Bankers.edge.t.sol:BankersEdgeTest\n[PASS] testFuzz_DelegatedRoundTripReturnsTokensWithoutRestoringAllowance(uint256) (runs: 1000, μ: 238103, ~: 238286)\nLogs:\n  Bound result 3327641369\n\n[PASS] testFuzz_DelegatedSelfTransferSpendsApprovalWithoutCreatingTokens(uint256,uint256) (runs: 1000, μ: 229667, ~: 229681)\nLogs:\n  Bound result 40000000000000000000\n  Bound result 1\n\n[PASS] testFuzz_FailedSpendCanBeRetriedWithoutReapproval(uint256,uint256) (runs: 1000, μ: 335991, ~: 336303)\nLogs:\n  Bound result 999999999999999999999999999\n  Bound result 1000000000000000000000000000\n\n[PASS] testFuzz_ReapprovalReplacesRemainderAndPreservesOtherSpenders(uint256,uint256,uint256) (runs: 1000, μ: 282950, ~: 284197)\nLogs:\n  Bound result 22570\n  Bound result 5281\n\n[PASS] testFuzz_SplitTransfersMatchSingleTransfer(uint256,uint256) (runs: 1000, μ: 220234, ~: 221241)\nLogs:\n  Bound result 4837\n  Bound result 2001\n\n[PASS] test_ApprovalFromEmptyOwnerRemainsUsableAfterFunding() (gas: 262699)\n[PASS] test_DelegatedFullSupplyTransferExhaustsBalanceAndAllowance() (gas: 371312)\n[PASS] test_DirectAndSelfTransfersDoNotConsumeOrCopyApprovals() (gas: 213653)\n[PASS] test_InfiniteApprovalCanBeReducedThenRevoked() (gas: 372238)\n[PASS] test_MaximumFiniteAllowanceIsNotTreatedAsInfinite() (gas: 240491)\n[PASS] test_MaximumTransferAmountCannotOverflowBalancesOrSpendAllowance() (gas: 157364)\n[PASS] test_SelfApprovalAllowsTransferFromButIsStillConsumed() (gas: 167624)\n[PASS] test_SelfTransferFromWithInfiniteApprovalStillRequiresBalance() (gas: 235180)\n[PASS] test_ZeroRecipientRejectionDoesNotDestroyInfiniteApproval() (gas: 150250)\n[PASS] test_ZeroTransferFromDoesNotChangeFiniteOrInfiniteAllowance() (gas: 358784)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 72.21ms (354.95ms CPU time)\n\nRan 1 test for test/Bankers.invariant.t.sol:BankersInvariantTest\n[PASS]\nBankersInvariantTest invariants:\n[PASS] invariant_AllAllowancesMatchOwnerInstructions\n[PASS] invariant_BalancesConserveEntireSupply\n[PASS] invariant_EachBalanceMatchesTransferHistory\n[PASS] invariant_TotalSupplyNeverChanges\n BankersInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------+-------------------------------+-------+---------+----------╮\n| Contract       | Selector                      | Calls | Reverts | Discards |\n+=============================================================================+\n| BankersHandler | approve                       | 2983  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | approveBoundary               | 2909  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | rejectOverAllowance           | 3010  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | rejectOverBalance             | 2922  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | rejectTransferFromOverBalance | 3003  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | rejectZeroRecipient           | 2975  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | rejectZeroSpender             | 3011  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | roundTrip                     | 2941  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | transfer                      | 3011  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | transferAll                   | 3027  | 0       | 0        |\n|----------------+-------------------------------+-------+---------+----------|\n| BankersHandler | transferFrom                  | 2976  | 0       | 0        |\n╰----------------+-------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 250000000000000000000000000\n  Bound result 4594636\n  Bound result 242\n  Bound result 250000000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 304188916509980472920778543\n  Bound result 9512\n  Bound result 9512\n  Bound result 485\n  Bound result 485\n  Bound result 485\n  Bound result 245\n  Bound result 8938\n  Bound result 8938\n  Bound result 8938\n  Bound result 9259\n  Bound result 9\n  Bound result 0\n  Bound result 0\n  Bound result 253\n  Bound result 7197\n  Bound result 0\n  Bound result 7383\n  Bound result 7636\n  Bound result 499999999999999999999992364\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7850\n  Bound result 3858947845\n  Bound result 115792089237316195423570985008687907853269984665639564039457584009707538755577\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 60000000000000000000\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 8487\n  Bound result 13351692299743503773932303443705485878850472699478102778\n  Bound result 97294470478169629239916489240692956361389528971431660717133463\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6975\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639945\n  Bound result 3426098191349735572264568118906624437756011825869301964749589671015765186569\n  Bound result 999999999999999999999999999\n  Bound result 0\n  Bound result 0\n  Bound result 9215377907975616011121716844095393372903028567971910981589148894671981\n  Bound result 7876\n  Bound result 0\n  Bound result 0\n  Bound result 11000000000000000000\n  Bound result 11000000000000000000\n  Bound result 11000000000000000000\n  Bound result 0\n  Bound result 1\n  Bound result 6537147587016486081965656086278829792096408814227980425623613855\n  Bound result 0\n  Bound result 0\n  Bound result 21822338279\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10000\n  Bound result 6000000000000000000\n  Bound result 0\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 158\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 14\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129648934\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1000000000000000000000000000\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.97s (12.96s CPU time)\n\nRan 3 test suites in 12.97s (13.11s CPU time): 54 tests passed, 0 failed, 0 skipped (54 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Bankers.approve(address,uint256)\",\"Bankers.transfer(address,uint256)\",\"Bankers.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":82,\"dependencies.lock.json\":148,\"foundry.toml\":21,\"remappings.txt\":2,\"src/Bankers.sol\":16,\"test/Bankers.edge.t.sol\":284,\"test/Bankers.invariant.t.sol\":233,\"test/Bankers.t.sol\":473},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"82e1a1c64e21e786cf44bdc5c8f02e929e72b07a6ee1513a2bc56849aa39a43d","verifiedTreeHash":"04e829014f7089c7b49356c7bd39b0ec3de79b0c","verifierVersion":"0.1.0+327e1e9f"}]}