{"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":"f6bc6667-08db-4622-b3de-f14c7c2dde84","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"3b773c12fa6737041b02c5addfa206e2e89965fd5fb595935f41bb325ce18d0b","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":"1112222b949885342fcc33a480198046f07d366c95ce43e727fa82994304e36f","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":"4bdbfc1c00a4e07e52568d67b081c15420f3ec58c04d5b08f9e9b0cd14782ba8","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":"7dccbb57250ca83a678d0bf25e79d49182562b71ebfeee4d7a22953bcec03e08","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":"227789ec928cb549ab9341fd078973ddc7d11c7b593d0767cfdc9b3b69038ed1","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":"02f61ff9da5db4fe17b76f38d62607291aa7ae61353a72fa6550b30ae79cc993","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"d501ac1c199b9d0ee8c5fe6b8104fd9fbf87b22e8d5f4a9b0749397f0fb39f2d","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"d37b45a8177da26f23a4f2e7d7f1da0f21f976ce4a5dff61ecfff2259185279c","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":"A custom token: robobet (ROBOBET).\nToken name: robobet\nToken symbol: ROBOBET\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: Put your fate in the hands of SUPERINTELLIGENCE\nrobobet.fun","parentJobId":null,"planHash":"3a080e410c77609a9f55da5e996a3070025d9a1f424ab416cc3333656734e993","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f6bc6667-08db-4622-b3de-f14c7c2dde84","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2029-robobet"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51041","feedbackHash":"03487798d91679ba0a534a1b50f310ce32e64a6a3d05ec6d8326add1cd8177c1","nodeKey":"audit_economics","submissionHash":"3b773c12fa6737041b02c5addfa206e2e89965fd5fb595935f41bb325ce18d0b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51166","feedbackHash":"2722dedc4dcbeaf6ff7a71175d242b25307ceff3d469954d87d11ec356b97d6b","nodeKey":"audit_flow","submissionHash":"1112222b949885342fcc33a480198046f07d366c95ce43e727fa82994304e36f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51101","feedbackHash":"b7ee9432c362ee7e6778b40a994f38825ed51892ca4b78abe52f6aacac2efa46","nodeKey":"audit_judge","submissionHash":"4bdbfc1c00a4e07e52568d67b081c15420f3ec58c04d5b08f9e9b0cd14782ba8","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52253","feedbackHash":"e02bcbf37742d8986dd73cdd048524bc5ffbb96507c3955a06f5a9bcf881c65a","nodeKey":"audit_math","submissionHash":"7dccbb57250ca83a678d0bf25e79d49182562b71ebfeee4d7a22953bcec03e08","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52665","feedbackHash":"9b98154d4c1db4d83e19969385471da17b0b1c3cda4e06ed85845a14893c9354","nodeKey":"audit_permissions","submissionHash":"227789ec928cb549ab9341fd078973ddc7d11c7b593d0767cfdc9b3b69038ed1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52086","feedbackHash":"d0975aff5812f3b1eb35058a3f59ede09d21182ec3e16d423c27ccafc4cf5ac2","nodeKey":"build_contract_project","submissionHash":"02f61ff9da5db4fe17b76f38d62607291aa7ae61353a72fa6550b30ae79cc993","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52149","feedbackHash":"a8af323aa151a871fe172c3f97573b5465b8c12c55df7f7b27a4fa76f618da13","nodeKey":"manifest","submissionHash":"d501ac1c199b9d0ee8c5fe6b8104fd9fbf87b22e8d5f4a9b0749397f0fb39f2d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"53943","feedbackHash":"1c7b5c9423dbaa6203fbbcc9f6189fcf97d2d8fda2b6692cb78c316abbddeb83","nodeKey":"write_foundry_tests","submissionHash":"d37b45a8177da26f23a4f2e7d7f1da0f21f976ce4a5dff61ecfff2259185279c","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"421e3dc364ab54091b182b46f38815c51865f322af7a3d94f23463bf1a70ebce","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"a6ff2527ccca07db8414d41e3a643f99de61cb24dd46d767dd2958942c223ebd","device":"38c0c4e8e4438177","findings":[],"hash":"02f61ff9da5db4fe17b76f38d62607291aa7ae61353a72fa6550b30ae79cc993","nodeId":"f93ea4fc-29f0-4dd8-a4ad-f65191e1d5a2","outcome":"completed","summary":"Implemented robobet (ROBOBET) with 18 decimals and exactly 1,000,000,000 tokens minted once to the deployer. No later minting or administrative controls.\n\nDependencies are vendored for offline builds. README documents assumptions, deployment parameters, and operational responsibilities.\n\nVerified successfully:\n\n- `forge build`\n- Forced offline build\n- `forge test`: 34 passing with the supplied fuzz seed\n- `forge fmt --check`","treeHash":"a66e22c2d266a70c76f8ea02cc2d757e2023a36d","usage":{"cachedInputTokens":615808,"inputTokens":66637,"model":"gpt-6-astra","outputTokens":15587,"runtime":"codex","turns":6,"wallClockMs":345743}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"45aa937328087de3","findings":[{"citation":"resolved","description":"DEPENDENCIES.md line 4 states the vendored libraries 'are pinned to the following upstream commits and are unchanged from those commits', and dependencies.lock.json records 'the SHA-256 digest of every included file' so a reviewer can verify that claim without network access. For forge-std v1.9.7 (commit 77041d2c) seven files in lib/forge-std/src do not hash to the recorded digests: StdAssertions.sol (lock line 26), StdJson.sol (32), StdToml.sol (36), Vm.sol (39), console.sol (40), interfaces/IERC7540.sol (48) and interfaces/IMulticall3.sol (50). I fetched each file from the pinned upstream commit: the lockfile digests are the genuine upstream digests, and the files in the tree are what differ. The difference is function-signature line reflow only (the files are byte-identical to upstream once all whitespace is stripped), so this is a formatter pass over lib/ after the lockfile was written, not a semantic change, and forge-std is imported only from test/ and is absent from the deployed RobobetToken bytecode. All six OpenZeppelin files match both the lockfile and upstream v5.0.2 byte for byte, so the periphery the token actually depends on is intact. The defect is that the project's own supply-chain evidence is wrong: anyone who follows DEPENDENCIES.md and checks the digests gets seven failures and cannot distinguish this benign reformat from a tampered test library without doing the upstream comparison themselves. Fix: either restore the seven files to their exact upstream bytes (so the recorded digests hold), or regenerate the lockfile digests from the tree and drop the 'unchanged from those commits' wording, and add a test or CI step that recomputes the digests so the record cannot drift again.","line":26,"path":"dependencies.lock.json","reproduction":"From the repository root, with no network: `python3 -I -c \"import json,hashlib; l=json.load(open('dependencies.lock.json')); print([f for d,v in l.items() for f,h in v['sha256'].items() if hashlib.sha256(open(d+'/'+f,'rb').read()).hexdigest()!=h])\"`. Expected (per DEPENDENCIES.md and the lockfile's purpose): an empty list. Actual: ['src/StdAssertions.sol', 'src/StdJson.sol', 'src/StdToml.sol', 'src/Vm.sol', 'src/console.sol', 'src/interfaces/IERC7540.sol', 'src/interfaces/IMulticall3.sol']. Concretely, `sha256sum lib/forge-std/src/StdAssertions.sol` prints 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384 while dependencies.lock.json line 26 records d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780, and `sha256sum lib/forge-std/src/Vm.sol` prints a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 against the recorded 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1. Fetching https://raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/src/StdAssertions.sol and hashing it reproduces the lockfile value, confirming the tree, not the lockfile, drifted.","severity":"low","snippet":"      \"src/StdAssertions.sol\": \"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780\",","title":"dependencies.lock.json digests do not match seven vendored forge-std files; the 'unchanged from upstream' integrity claim is false"}],"hash":"1112222b949885342fcc33a480198046f07d366c95ce43e727fa82994304e36f","nodeId":"226dc4e0-e114-41ca-a16d-ec43d7dd0099","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No tracked files were changed.\n\n**Result: the token holds under all three assigned guides. One low-severity defect, in the dependency integrity record.**\n\nThe contract at `src/RobobetToken.sol` is a 17-line OpenZeppelin ERC20 with a single constructor mint. I traced each of the three listed entry points from call to final state through the vendored ERC20 and found no execution-flow, periphery, or first-principles defect:\n\n- **approve**: overwrites the allowance, rejects a zero spender, touches no other state.\n- **transfer**: exact-amount delivery, zero recipient and insufficient balance revert atomically, no hooks, fees, or external calls, so factory, distributor, and pool flows arrive whole.\n- **transferFrom**: allowance checked before balance, infinite allowance not decremented, any later revert rolls back the allowance write, and the deployer cannot move a holder's balance without approval.\n- **constructor**: mints exactly 10^27 base units once to the immediate deployer, with no owner, role, initializer, or external call. The compiled ABI exposes only these three state-changing functions plus views, and the runtime contains no DELEGATECALL, CALLCODE, or SELFDESTRUCT.\n\nBuild and the full suite of 34 tests pass with the README's fuzz seed, including the stateful supply-conservation invariant. The six vendored OpenZeppelin files match both the lockfile and upstream v5.0.2 byte for byte.\n\n**The one finding (low):** seven forge-std files under `lib/forge-std/src` do not hash to the digests in `dependencies.lock.json`, even though DEPENDENCIES.md says the libraries are unchanged from their pinned commits. I fetched the pinned upstream files to settle which side drifted. The lockfile digests are the genuine upstream values, and the tree's files differ only by formatter line reflow, with content identical once whitespace is stripped. Forge-std is test-only and absent from deployed bytecode, so there is no runtime impact. The defect is that the project's own supply-chain evidence fails verification, and a reader cannot tell this benign reformat from tampering without repeating the upstream comparison. The finding includes an offline one-line reproduction and the exact mismatched digests. The suggested fix is to restore the exact upstream bytes or regenerate the digests, and add a check that recomputes them.\n\nThe coverage record has seven rows: the three listed entry points and the constructor hold, the fixed-supply invariant holds, the OpenZeppelin periphery holds, and the forge-std integrity record points to finding 1. Nothing in the assigned area was left unreached. Both static-analysis leads were reviewed: Slither reported nothing, and the aderyn \"large numeric literal\" note is the supply constant, which is correct and intentional.","treeHash":null,"usage":{"cachedInputTokens":807870,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":12999,"runtime":"claude","turns":27,"wallClockMs":222954}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0ef0cddb99617930","findings":[{"citation":"resolved","description":"DEPENDENCIES.md states the vendored dependencies 'are unchanged from those commits' and that dependencies.lock.json 'records ... the SHA-256 digest of every included file'. Hashing the tree shows that all 6 OpenZeppelin files match both the lock file and upstream v5.0.2 (dbb6104c) byte for byte, but 7 of the 30 forge-std files do not match the lock: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. Comparing each against upstream forge-std 77041d2c shows the differences are line-wrapping only (every file is identical once whitespace is stripped), so the test library is not semantically altered and the deployed token bytecode is unaffected (forge-std is imported only from test/). This is an integrity-record inaccuracy, not a contract defect, and is outside the Access Control / Trust Gap / Asymmetry area; it is recorded so the author can either restore the upstream bytes or regenerate the lock digests so the provenance claim is verifiable.","line":26,"path":"dependencies.lock.json","reproduction":"In the repository root run: sha256sum lib/forge-std/src/StdAssertions.sol -> 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384. Expected (dependencies.lock.json line 26): d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780. Same mismatch for the other six files listed. Download https://codeload.github.com/foundry-rs/forge-std/tar.gz/77041d2ce690e692d6e03cc812b57d1ddaa4d505 and `diff` each file: only line-wrapping differs; `tr -d ' \\n\\t'` on both sides gives identical digests. The lock digest d4c89eec... matches neither the tree nor upstream as hashed here, so the lock was generated from a third formatting of the files.","severity":"info","snippet":"      \"src/StdAssertions.sol\": \"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780\",","title":"dependencies.lock.json records SHA-256 digests that do not match seven vendored forge-std files (whitespace-only reformatting; test dependency, not deployed)"}],"hash":"227789ec928cb549ab9341fd078973ddc7d11c7b593d0767cfdc9b3b69038ed1","nodeId":"f1c32dfa-30a6-4750-b436-3767aa960253","outcome":"completed","summary":"The review is complete and the record is written to `.imd-findings.json`. The tree is otherwise untouched.\n\n**Outcome: no permission, trust-gap or asymmetry defects in the token.** The contract in `src/RobobetToken.sol` is a 17-line wrapper over the vendored OpenZeppelin v5.0.2 ERC20. It mints exactly 10^27 base units to the constructor caller and adds nothing else. The compiled ABI exposes only the standard ERC-20 surface plus a supply constant view. There is no owner, role, initializer, forwarder, proxy, pause, blacklist, mint or burn path, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n\nWhat I verified for the three entry points:\n\n- **approve** writes only the caller's own allowance row, rejects a zero spender, and has no admin variant.\n- **transfer** moves exactly the stated amount with no fee, burn or hook branch, so every launch flow arrives whole.\n- **transferFrom** spends the caller's allowance exactly, never decrements an infinite allowance, and rolls back atomically on any failure.\n- **Access from the factory position.** From a CREATE2 factory probe holding the remaining supply, 14 common privileged signatures all revert and a pull from a holder without approval fails. Appending a holder's address to calldata does not spoof the sender.\n\nEvidence gathered: the project's 34 tests pass under the documented seed, `forge fmt --check` is clean, and the six vendored OpenZeppelin files hash identically to upstream commit dbb6104c.\n\n**One info-level note recorded.** Seven forge-std files differ from the digests in `dependencies.lock.json`. I diffed each against the pinned upstream commit and the differences are line-wrapping only, so the test library is not semantically altered and the deployed bytecode is unaffected. The note asks the author to restore upstream bytes or regenerate the lock so the provenance claim holds.\n\nCoverage: all three listed entry points are marked `holds`, plus rows for the constructor and supply handout, the no-growth and no-freeze invariant, the three trust-gap seams, and the aderyn numeric-literal lead. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":915559,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":14386,"runtime":"claude","turns":29,"wallClockMs":210672}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3bed38612db34f32","findings":[{"citation":"resolved","description":"DEPENDENCIES.md states every vendored file is unchanged from its pinned upstream commit, and dependencies.lock.json records a SHA-256 digest for every included file. For lib/forge-std (tag v1.9.7, commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505) the lock's digests equal the upstream files at that commit, but seven shipped files differ from both: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol and src/interfaces/IMulticall3.sol. The differences are formatter reflows only (multi-line function signatures collapsed to one line); no semantic change was found, and forge-std is imported only from test/ and is absent from the deployed RobobetToken bytecode. The OpenZeppelin files (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol) all match their lock digests and the vendored ERC20 is verbatim upstream v5.0.2. Impact is limited to provenance: an integrity check that recomputes the lock digests over the shipped tree fails, and the 'unchanged from those commits' statement is false for the test dependency. Outside the economics area; reported because it is verifiable and the author can fix it in one step by either re-vendoring the seven files byte-for-byte from the pinned commit or regenerating the digests to describe the shipped files and removing the 'unchanged' claim.","line":4,"path":"DEPENDENCIES.md","reproduction":"From the repository root run: python3 -I -c \"import json,hashlib,os; lock=json.load(open('dependencies.lock.json')); [print(p, hashlib.sha256(open(p,'rb').read()).hexdigest()==d) for lib,i in lock.items() for rel,d in i['sha256'].items() for p in [os.path.join(lib,rel)]]\". Expected: True for every file. Actual: False for lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol (all OpenZeppelin files True). Cross-check: sha256 of https://raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/src/Vm.sol is 9068805b59ac1d0e..., which equals the lock's digest, while the shipped lib/forge-std/src/Vm.sol hashes to a1b1c82924aecf0f...; diff shows only whitespace/line-wrapping changes.","severity":"low","snippet":"are pinned to the following upstream commits and are unchanged from those","title":"Seven vendored forge-std files do not match the digests in dependencies.lock.json nor the pinned upstream commit they are documented as unchanged from"}],"hash":"3b773c12fa6737041b02c5addfa206e2e89965fd5fb595935f41bb325ce18d0b","nodeId":"e9fff97c-7ca2-41d3-90e0-026c0738248e","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. Only that file was touched; the scratch test was removed.\n\n**Outcome.** The ROBOBET token holds across the Economic Security, Invariant and Flow Gap guides. It is a verbatim OpenZeppelin v5.0.2 ERC20 with one constructor mint of 10^27 base units to the deploying factory. I found one low-severity defect, and it is a provenance issue outside my area.\n\n**What I checked in my area**\n- **Economic security.** No external dependencies, oracles, fees, taxes, rebasing, blacklist or pause. Sentinel paths revert as the standard requires. No value can be extracted from any transfer path.\n- **Invariants.** Sum of balances equals total supply on every path, including transfers to the token's own address. Mint is reachable only in the constructor, and the ABI exposes no supply-growing or balance-moving privileged selector.\n- **Flow gaps.** Factory to distributor, distributor to claimant, PoolManager settle-by-delta pulls and trader takes all move the exact stated amount. No exemption list is needed because no transfer rule exists. Constructor takes no arguments and makes no external calls.\n- **Verification run.** The delivered suite passes with the README seed. A scratch test with exact launch amounts and a conservation fuzz also passed before I removed it. The vendored OpenZeppelin files match their lock digests byte for byte.\n\n**The one finding (low).** Seven files under the vendored forge-std library were reformatted and no longer match the digests in the lock file or the pinned upstream commit, contradicting the \"unchanged from those commits\" claim in DEPENDENCIES.md. The differences are whitespace reflows only, and forge-std is a test-only dependency absent from the deployed bytecode. The reproduction is a one-line digest check in the findings file.\n\n**Coverage.** All three listed entry points are marked holds, with three further rows for the supply, constructor and flow invariants. Nothing was left unreached. The aderyn large-numeric-literal lead is stylistic and was not reported.","treeHash":null,"usage":{"cachedInputTokens":700103,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":15182,"runtime":"claude","turns":26,"wallClockMs":223759}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b1d937213bbfd9cf","findings":[{"citation":"resolved","description":"All four specialists reported the same root cause; this is the one merged finding. DEPENDENCIES.md (lines 3-5) states the vendored libraries 'are pinned to the following upstream commits and are unchanged from those commits', and dependencies.lock.json records a SHA-256 digest per file so that claim can be checked offline. Recomputing the digests over the tree, 29 of 36 files match, but seven forge-std v1.9.7 files do not: src/StdAssertions.sol (lock line 26), src/StdJson.sol (32), src/StdToml.sol (36), src/Vm.sol (39), src/console.sol (40), src/interfaces/IERC7540.sol (48), src/interfaces/IMulticall3.sol (50). I fetched each of the seven from upstream commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505: the upstream files hash to exactly the lockfile values, so the lockfile is correct and the vendored copies drifted. For every one of the seven, stripping all whitespace from the upstream and vendored copies gives identical bytes, so the drift is a formatter reflow (long function signatures collapsed to one line) with no semantic change. I also fetched contracts/token/ERC20/ERC20.sol at OpenZeppelin dbb6104c (v5.0.2): it is byte-identical to lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol and to the lock digest, and the other five OpenZeppelin files match the lock as well, so the only library compiled into the deployed RobobetToken is verbatim upstream. forge-std is imported only from test/ and is absent from the token's 1,752-byte runtime. Impact is limited to provenance: the project's own integrity record cannot be verified as written, and a reviewer who follows DEPENDENCIES.md gets seven failures and must redo the upstream comparison to rule out tampering. No funds, supply, or transfer behaviour is affected. Fix (either): restore the seven files byte-for-byte from the pinned commit so the recorded digests hold, or regenerate the lock digests from the shipped tree and drop the 'unchanged from those commits' wording. The specialists' severities ranged from info to low; low is kept because the record is the project's stated supply-chain evidence and is wrong as shipped.","line":26,"path":"dependencies.lock.json","reproduction":"From the repository root, offline: python3 -I -c \"import json,hashlib; l=json.load(open('dependencies.lock.json')); print([d+'/'+f for d,v in l.items() for f,h in v['sha256'].items() if hashlib.sha256(open(d+'/'+f,'rb').read()).hexdigest()!=h])\". Expected (per DEPENDENCIES.md lines 3-5): []. Actual: ['lib/forge-std/src/StdAssertions.sol', 'lib/forge-std/src/StdJson.sol', 'lib/forge-std/src/StdToml.sol', 'lib/forge-std/src/Vm.sol', 'lib/forge-std/src/console.sol', 'lib/forge-std/src/interfaces/IERC7540.sol', 'lib/forge-std/src/interfaces/IMulticall3.sol']. Concretely: sha256sum lib/forge-std/src/StdAssertions.sol = 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384, lock line 26 = d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780; sha256sum lib/forge-std/src/Vm.sol = a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15, lock line 39 = 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1. Cross-check with network: curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/src/StdAssertions.sol | sha256sum prints d4c89eec... (the lock value); diff <(tr -d ' \\n\\t' < upstream/StdAssertions.sol) <(tr -d ' \\n\\t' < lib/forge-std/src/StdAssertions.sol) is empty. Same for the other six. Control: curl -sL https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/token/ERC20/ERC20.sol | cmp - lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol reports no difference.","severity":"low","snippet":"      \"src/StdAssertions.sol\": \"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780\",","title":"dependencies.lock.json digests do not match seven vendored forge-std files; DEPENDENCIES.md's 'unchanged from those commits' claim is false for the test library (merged from audit_flow, audit_math, au"}],"hash":"4bdbfc1c00a4e07e52568d67b081c15420f3ec58c04d5b08f9e9b0cd14782ba8","nodeId":"78b31ab7-9491-4bce-80eb-f0422a3451d6","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. Nothing else is needed.\n\n**Outcome:** the RobobetToken code is clean. One low-severity provenance finding is kept, merged from all four specialists.\n\n**What I verified**\n- The token is a no-argument contract inheriting OpenZeppelin ERC20. The vendored ERC20 file is byte-identical to upstream v5.0.2, which I fetched and compared.\n- It mints exactly the manifest supply to the deployer once, exposes only approve, transfer and transferFrom as state changes, and has no owner, mint, burn, fee, pause or blacklist path.\n- The runtime is 1,752 bytes, well under the deployment limits, with no DELEGATECALL, CALLCODE, SELFDESTRUCT or CREATE opcodes.\n- The manifest matches the source: empty constructor arguments, matching name, symbol, decimals and total supply, lowercase addresses, no extra keys.\n- All 47 project tests pass, including the 256-run invariant suite. The protected floor tests cannot run here since they need the floor's own sources, but each of their checks holds by inspection of a plain ERC20.\n\n**The one finding kept (low)**\nSeven vendored forge-std files do not hash to the digests in dependencies.lock.json, while DEPENDENCIES.md claims they are unchanged from upstream. I reproduced it offline and confirmed against the pinned upstream commit that the lockfile is correct and the vendored copies were reformatted. Every difference is whitespace only, and forge-std is a test-only dependency absent from the deployed bytecode. The fix is to restore the seven files byte-for-byte or regenerate the digests and drop the \"unchanged\" wording.\n\n**Dropped:** nothing. The specialists reported no other findings, and my own pass with the Pashov and Trail of Bits checklists found none.\n\n**Coverage:** all three listed entry points marked holds, plus six invariant rows covering the constructor, supply growth, privileged calls, deployability, manifest consistency and the aderyn lead.","treeHash":null,"usage":{"cachedInputTokens":590915,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":9597,"runtime":"claude","turns":14,"wallClockMs":178609}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7591760a616c6429","findings":[{"citation":"resolved","description":"Outside the assigned math area; reported as provenance accuracy only. The lock file records SHA-256 digests for every vendored file and DEPENDENCIES.md states the files are unchanged from the pinned commits. Recomputing the digests shows seven forge-std files do not match the lock: src/Vm.sol, src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. Fetching the same paths at commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 reproduces the lock's digests, so the lock is correct and the vendored copies were altered (they appear to have been run through forge fmt). Stripping all whitespace from both versions gives zero differing lines for every file, so the change is formatting only. forge-std is imported only from test/ and is absent from the token's deployed bytecode; all six vendored OpenZeppelin files match the lock exactly. No security or arithmetic impact: this is a documentation/provenance statement that is not true as written, which a verifier that checks the lock will flag.","line":4,"path":"DEPENDENCIES.md","reproduction":"From the repository root run: python3 -I -c \"import json,hashlib;d=json.load(open('dependencies.lock.json'));[print('MISMATCH',l+'/'+f) for l,i in d.items() for f,h in i['sha256'].items() if hashlib.sha256(open(l+'/'+f,'rb').read()).hexdigest()!=h]\". Expected (per DEPENDENCIES.md line 4 and the lock): no output. Actual: seven lib/forge-std/src/... MISMATCH lines. Then: curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/src/Vm.sol | sha256sum gives 9068805b59ac1d0e..., equal to the lock entry, while sha256sum lib/forge-std/src/Vm.sol gives a1b1c82924aecf0f.... diff <(tr -d ' \\n\\t' < upstream/Vm.sol) <(tr -d ' \\n\\t' < lib/forge-std/src/Vm.sol) is empty. Fix: either restore the seven files byte-for-byte from the pinned commit, or regenerate the lock digests and drop the 'unchanged' wording.","severity":"info","snippet":"are pinned to the following upstream commits and are unchanged from those","title":"DEPENDENCIES.md and dependencies.lock.json claim the vendored forge-std is byte-identical to v1.9.7, but seven files differ (whitespace-only reformatting)"}],"hash":"7dccbb57250ca83a678d0bf25e79d49182562b71ebfeee4d7a22953bcec03e08","nodeId":"8645d1c9-0560-461b-8b56-afc16d7d4383","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The working tree is otherwise untouched.\n\n**Outcome: no math, boundary, or numerical-gap defect in the token.** `RobobetToken` is OpenZeppelin v5.0.2 `ERC20` with a single constructor mint of a compile-time constant. There is no fee, division, scale conversion, downcast, external call, payable path, or bytes decoding anywhere in the contract, so every failure mode in the three assigned guides has no surface to act on.\n\nWhat I verified, with concrete inputs:\n\n- **Supply constant** evaluates to exactly 10^27, below 2^128, and divides by 10^18 with zero remainder. The aderyn large-literal lead is not a defect.\n- **Transfer boundaries**: full-balance transfer, one unit over, max uint, one wei, zero amount, and self-transfer at full balance all behave as intended. The unchecked arithmetic in `_update` is bounded by the balance guard that precedes it.\n- **Allowance boundaries**: max is treated as infinite, max minus one is finite and decremented, and an allowance larger than the balance is left intact when the balance check reverts.\n- **Launch split**: 10% swarm, 60% pool and 30% remainder of 10^27 are exact with no dust, and the intermediate product cannot overflow.\n- **Conservation**: the project's 34 tests pass under the documented seed, and my own 1000-run fuzz plus a 12-case scratch probe passed before I deleted the scratch directory.\n- **Vendored OpenZeppelin**: all six files match the lock-file digests.\n\nOne info item outside my area is recorded. Seven vendored forge-std files do not match the lock digests or the pinned upstream commit, although stripping whitespace shows the differences are formatting only and forge-std is never in deployed bytecode. The finding cites the \"unchanged from those commits\" claim in DEPENDENCIES.md with a reproducible hash check.\n\nCoverage rows: all three entry points `holds`, plus rows for the supply invariant, the launch split, the boundary enumeration, library integrity, and one `unreached` row for the deployer-side pool price derivation, which no code in this tree computes.","treeHash":null,"usage":{"cachedInputTokens":777088,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":14841,"runtime":"claude","turns":25,"wallClockMs":203992}},{"artifacts":[],"attempt":1,"bundleHash":"728260773a2dc313c35703b718e91ea983de17474f4d5abff478be2978409448","device":"d9470c79e5f391aa","findings":[],"hash":"d37b45a8177da26f23a4f2e7d7f1da0f21f976ce4a5dff61ecfff2259185279c","nodeId":"42ba23d9-be4d-4eab-8851-2b6475c405dd","outcome":"completed","summary":"Added 13 boundary, failure-path, and fuzz tests. Strengthened invariants to verify balances and allowances across 32,768 random actions.\n\nOffline build and full test suite passed with the required seed: **47 passed, 0 failed**.\n\nOnly `test/` files changed. No implementation defects found.","treeHash":"5c00f21eae32c0efd866fa78701a581562ee55b0","usage":{"cachedInputTokens":721920,"inputTokens":66285,"model":"gpt-6-astra","outputTokens":12275,"runtime":"codex","turns":6,"wallClockMs":303480}},{"artifacts":[],"attempt":1,"bundleHash":"f17901d331193f62ec1034b2574a8d39641ff59bd82fb600be6d48453db169e7","device":"af1843f371022d4a","findings":[],"hash":"d501ac1c199b9d0ee8c5fe6b8104fd9fbf87b22e8d5f4a9b0749397f0fb39f2d","nodeId":"0c21a493-c890-43cb-9b35-87276ffcb708","outcome":"completed","summary":"Done. The manifest is written and is the only change in the working tree.\n\n**What I wrote** in `launch.json`:\n\n- **kind** `custom_token`, token contract `RobobetToken` with name robobet, symbol ROBOBET, 18 decimals.\n- **constructorArgs** is empty. The accepted constructor takes no parameters, confirmed against the compiled ABI, and mints the whole supply once to msg.sender.\n- **totalSupply** is the constructor's mint in minor units, one billion times ten to the eighteenth.\n- **contracts** is empty. The accepted tree contains only the token and no application contracts.\n- **pool** and **economics** are copied verbatim from the launch reference: IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object.\n- **notes** describes the token's behavior, the absence of owner or privileged calls, and why no launch placeholders are needed.\n\n**Verification**\n\n- `forge build` compiles cleanly with solc 0.8.26.\n- `forge test` with the verifier's fuzz seed passes all 34 tests, including the invariant suite.\n- `git status` shows only the new launch.json. No configuration, lib, or source file was touched.","treeHash":"ec62e890f39b6bd846a20de6bf46e534aada894c","usage":{"cachedInputTokens":186536,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2862,"runtime":"claude","turns":9,"wallClockMs":55519}}],"verification":[{"checks":[{"durationMs":2014,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.84s\nCompiler run successful!\n","passed":true},{"durationMs":1942,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/RobobetLaunch.t.sol:RobobetLaunchTest\n[PASS] test_Create2FactoryReceivesAllSupplyInsteadOfTransactionOrigin() (gas: 304630)\n[PASS] test_DistributionClaimsAndPoolTransfersArriveWhole() (gas: 701527)\n[PASS] test_TransfersDoNotCallRecipientCode() (gas: 167857)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.85ms (1.94ms CPU time)\n\nRan 30 tests for test/RobobetToken.t.sol:RobobetTokenTest\n[PASS] testFuzz_ExcessiveDelegatedTransferRevertsAtomically(uint256) (runs: 1000, μ: 123920, ~: 124297)\nLogs:\n  Bound result 411479873802551797805622625\n\n[PASS] testFuzz_ExcessiveTransferRevertsAtomically(uint256) (runs: 1000, μ: 71895, ~: 72219)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039465033380919713947234\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 1000, μ: 99548, ~: 99930)\nLogs:\n  Bound result 5519\n\n[PASS] testFuzz_TransferFromUsesExactlyTheApprovedAmount(uint256,uint256) (runs: 1000, μ: 169319, ~: 171687)\nLogs:\n  Bound result 757717641118196379039736385\n  Bound result 710924857614048409062656891\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78367)\n[PASS] test_ApproveEmitsEventAndReplacesAllowance() (gas: 126776)\n[PASS] test_ConstructorEmitsMintEvent() (gas: 8156)\n[PASS] test_DeployerCannotMoveHolderTokensWithoutApproval() (gas: 155164)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 136417)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 109612)\n[PASS] test_NoMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 854008)\n[PASS] test_RevertWhenApproveZeroSpender() (gas: 40184)\n[PASS] test_RevertWhenDifferentSpenderUsesApproval() (gas: 109966)\n[PASS] test_RevertWhenEmptyAccountTransfersOneUnit() (gas: 37864)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 36139)\n[PASS] test_RevertWhenSpenderExceedsAllowanceWithoutChangingState() (gas: 120593)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 57665)\n[PASS] test_RevertWhenTransferFromZeroSenderEvenForZeroAmount() (gas: 37860)\n[PASS] test_RevertWhenTransferToZeroAddressIncludingZeroAmount() (gas: 74888)\n[PASS] test_RevocationStopsPreviouslyApprovedSpender() (gas: 123519)\n[PASS] test_RuntimeFitsDeploymentLimitAndHasNoDangerousOpcodes() (gas: 1037963)\n[PASS] test_SelfTransferFromPreservesBalanceButConsumesAllowance() (gas: 110079)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54250)\n[PASS] test_TransferEmitsEventAndDeliversExactAmount() (gas: 96239)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 238883)\n[PASS] test_TransferFromInsufficientBalanceRollsBackAllowance() (gas: 113592)\n[PASS] test_TransferFromInvalidRecipientRollsBackAllowance() (gas: 118960)\n[PASS] test_WholeSupplyCanMoveAndReturn() (gas: 141426)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63122)\n[PASS] test_ZeroTransferFromWithoutAllowanceEmitsEvent() (gas: 56304)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 49.89ms (220.81ms CPU time)\n\nRan 1 test for test/RobobetInvariant.t.sol:RobobetInvariantTest\n[PASS] invariant_SupplyIsFixedAndEveryUnitIsAccountedFor() (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| RobobetHandler | approve      | 5441  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| RobobetHandler | transfer     | 5561  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| RobobetHandler | transferFrom | 5382  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 15\n  Bound result 459133177598299084763922434\n  Bound result 75260331908035322312391325\n  Bound result 0\n  Bound result 1\n  Bound result 837\n  Bound result 0\n  Bound result 0\n  Bound result 3356\n  Bound result 0\n  Bound result 25000000000000000000\n  Bound result 0\n  Bound result 1725540769\n  Bound result 0\n  Bound result 495790613315\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 346938040043957282148234126\n  Bound result 9905620943706515443\n  Bound result 5162\n  Bound result 0\n  Bound result 4112\n  Bound result 0\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 39999999999992500001\n  Bound result 119842752289506812996610988\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 242\n  Bound result 6191542\n  Bound result 1\n  Bound result 58\n  Bound result 109116811322906743346853863\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.83s (1.83s CPU time)\n\nRan 3 test suites in 1.83s (1.92s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":52,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RobobetToken.approve(address,uint256)\",\"RobobetToken.transfer(address,uint256)\",\"RobobetToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":20,\"README.md\":138,\"dependencies.lock.json\":54,\"foundry.toml\":19,\"remappings.txt\":2,\"src/RobobetToken.sol\":17,\"test/RobobetInvariant.t.sol\":74,\"test/RobobetLaunch.t.sol\":98,\"test/RobobetToken.t.sol\":361},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":749,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":277,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/RobobetToken.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"02f61ff9da5db4fe17b76f38d62607291aa7ae61353a72fa6550b30ae79cc993","verifiedTreeHash":"a66e22c2d266a70c76f8ea02cc2d757e2023a36d","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":1461,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.38s\nCompiler run successful!\n","passed":true},{"durationMs":9157,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/RobobetLaunch.t.sol:RobobetLaunchTest\n[PASS] test_Create2FactoryReceivesAllSupplyInsteadOfTransactionOrigin() (gas: 304630)\n[PASS] test_DistributionClaimsAndPoolTransfersArriveWhole() (gas: 701527)\n[PASS] test_TransfersDoNotCallRecipientCode() (gas: 167857)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 75.85ms (2.99ms CPU time)\n\nRan 30 tests for test/RobobetToken.t.sol:RobobetTokenTest\n[PASS] testFuzz_ExcessiveDelegatedTransferRevertsAtomically(uint256) (runs: 1000, μ: 123989, ~: 124297)\nLogs:\n  Bound result 100000000000000000000\n\n[PASS] testFuzz_ExcessiveTransferRevertsAtomically(uint256) (runs: 1000, μ: 71889, ~: 72219)\nLogs:\n  Bound result 410484899038002739405606153523205236379476506769068745023655361\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 1000, μ: 100117, ~: 100474)\nLogs:\n  Bound result 968589925908080752274396403382042111126014793823\n  Bound result 471177236958343737564616204\n\n[PASS] testFuzz_TransferFromUsesExactlyTheApprovedAmount(uint256,uint256) (runs: 1000, μ: 169537, ~: 171702)\nLogs:\n  Bound result 757717641118196379039736385\n  Bound result 710924857614048409062656891\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78367)\n[PASS] test_ApproveEmitsEventAndReplacesAllowance() (gas: 126776)\n[PASS] test_ConstructorEmitsMintEvent() (gas: 8156)\n[PASS] test_DeployerCannotMoveHolderTokensWithoutApproval() (gas: 155164)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 136417)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 109612)\n[PASS] test_NoMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 854008)\n[PASS] test_RevertWhenApproveZeroSpender() (gas: 40184)\n[PASS] test_RevertWhenDifferentSpenderUsesApproval() (gas: 109966)\n[PASS] test_RevertWhenEmptyAccountTransfersOneUnit() (gas: 37864)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 36139)\n[PASS] test_RevertWhenSpenderExceedsAllowanceWithoutChangingState() (gas: 120593)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 57665)\n[PASS] test_RevertWhenTransferFromZeroSenderEvenForZeroAmount() (gas: 37860)\n[PASS] test_RevertWhenTransferToZeroAddressIncludingZeroAmount() (gas: 74888)\n[PASS] test_RevocationStopsPreviouslyApprovedSpender() (gas: 123519)\n[PASS] test_RuntimeFitsDeploymentLimitAndHasNoDangerousOpcodes() (gas: 1037963)\n[PASS] test_SelfTransferFromPreservesBalanceButConsumesAllowance() (gas: 110079)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54250)\n[PASS] test_TransferEmitsEventAndDeliversExactAmount() (gas: 96239)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 238883)\n[PASS] test_TransferFromInsufficientBalanceRollsBackAllowance() (gas: 113592)\n[PASS] test_TransferFromInvalidRecipientRollsBackAllowance() (gas: 118960)\n[PASS] test_WholeSupplyCanMoveAndReturn() (gas: 141426)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63122)\n[PASS] test_ZeroTransferFromWithoutAllowanceEmitsEvent() (gas: 56304)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 78.76ms (288.35ms CPU time)\n\nRan 13 tests for test/RobobetProperties.t.sol:RobobetPropertiesTest\n[PASS] testFuzz_DelegatedRoundTripRestoresBalancesAndExhaustsBudget(uint256,uint256) (runs: 1000, μ: 339601, ~: 339996)\nLogs:\n  Bound result 629984625389939882166381720\n  Bound result 481275102384750573425085662\n\n[PASS] testFuzz_FiniteAllowanceRetainsAllUnspentBits(uint256,uint256) (runs: 1000, μ: 169736, ~: 170191)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 10\n\n[PASS] testFuzz_FundedHolderBalanceFailureIsAtomic(uint256,uint256,bool) (runs: 1000, μ: 209840, ~: 209836)\nLogs:\n  Bound result 12312\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129627638\n\n[PASS] testFuzz_InvalidRecipientPreservesAnyAllowance(uint256,uint256) (runs: 1000, μ: 132872, ~: 133556)\nLogs:\n  Bound result 10\n\n[PASS] testFuzz_ReplacementApprovalCanBeSpentAndRevoked(uint256,uint256,uint256) (runs: 1000, μ: 281795, ~: 283777)\nLogs:\n  Bound result 599690080644716845169652973\n\n[PASS] testFuzz_SplitTransfersMatchOneTransfer(uint256,uint256) (runs: 1000, μ: 247816, ~: 248228)\nLogs:\n  Bound result 9\n  Bound result 5722\n\n[PASS] test_HolderUsingTransferFromNeedsItsOwnApproval() (gas: 206169)\n[PASS] test_MaximumDelegatedTransferCannotBypassBalanceWithInfiniteAllowance() (gas: 134016)\n[PASS] test_MaximumFiniteApprovalSurvivesFailedSpend() (gas: 137355)\n[PASS] test_MaximumTransferCannotOverflowBalances() (gas: 68112)\n[PASS] test_OneBelowMaximumAllowanceIsFinite() (gas: 163099)\n[PASS] test_OverlappingApprovalsCannotOverspendHolderOrEachOther() (gas: 555974)\n[PASS] test_ZeroApprovalStillRejectsZeroSpender() (gas: 52791)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 79.18ms (454.54ms CPU time)\n\nRan 1 test for test/RobobetInvariant.t.sol:RobobetInvariantTest\n[PASS]\nRobobetInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchAuthorizedCalls\n[PASS] invariant_SupplyIsFixedAndEveryUnitIsAccountedFor\n RobobetInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------+---------------------------------+-------+---------+----------╮\n| Contract       | Selector                        | Calls | Reverts | Discards |\n+===============================================================================+\n| RobobetHandler | approve                         | 3636  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | boundaryApproval                | 3614  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | rejectTransferFromOverAllowance | 3597  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | rejectTransferFromOverBalance   | 3654  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | rejectTransferOverBalance       | 3766  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | rejectZeroRecipient             | 3636  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | rejectZeroSpender               | 3596  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | transfer                        | 3663  | 0       | 0        |\n|----------------+---------------------------------+-------+---------+----------|\n| RobobetHandler | transferFrom                    | 3606  | 0       | 0        |\n╰----------------+---------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8877\n  Bound result 0\n  Bound result 8525\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640151\n  Bound result 0\n  Bound result 0\n  Bound result 6186\n  Bound result 884110924407523935070063902\n  Bound result 0\n  Bound result 3756\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 15\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 2336\n  Bound result 0\n  Bound result 15\n  Bound result 2\n  Bound result 5\n  Bound result 1000000000000000000\n  Bound result 2835717307\n  Bound result 49452509783452600282386390945560869647625641973652230713082361700560521647122\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007915965357338\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 244\n  Bound result 0\n  Bound result 999999999999999997164282692\n  Bound result 0\n  Bound result 0\n  Bound result 717\n  Bound result 156\n  Bound result 6685\n  Bound result 7202\n  Bound result 4219\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007915965363830\n  Bound result 0\n  Bound result 25000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007910293922883\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 2835717310\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 39597314\n  Bound result 10556314253281917383\n  Bound result 0\n  Bound result 6265\n  Bound result 1\n  Bound result 352150057233484041908843269122\n  Bound result 0\n  Bound result 391\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 15\n  Bound result 0\n  Bound result 43266673\n  Bound result 0\n  Bound result 13286242\n  Bound result 1\n  Bound result 3974\n  Bound result 4\n  Bound result 0\n  Bound result 95\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913086380048\n  Bound result 14961527\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913086379685\n  Bound result 1140\n  Bound result 1\n  Bound result 24204756\n  Bound result 0\n  Bound result 7173603\n  Bound result 115792089237316195423570985008687907853269984665639564039465109360596779252986\n  Bound result 9094\n  Bound result 1242826417\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.06s (9.06s CPU time)\n\nRan 4 test suites in 9.07s (9.30s CPU time): 47 tests passed, 0 failed, 0 skipped (47 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RobobetToken.approve(address,uint256)\",\"RobobetToken.transfer(address,uint256)\",\"RobobetToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":20,\"README.md\":138,\"dependencies.lock.json\":54,\"foundry.toml\":19,\"remappings.txt\":2,\"src/RobobetToken.sol\":17,\"test/RobobetInvariant.t.sol\":195,\"test/RobobetLaunch.t.sol\":98,\"test/RobobetProperties.t.sol\":258,\"test/RobobetToken.t.sol\":362},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d37b45a8177da26f23a4f2e7d7f1da0f21f976ce4a5dff61ecfff2259185279c","verifiedTreeHash":"5c00f21eae32c0efd866fa78701a581562ee55b0","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":2052,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.91s\nCompiler run successful!\n","passed":true},{"durationMs":1900,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/RobobetLaunch.t.sol:RobobetLaunchTest\n[PASS] test_Create2FactoryReceivesAllSupplyInsteadOfTransactionOrigin() (gas: 304630)\n[PASS] test_DistributionClaimsAndPoolTransfersArriveWhole() (gas: 701527)\n[PASS] test_TransfersDoNotCallRecipientCode() (gas: 167857)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 48.08ms (1.92ms CPU time)\n\nRan 30 tests for test/RobobetToken.t.sol:RobobetTokenTest\n[PASS] testFuzz_ExcessiveDelegatedTransferRevertsAtomically(uint256) (runs: 1000, μ: 123920, ~: 124297)\nLogs:\n  Bound result 979515299\n\n[PASS] testFuzz_ExcessiveTransferRevertsAtomically(uint256) (runs: 1000, μ: 71895, ~: 72219)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039467584007913129639935\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 1000, μ: 99548, ~: 99930)\nLogs:\n  Bound result 5519\n\n[PASS] testFuzz_TransferFromUsesExactlyTheApprovedAmount(uint256,uint256) (runs: 1000, μ: 169319, ~: 171687)\nLogs:\n  Bound result 60000000000000000000\n  Bound result 1\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78367)\n[PASS] test_ApproveEmitsEventAndReplacesAllowance() (gas: 126776)\n[PASS] test_ConstructorEmitsMintEvent() (gas: 8156)\n[PASS] test_DeployerCannotMoveHolderTokensWithoutApproval() (gas: 155164)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 136417)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 109612)\n[PASS] test_NoMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 854008)\n[PASS] test_RevertWhenApproveZeroSpender() (gas: 40184)\n[PASS] test_RevertWhenDifferentSpenderUsesApproval() (gas: 109966)\n[PASS] test_RevertWhenEmptyAccountTransfersOneUnit() (gas: 37864)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 36139)\n[PASS] test_RevertWhenSpenderExceedsAllowanceWithoutChangingState() (gas: 120593)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 57665)\n[PASS] test_RevertWhenTransferFromZeroSenderEvenForZeroAmount() (gas: 37860)\n[PASS] test_RevertWhenTransferToZeroAddressIncludingZeroAmount() (gas: 74888)\n[PASS] test_RevocationStopsPreviouslyApprovedSpender() (gas: 123519)\n[PASS] test_RuntimeFitsDeploymentLimitAndHasNoDangerousOpcodes() (gas: 1037963)\n[PASS] test_SelfTransferFromPreservesBalanceButConsumesAllowance() (gas: 110079)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54250)\n[PASS] test_TransferEmitsEventAndDeliversExactAmount() (gas: 96239)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 238883)\n[PASS] test_TransferFromInsufficientBalanceRollsBackAllowance() (gas: 113592)\n[PASS] test_TransferFromInvalidRecipientRollsBackAllowance() (gas: 118960)\n[PASS] test_WholeSupplyCanMoveAndReturn() (gas: 141426)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63122)\n[PASS] test_ZeroTransferFromWithoutAllowanceEmitsEvent() (gas: 56304)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 53.59ms (219.58ms CPU time)\n\nRan 1 test for test/RobobetInvariant.t.sol:RobobetInvariantTest\n[PASS] invariant_SupplyIsFixedAndEveryUnitIsAccountedFor() (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| RobobetHandler | approve      | 5441  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| RobobetHandler | transfer     | 5561  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| RobobetHandler | transferFrom | 5382  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 15\n  Bound result 459133177598299084763922434\n  Bound result 75260331908035322312391325\n  Bound result 0\n  Bound result 1\n  Bound result 837\n  Bound result 0\n  Bound result 0\n  Bound result 3356\n  Bound result 0\n  Bound result 25000000000000000000\n  Bound result 0\n  Bound result 1725540769\n  Bound result 0\n  Bound result 495790613315\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 346938040043957282148234126\n  Bound result 9905620943706515443\n  Bound result 5162\n  Bound result 0\n  Bound result 4112\n  Bound result 0\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 39999999999992500001\n  Bound result 53355774270745269182887859\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 242\n  Bound result 6191542\n  Bound result 1\n  Bound result 58\n  Bound result 33028854855140845801060421\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.78s (1.78s CPU time)\n\nRan 3 test suites in 1.78s (1.88s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":57,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RobobetToken.approve(address,uint256)\",\"RobobetToken.transfer(address,uint256)\",\"RobobetToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":20,\"README.md\":138,\"dependencies.lock.json\":54,\"foundry.toml\":19,\"launch.json\":24,\"remappings.txt\":2,\"src/RobobetToken.sol\":17,\"test/RobobetInvariant.t.sol\":74,\"test/RobobetLaunch.t.sol\":98,\"test/RobobetToken.t.sol\":361},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d501ac1c199b9d0ee8c5fe6b8104fd9fbf87b22e8d5f4a9b0749397f0fb39f2d","verifiedTreeHash":"ec62e890f39b6bd846a20de6bf46e534aada894c","verifierVersion":"0.1.0+d952fceb"}]}