{"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":"635ac137-bd17-4fe7-a779-11c9732dfae0","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ae5bd9fcedc5b9f74934c4e0a3ff08a2b4df82bf100e51a1709ffb8a07c7fe20","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":"2425eba612baa337ab56e14a41cd144a7eab8a7ae7d2493cff96f54efae728ee","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":"6944796edcd7d6c72f6c8849ed5de8e300a672acdbb70f4dedf2e38be1427e57","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":"da72b012e0f9b2e9f1958d0b229b26d9375c6a43d01d472108c2ee4aed4f4dd5","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":"e188011cc8aef07d48b1c7406c0419e7e8e82a3b4996074e7631a44277cdbc78","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":"3e1e21f158485dcd6b636ab49d4d76999dc93033f39592599ad3c40ecf344b5f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"9bdd7adcaaa970317d43e1235e6b84b9feabc20c03b9db93a6fa9f6350012992","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"4962383bbb31cddf648ada8f3545dbb6251290cbe0f9fe4dcf039d025a10e526","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: Irreversible Monkey Dinasty (MONKEY).\nToken name: Irreversible Monkey Dinasty\nToken symbol: MONKEY\nToken supply: 67,676,767 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"347eb54f543e47beb88ce2e401d566813341fd97107e5b4d320d35dc445b8806","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"635ac137-bd17-4fe7-a779-11c9732dfae0","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1191-irreversible-monkey-dinasty"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51428","feedbackHash":"9f3a5324d8df93b3eff3fa969e779fcff10377886f2717fd776902ffd0b83756","nodeKey":"audit_economics","submissionHash":"ae5bd9fcedc5b9f74934c4e0a3ff08a2b4df82bf100e51a1709ffb8a07c7fe20","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51145","feedbackHash":"935b8c15445cddd6df4497c6e1ffed4527b1da490d739a6aef0ae220454fb511","nodeKey":"audit_flow","submissionHash":"2425eba612baa337ab56e14a41cd144a7eab8a7ae7d2493cff96f54efae728ee","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52121","feedbackHash":"d9675e38218e5522856ba7c2dc49c8d617715a524405ccb54cc2241afcb4669d","nodeKey":"audit_judge","submissionHash":"6944796edcd7d6c72f6c8849ed5de8e300a672acdbb70f4dedf2e38be1427e57","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52192","feedbackHash":"c5feb42d2b582724223cea238e66c9abd6201355284fb1ade091e4695f07542b","nodeKey":"audit_math","submissionHash":"da72b012e0f9b2e9f1958d0b229b26d9375c6a43d01d472108c2ee4aed4f4dd5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51538","feedbackHash":"d55ee79d37235a192c0449f1f41e5550c99db1d5e4a5695ca74813d9d0ac6654","nodeKey":"audit_permissions","submissionHash":"e188011cc8aef07d48b1c7406c0419e7e8e82a3b4996074e7631a44277cdbc78","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51884","feedbackHash":"b6bb77525e89f24766e780fe8a7317c146a25630cd668b16c99225943a8bf132","nodeKey":"build_contract_project","submissionHash":"3e1e21f158485dcd6b636ab49d4d76999dc93033f39592599ad3c40ecf344b5f","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51508","feedbackHash":"79c5f6adc20d19e7056a91af3bd264191cf848a15aa50771d7030884674e1fb5","nodeKey":"manifest","submissionHash":"9bdd7adcaaa970317d43e1235e6b84b9feabc20c03b9db93a6fa9f6350012992","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51486","feedbackHash":"fb25a460ad30d830f727b5d52738da6a9d99aa15bbf0a7be9a4dd14a98f21c99","nodeKey":"write_foundry_tests","submissionHash":"4962383bbb31cddf648ada8f3545dbb6251290cbe0f9fe4dcf039d025a10e526","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6a6865b023d9f2f0da67cdb4e155651672739e756329468e1fed6c97425a5c95","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3b9f88f55251764d","findings":[],"hash":"2425eba612baa337ab56e14a41cd144a7eab8a7ae7d2493cff96f54efae728ee","nodeId":"026200af-dd84-412b-960b-5cd65025abba","outcome":"completed","summary":"The review is complete and found no defects. The findings file is written with an empty findings list and a full coverage record.\n\n**What I reviewed.** The token at `src/MonkeyToken.sol` is a plain OpenZeppelin 5.4.0 ERC20 with the Burnable and Permit extensions and a single constructor mint. It has no custom logic, so the control flow lives entirely in the inherited code. I traced every listed entry point through that code against the Execution Trace, Periphery and First Principles guides.\n\n**Evidence gathered.**\n- Every Solidity file under the vendored OpenZeppelin tree is byte-identical to the npm 5.4.0 package. The vendored forge-std matches the GitHub v1.17.0 tag. Nothing in the periphery was tampered with.\n- An invariant fuzz run across transfer, transferFrom, burn and burnFrom kept the sum of balances equal to total supply, and total supply equal to the initial supply minus burns, over 128,000 calls with no reverts.\n- Permit rejects expired deadlines, replays, high-s signatures and a zero owner, and the domain separator changes with the chain id.\n- The deployer with no allowance cannot pull or burn a holder's balance, which is what the protected harness checks.\n- An opcode scan of creation and runtime code finds no DELEGATECALL, CALLCODE or SELFDESTRUCT. The only call-class opcode is the ecrecover STATICCALL.\n- The supply constant evaluates to 67,676,767 whole tokens at 18 decimals, and it is minted once to the constructor's caller.\n\n**Notes that are not defects.** The runtime uses PUSH0 and MCOPY, so it requires a Cancun-capable chain. The README targets Ethereum mainnet, which qualifies, so I recorded this as a coverage row rather than a finding. No launch.json exists yet, so the manifest row is marked unreached with the values it should contain.\n\n**Housekeeping.** The scratch test directory was removed, and the working tree holds nothing new apart from the ignored output file at `.imd-findings.json`.","treeHash":null,"usage":{"cachedInputTokens":831477,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":17408,"runtime":"claude","turns":30,"wallClockMs":258605}},{"artifacts":[],"attempt":1,"bundleHash":"5b530af5fde0d8d2e963f8635dd8c3aafed4db8cf910c9fe41c631a294f05186","device":"4aa8623bfb8d8e5e","findings":[],"hash":"3e1e21f158485dcd6b636ab49d4d76999dc93033f39592599ad3c40ecf344b5f","nodeId":"44fcba8d-381e-4972-be21-171e701a0478","outcome":"completed","summary":"The deliverable is complete and committed as `cbc5337` on `main`. A fresh offline clone of that commit builds, passes all tests, and passes the formatter check.\n\n**What was built**\n\n- `src/MonkeyToken.sol`: contract `MonkeyToken`, named \"Irreversible Monkey Dinasty\", symbol MONKEY, 18 decimals. The constructor takes no arguments and mints the whole supply of 67,676,767 tokens once to msg.sender. It is OpenZeppelin ERC20 plus ERC20Burnable and ERC20Permit with no custom logic beyond the mint. There is no owner, no mint path, no pause, no blocklist, and no delegatecall or selfdestruct in the runtime, so it satisfies every check in the pinned protected test.\n- `test/MonkeyToken.t.sol`: 31 tests covering metadata, exact supply to a contract deployer, the 10/84/6 launch flows arriving whole, standard transfer and allowance failures, holder-only burning, permit success, replay, expiry and wrong-signer failures, a probe that mint and admin selectors do not exist, and an opcode scan for forbidden instructions. One fuzz test checks supply conservation.\n- `script/DeployMonkeyToken.s.sol`: reference deploy script with a `deploy()` function the tests call directly and no environment reads.\n- `foundry.toml`: pins solc 0.8.26, sets `bytecode_hash = \"none\"`, ffi off, no filesystem permissions.\n- `lib/`: forge-std 1.17.0 and OpenZeppelin Contracts 5.4.0 vendored as plain files, no submodules.\n- `README.md`: assumptions, deployment parameters, after-launch items, operational responsibilities, and the security checklist outcome.\n\n**Check results**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes |\n| forge test | 31 passed, 0 failed |\n| forge fmt --check | passes |\n\n**Notes for the reviewer**\n\n- The token name keeps the requested spelling \"Dinasty\". I did not correct it to \"Dynasty\".\n- The git commit author was set from the command line because the workspace had no identity configured. No git config was written.\n- Slither and Mythril were not available here. Only the Foundry tools ran.","treeHash":"8f91a9bed63e78fa3e807c48fb9ebaad137d3924","usage":{"cachedInputTokens":843425,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":19773,"runtime":"claude","turns":24,"wallClockMs":241294}},{"artifacts":[],"attempt":1,"bundleHash":"19d1b9fd052baca97b6191a5ddacdae8633f32040f83aba3e53876eac8e26bd9","device":"0e78515c4d95885a","findings":[],"hash":"4962383bbb31cddf648ada8f3545dbb6251290cbe0f9fe4dcf039d025a10e526","nodeId":"aad58faa-f882-4fde-a49f-4ae2f9baa438","outcome":"completed","summary":"The two remaining lint notes are heuristics about reusing a pre-cheatcode value after the cheatcode, which is exactly what those two tests intend (the signed deadline must stay the pre-warp timestamp, and the home chain id must be restored). They are warnings only and do not affect the build or tests, so I am leaving them.\n\n## Recap\n\n**Outcome:** 87 tests pass with `forge build` and `forge test` clean. No defect was found in the token, so no findings file was written. The implementation is unmodified OpenZeppelin 5.4.0 ERC20, ERC20Burnable and ERC20Permit with a single constructor mint, and every adversarial input I tried behaved to spec.\n\n**What I added** (both under `test/`, alongside the existing 31-test suite, which I left as is):\n\n- `test/MonkeyToken.invariant.t.sol`. A handler drives six keyed actors, one being the deployer that received the supply, through transfer, approve, transferFrom, burn, burnFrom, valid permits with an immediate replay, expired permits, forged permits, over-balance and over-allowance attempts, admin-style selectors from every actor, and time warps. It keeps a ghost ledger per actor and per allowance pair. Seven invariants are checked after every call: supply equals initial minus burned and never grows, supply equals the sum of actor balances, every balance matches its ledger, every allowance matches its ledger including the unlimited case, nonces equal accepted permits, the zero address and the token hold nothing, and metadata is immutable. Inline config sets 256 runs at depth 64 with fail-on-revert, and an end-of-run guard rejects a vacuous run.\n- `test/MonkeyToken.edge.t.sol`. 55 unit and fuzz tests at the edges: one wei, the whole supply, supply plus one, uint256 max, self-transfer, repeat calls, zero-value paths, the token as an unrecoverable sink, CREATE2 deployment to a factory stand-in with address prediction and tx.origin receiving nothing, allowance overwrite and max-minus-one semantics, transferFrom emitting no Approval event, burning the entire supply, and for permit: exact-deadline boundary, tampered value or spender, wrong nonce ordering, malleable high-s signatures, invalid v, all-zero signature, zero owner or spender, cross-chain replay, and replay against a twin deployment. Fuzz tests run at 1000 runs.\n\n**Verification of the harness itself.** In the scratch directory I ran three deliberately wrong invariants against the same handler. All three failed as expected, confirming the fuzzer really reaches burns, permits and transfers. One real bug surfaced during the full run and it was mine, not the token's: a near-maximum fuzzed approval overflowed the over-limit handler's arithmetic. I fixed that to base the amount on the smaller of balance and allowance and to expect the error OpenZeppelin raises first, then re-ran the suite across five fuzz seeds without failure.\n\nNothing was committed. The two new files are untracked in `test/` and the scratch directory is left for the pipeline to remove.","treeHash":"9a1bf617e0c6eb5a997bc2c4a1ae2449a1cac5a3","usage":{"cachedInputTokens":2653296,"inputTokens":930,"model":"claude-fable-5-1","outputTokens":46308,"runtime":"claude","turns":30,"wallClockMs":775810}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bdd9b74dce66953d","findings":[],"hash":"6944796edcd7d6c72f6c8849ed5de8e300a672acdbb70f4dedf2e38be1427e57","nodeId":"65f1d117-4219-4f58-9fe0-5a3682c943c0","outcome":"completed","summary":"The review is complete. The findings file holds an empty findings list and a full coverage record.\n\n**Outcome: no defects found.** The four specialists and the independent tester all reported nothing, and I could not produce a counterexample either. The token is unmodified OpenZeppelin 5.4.0 ERC20, ERC20Burnable and ERC20Permit with a single constructor mint and no custom logic.\n\nWhat I verified against the code:\n\n- **Constructor and supply.** No arguments, no external calls, one mint of 67,676,767 × 10^18 to the CREATE2 caller. That matches launch.json's empty constructorArgs, totalSupply and decimals. No mint selector exists in the ABI.\n- **All six entry points.** Each traced through the OpenZeppelin implementation and exercised in a scratch Foundry test: transfers move the exact amount with no fee or burn, transferFrom and burnFrom revert without allowance even from the deployer, permit rejects replay, expiry, wrong signer and cross-chain use, approve rejects the zero spender.\n- **Deployability.** Builds with the pinned solc and metadata settings, runtime about 4.1 KB, creation code well under the limit, no DELEGATECALL, CALLCODE or SELFDESTRUCT in the runtime, no receive or fallback.\n- **Dependencies.** The vendored OpenZeppelin and forge-std trees diff byte for byte against upstream tags v5.4.0 and v1.17.0 with no differences, and there are no submodules.\n- **Project tests.** All 87 existing unit, fuzz and invariant tests pass offline. Slither and aderyn reported nothing.\n\nThe coverage record marks every listed entry point as holds, plus three invariant rows for the constructor, bytecode and dependencies. The scratch test directory was removed, so the working tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":363916,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":11235,"runtime":"claude","turns":20,"wallClockMs":178882}},{"artifacts":[],"attempt":1,"bundleHash":"71607a792c385d6bec7b8f27f64c02e6fc2775fdec249eb7dd97422f765fa88b","device":"3516474d8a268bd8","findings":[],"hash":"9bdd7adcaaa970317d43e1235e6b84b9feabc20c03b9db93a6fa9f6350012992","nodeId":"ba628a33-0335-44e2-89e6-b5f27b23a4d2","outcome":"completed","summary":"Done. I wrote `launch.json` for the Irreversible Monkey Dinasty (MONKEY) launch, and it is the only file changed in the tree.\n\n**What the manifest says**\n\n- Kind is custom_token. The token contract is MonkeyToken, with name \"Irreversible Monkey Dinasty\", symbol MONKEY and 18 decimals.\n- Constructor arguments are empty, matching the compiled ABI, which has no constructor parameters.\n- totalSupply is the exact minting in the constructor, 67,676,767 tokens in minor units:\n\n```\n67676767000000000000000000\n```\n\n- The contracts list is empty. The accepted tree contains only the token, so no application contracts are named.\n- Pool is the launch's own: IMD pair at 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, fee 12500, tick spacing 60, and the one-to-one initialPrice as provenance.\n- Economics is copied verbatim from the job, and I confirmed it byte-for-byte against the required object.\n- Notes describe the token as implemented: fixed supply, no owner or admin, no fee or burn on transfer, holder-only burns, and no exemptions needed. Notes are 972 characters, well under the 4000 limit.\n\n**Verification**\n\n- The manifest parses as JSON and uses only the schema's six top-level keys, with addresses in lowercase and uint256 values as strings.\n- forge build compiled cleanly with solc 0.8.26.\n- forge test passed all 31 tests in the accepted suite.\n- git status shows launch.json as the only new or modified path.","treeHash":"2ad3fca207f16a60b2d790345dd21a5da217c350","usage":{"cachedInputTokens":179592,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3045,"runtime":"claude","turns":9,"wallClockMs":62925}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bc1e515ca5c78ac4","findings":[],"hash":"ae5bd9fcedc5b9f74934c4e0a3ff08a2b4df82bf100e51a1709ffb8a07c7fe20","nodeId":"e4ede73c-58ec-49f2-b8c9-cbd68252a552","outcome":"completed","summary":"The review is complete. The findings file is valid JSON with zero findings and eleven coverage rows, one per listed entry point plus the invariants I checked.\n\n**Result: no defects found in the Economic Security, Invariant and Flow Gap areas.**\n\nWhat I checked and how:\n\n- **Code under review.** The token is 39 lines: OpenZeppelin v5.4.0 ERC20, ERC20Burnable and ERC20Permit with a no-argument constructor that mints the fixed supply to the caller. No owner, hooks, fees, pause or blocklist exist, and the runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Dependency integrity.** I fetched upstream OpenZeppelin v5.4.0 and compared every one of the 20 files in the token's import closure byte for byte. All match, so the behaviour is exactly the audited library's.\n- **Invariants.** A stateful fuzz run of 128,000 random transfer, approve, transferFrom, burn and burnFrom calls never broke the conservation law, and total supply only ever decreased by what holders burned. Supply is minted once and no mint path exists afterwards.\n- **Launch flows.** Factory to distributor to claimant, factory to pool, and pool to trader all arrive whole because the token has no transfer rules. The deployer cannot pull or burn a holder's balance without an allowance.\n- **Permit economics.** Replay, cross-token, chain-fork and high-s signatures are rejected. Deadline equal to the current timestamp is accepted per ERC-2612. Permit only sets allowances and moves no funds.\n- **Known standard property, not reported as a finding.** Anyone can relay a permit signature first and make an integrator's bundled permit-plus-transfer revert. This is inherent to ERC-2612 and is noted in the coverage row.\n\nThe scratch tests live in test/scratch/EconInvariants.t.sol and pass, and the existing 31-test suite also passes. The verifier's static analysis reported nothing, which agrees with what I found. Nothing in the tree outside the scratch directory and the findings file was changed.","treeHash":null,"usage":{"cachedInputTokens":524788,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":15714,"runtime":"claude","turns":22,"wallClockMs":234761}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a7b8747ac077deb9","findings":[],"hash":"da72b012e0f9b2e9f1958d0b229b26d9375c6a43d01d472108c2ee4aed4f4dd5","nodeId":"860c06d5-455a-45e6-acca-f2bc0cb5004c","outcome":"completed","summary":"The findings file is in place at the repository root, and the working tree has no other changes. The review is complete.\n\n**Result: no defects found in the assigned area.** The findings file holds an empty list and a full coverage record.\n\n**What was reviewed.** The token at `src/MonkeyToken.sol` is OpenZeppelin 5.4.0 ERC20, ERC20Burnable and ERC20Permit with a single constructor mint and no custom logic. I diffed the vendored OpenZeppelin tree against the upstream 5.4.0 release and it is byte-identical, so the arithmetic the token runs is exactly OpenZeppelin's.\n\n**Checks applied from the Math Precision, Boundary and Numerical Gap guides**, each exercised in a scratch Foundry test that passed and was then removed:\n\n- Supply constant equals the manifest value in minor units, fits below the Uniswap v4 int128 range, and the 10% and 84% launch shares divide with no sub-wei residue.\n- Transfer of zero, of a whole balance, of the whole supply in one hop, and self-transfer all conserve balances. Supply plus one and the uint256 maximum revert with exact values.\n- Allowance exactly equal to the value, max minus one, and the infinite sentinel behave as ERC-20 intends. A burnFrom that fails on balance leaves the allowance untouched.\n- Burning the full supply leaves zero and a further burn reverts. Zero-value burn and burnFrom are no-ops.\n- Permit accepts a deadline equal to the current timestamp and max value or deadline. Expired, wrong-signer, high-s and zero-recovery signatures revert without consuming the nonce. The domain separator is rebuilt correctly for chain id 1. The 27-byte name needs no ShortString fallback.\n- A 256-run fuzz over transfers and burns held the balance-sum invariant.\n\n**Coverage record.** All six listed entry points are marked as holding, with three extra rows for the supply constant, the conservation invariant and dependency integrity. The one note worth passing on is the standard ERC-2612 property that a relayed permit can be front-run, which only makes the owner's own relay revert and is not a defect.","treeHash":null,"usage":{"cachedInputTokens":783439,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":13219,"runtime":"claude","turns":24,"wallClockMs":185041}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b57ae3a96321a0e1","findings":[],"hash":"e188011cc8aef07d48b1c7406c0419e7e8e82a3b4996074e7631a44277cdbc78","nodeId":"84c7485e-1caa-4194-82ad-989df4b4472d","outcome":"completed","summary":"Review complete. The findings file is written at the repository root with an empty findings list and a full coverage record, and the scratch test and temporary downloads are removed so the tree is unchanged.\n\n**Result: no defects found in the Access Control, Trust Gap or Asymmetry areas.**\n\nWhat I checked and how:\n\n- **Permission map.** The token is OpenZeppelin 5.4.0 `ERC20` + `ERC20Burnable` + `ERC20Permit` with a single constructor mint. There are no roles, modifiers, setters, initializers, proxies or outgoing calls. The only guards are balance and allowance checks on the holder's own state, and a signature check in permit.\n- **Dependency integrity.** The vendored OpenZeppelin contracts and forge-std sources are byte-identical to upstream v5.4.0 and v1.17.0, committed as plain files with no submodule. The permission story rests on those files, so this mattered.\n- **Executed adversarial probes.** I ran 15 scratch tests covering every entry point: deployer and strangers cannot move or burn a holder's balance, self-burnFrom still needs an allowance, an attacker's approve cannot touch a victim's allowances, permit rejects high-s malleable signatures, bad v, zero owner, altered spender or value, replay on another token or another chain id, and a relayed front-run only sets the identical allowance. A 20-selector sweep from both a stranger and the deployer found no hidden privileged function, no receive or fallback, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Asymmetry pairs.** transferFrom and burnFrom spend allowances identically, including the infinite-allowance exemption. mint exists only in the constructor; burn paths only shrink supply, and a fuzz confirmed total supply equals the sum of balances after mixed burns.\n- **Trust-gap seams.** With no privileged actor, no settable parameter and no fee or price formula, no seam has two sides to combine. The one trust assumption is outside the contract: the factory holds the whole supply at deployment and must pay it out as the launch specifies.\n\nCoverage: all six listed entry points are marked `holds`, plus four invariant rows. Nothing was left unreached. The existing 31-test suite also passes.","treeHash":null,"usage":{"cachedInputTokens":573443,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13995,"runtime":"claude","turns":24,"wallClockMs":187627}}],"verification":[{"checks":[{"durationMs":892,"exitCode":0,"name":"build","output":"Compiling 43 files with Solc 0.8.26\nSolc 0.8.26 finished in 796.76ms\nCompiler run successful!\n","passed":true},{"durationMs":73,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/MonkeyToken.t.sol:MonkeyTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 95820, ~: 95794)\n[PASS] test_approveAndTransferFrom() (gas: 219313)\n[PASS] test_approveZeroSpenderReverts() (gas: 32928)\n[PASS] test_burnFromRequiresAllowance() (gas: 216370)\n[PASS] test_burnMoreThanBalanceReverts() (gas: 94952)\n[PASS] test_burnedSupplyNeverComesBack() (gas: 173637)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8435)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 32830)\n[PASS] test_deployScriptMintsToCaller() (gas: 2379852)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 100229)\n[PASS] test_domainSeparatorUsesTokenName() (gas: 15862)\n[PASS] test_eachDeploymentIsIndependent() (gas: 21068)\n[PASS] test_holderCanBurnOwnTokens() (gas: 114626)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 180184)\n[PASS] test_launchFlowsArriveWhole() (gas: 284357)\n[PASS] test_metadata() (gas: 64705)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 679657)\n[PASS] test_permitExpiredReverts() (gas: 49923)\n[PASS] test_permitReplayReverts() (gas: 148200)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 115861)\n[PASS] test_permitWrongSignerReverts() (gas: 74979)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1743329)\n[PASS] test_supplyConstantsAgree() (gas: 16336)\n[PASS] test_transferEmitsEvent() (gas: 126209)\n[PASS] test_transferFromEmptyAccountReverts() (gas: 37847)\n[PASS] test_transferFromRevertsOverAllowance() (gas: 145864)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 98041)\n[PASS] test_transferMovesExactAmount() (gas: 164172)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 97682)\n[PASS] test_transferToZeroAddressReverts() (gas: 92623)\n[PASS] test_transferWholeBalanceAndZero() (gas: 176240)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 4.05ms (12.47ms CPU time)\n\nRan 1 test suite in 4.72ms (4.05ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MonkeyToken.approve(address,uint256)\",\"MonkeyToken.burn(uint256)\",\"MonkeyToken.burnFrom(address,uint256)\",\"MonkeyToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"MonkeyToken.transfer(address,uint256)\",\"MonkeyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":124,\"foundry.toml\":26,\"remappings.txt\":2,\"script/DeployMonkeyToken.s.sol\":25,\"src/MonkeyToken.sol\":39,\"test/MonkeyToken.t.sol\":407},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1261,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":486,"exitCode":0,"name":"aderyn","output":"aderyn: no results at low impact or above","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3e1e21f158485dcd6b636ab49d4d76999dc93033f39592599ad3c40ecf344b5f","verifiedTreeHash":"8f91a9bed63e78fa3e807c48fb9ebaad137d3924","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":2015,"exitCode":0,"name":"build","output":"Compiling 45 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.89s\nCompiler run successful!\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/MonkeyToken.edge.t.sol:469:28\n    │\n469 │         uint256 deadline = block.timestamp;\n    │                            ━━━━━━━━━━━━━━━\n470 │         (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, _digest(owner, bob, 1e18, 0, deadline));\n471 │         vm.warp(deadline + 1);\n    │         ───────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/MonkeyToken.edge.t.sol:567:29\n    │\n567 │         uint256 homeChain = block.chainid;\n    │                             ━━━━━━━━━━━━━\n568 │\n569 │         vm.chainId(homeChain + 1);\n    │         ───────────────────────── `vm.chainId` changes this environment here\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":9274,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 55 tests for test/MonkeyToken.edge.t.sol:MonkeyTokenEdgeTest\n[PASS] testFuzz_anyAmountOverBalanceRevertsWithExactError(uint256,uint256) (runs: 1000, μ: 97740, ~: 97875)\n[PASS] testFuzz_burnOverBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 93835, ~: 93970)\n[PASS] testFuzz_burnReducesSupplyAndBalanceExactly(uint256,uint256) (runs: 1000, μ: 137113, ~: 137841)\n[PASS] testFuzz_noCallerButTheHolderCanMoveAHolderBalance(address,uint256) (runs: 1000, μ: 96192, ~: 95960)\n[PASS] testFuzz_permitByAnyoneButTheOwnerIsRefused(uint248,uint256) (runs: 1000, μ: 93908, ~: 93854)\n[PASS] testFuzz_permitFromAnyKeyForAnySpenderAndValue(uint248,address,uint256,uint64) (runs: 1000, μ: 148325, ~: 148702)\n[PASS] testFuzz_splitTransferEqualsSingleTransfer(uint256,uint256) (runs: 1000, μ: 180984, ~: 182053)\n[PASS] testFuzz_transferFromSpendsExactlyTheAmount(uint256,uint256) (runs: 1000, μ: 192275, ~: 194315)\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256,uint256) (runs: 1000, μ: 169807, ~: 171320)\n[PASS] test_approveDoesNotRequireABalance() (gas: 116073)\n[PASS] test_approveEmitsApproval() (gas: 61224)\n[PASS] test_approveOverwritesRatherThanAdds() (gas: 133277)\n[PASS] test_burnFromEmptyAccountReverts() (gas: 35167)\n[PASS] test_burnFromOverBalanceWithEnoughAllowanceRevertsOnBalance() (gas: 157058)\n[PASS] test_burnFromSelfNeedsSelfAllowance() (gas: 90694)\n[PASS] test_burnFromWithInfiniteAllowanceKeepsIt() (gas: 163011)\n[PASS] test_burnZeroIsANoOp() (gas: 108400)\n[PASS] test_create2DeploymentMintsToTheDeployingContract() (gas: 1261748)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1239094)\n[PASS] test_deployerCanBurnTheWholeSupply() (gas: 120150)\n[PASS] test_eip5267DomainFields() (gas: 15442)\n[PASS] test_maxMinusOneAllowanceIsDecremented() (gas: 174140)\n[PASS] test_permitAllZeroSignatureReverts() (gas: 65924)\n[PASS] test_permitAtExactDeadlineIsAccepted() (gas: 103511)\n[PASS] test_permitCannotBeReplayedOnAnotherChain() (gas: 193360)\n[PASS] test_permitDoesNotMoveTokensOnlyApproves() (gas: 170176)\n[PASS] test_permitForZeroOwnerReverts() (gas: 77577)\n[PASS] test_permitInvalidVReverts() (gas: 127754)\n[PASS] test_permitMalleableSignatureReverts() (gas: 76461)\n[PASS] test_permitMaxDeadlineAndMaxValue() (gas: 226689)\n[PASS] test_permitOneSecondPastDeadlineReverts() (gas: 53604)\n[PASS] test_permitSignatureIsBoundToThisTokenInstance() (gas: 91812)\n[PASS] test_permitToZeroSpenderReverts() (gas: 71947)\n[PASS] test_permitWithTamperedValueReverts() (gas: 155625)\n[PASS] test_permitWithWrongNonceReverts() (gas: 245158)\n[PASS] test_permitZeroValueClearsAllowance() (gas: 143940)\n[PASS] test_privilegedCallsFromDeployerNeverFreezeOrMoveAHolder() (gas: 467535)\n[PASS] test_sameSaltCannotDeployTwice() (gas: 1040575805)\n[PASS] test_sameTransferTwiceSpendsTwice() (gas: 179917)\n[PASS] test_selfTransferLeavesBalanceUnchanged() (gas: 102893)\n[PASS] test_selfTransferOverBalanceReverts() (gas: 90805)\n[PASS] test_supplyGoesToMsgSenderNotTxOrigin() (gas: 15354)\n[PASS] test_supplyIsExactlyTheRequestedFigure() (gas: 46024)\n[PASS] test_tokenHasNoReceiveOrFallback() (gas: 55011)\n[PASS] test_transferEntireSupplyInOneCall() (gas: 134631)\n[PASS] test_transferFromEmitsTransferButNoApprovalEvent() (gas: 169070)\n[PASS] test_transferFromExactAllowanceZeroesIt() (gas: 208895)\n[PASS] test_transferFromSelfStillNeedsAllowance() (gas: 93333)\n[PASS] test_transferFromWithAllowanceButNoBalanceRevertsOnBalance() (gas: 153212)\n[PASS] test_transferMaxUintReverts() (gas: 38234)\n[PASS] test_transferOneWei() (gas: 139304)\n[PASS] test_transferSupplyPlusOneRevertsEvenForDeployer() (gas: 38172)\n[PASS] test_transferToTokenContractSucceedsAndIsUnrecoverable() (gas: 161235)\n[PASS] test_zeroTransferFromEmptyAccountSucceedsAndEmits() (gas: 53608)\n[PASS] test_zeroTransferToZeroAddressStillReverts() (gas: 32910)\nSuite result: ok. 55 passed; 0 failed; 0 skipped; finished in 68.95ms (612.19ms CPU time)\n\nRan 31 tests for test/MonkeyToken.t.sol:MonkeyTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 95622, ~: 95740)\n[PASS] test_approveAndTransferFrom() (gas: 219313)\n[PASS] test_approveZeroSpenderReverts() (gas: 32928)\n[PASS] test_burnFromRequiresAllowance() (gas: 216370)\n[PASS] test_burnMoreThanBalanceReverts() (gas: 94952)\n[PASS] test_burnedSupplyNeverComesBack() (gas: 173637)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8435)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 32830)\n[PASS] test_deployScriptMintsToCaller() (gas: 2379852)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 100229)\n[PASS] test_domainSeparatorUsesTokenName() (gas: 15862)\n[PASS] test_eachDeploymentIsIndependent() (gas: 21068)\n[PASS] test_holderCanBurnOwnTokens() (gas: 114626)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 180184)\n[PASS] test_launchFlowsArriveWhole() (gas: 284357)\n[PASS] test_metadata() (gas: 64705)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 679657)\n[PASS] test_permitExpiredReverts() (gas: 49923)\n[PASS] test_permitReplayReverts() (gas: 148200)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 115861)\n[PASS] test_permitWrongSignerReverts() (gas: 74979)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1743329)\n[PASS] test_supplyConstantsAgree() (gas: 16336)\n[PASS] test_transferEmitsEvent() (gas: 126209)\n[PASS] test_transferFromEmptyAccountReverts() (gas: 37847)\n[PASS] test_transferFromRevertsOverAllowance() (gas: 145864)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 98041)\n[PASS] test_transferMovesExactAmount() (gas: 164172)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 97682)\n[PASS] test_transferToZeroAddressReverts() (gas: 92623)\n[PASS] test_transferWholeBalanceAndZero() (gas: 176240)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 69.81ms (41.89ms CPU time)\n\nRan 1 test for test/MonkeyToken.invariant.t.sol:MonkeyTokenInvariantTest\n[PASS]\nMonkeyTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchLedger\n[PASS] invariant_balancesMatchLedger\n[PASS] invariant_metadataIsImmutable\n[PASS] invariant_noncesMatchAcceptedPermits\n[PASS] invariant_supplyEqualsSumOfBalances\n[PASS] invariant_supplyIsInitialMinusBurned\n[PASS] invariant_zeroAddressAndTokenHoldNothing\n MonkeyTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+-----------------------+-------+---------+----------╮\n| Contract      | Selector              | Calls | Reverts | Discards |\n+====================================================================+\n| MonkeyHandler | adminCall             | 1079  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | approve               | 1119  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | burn                  | 1089  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | burnFrom              | 1075  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | burnFromOverLimit     | 1123  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | permit                | 1107  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | permitExpired         | 1123  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | permitForged          | 1064  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | transfer              | 2147  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | transferFrom          | 1129  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | transferFromOverLimit | 1058  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | transferOverBalance   | 1102  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | transferToZeroAddress | 1076  | 0       | 0        |\n|---------------+-----------------------+-------+---------+----------|\n| MonkeyHandler | warp                  | 1093  | 0       | 0        |\n╰---------------+-----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.18s (9.18s CPU time)\n\nRan 3 test suites in 9.18s (9.32s CPU time): 87 tests passed, 0 failed, 0 skipped (87 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MonkeyToken.approve(address,uint256)\",\"MonkeyToken.burn(uint256)\",\"MonkeyToken.burnFrom(address,uint256)\",\"MonkeyToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"MonkeyToken.transfer(address,uint256)\",\"MonkeyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":124,\"foundry.toml\":26,\"remappings.txt\":2,\"script/DeployMonkeyToken.s.sol\":25,\"src/MonkeyToken.sol\":39,\"test/MonkeyToken.edge.t.sol\":684,\"test/MonkeyToken.invariant.t.sol\":505,\"test/MonkeyToken.t.sol\":407},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4962383bbb31cddf648ada8f3545dbb6251290cbe0f9fe4dcf039d025a10e526","verifiedTreeHash":"9a1bf617e0c6eb5a997bc2c4a1ae2449a1cac5a3","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":948,"exitCode":0,"name":"build","output":"Compiling 43 files with Solc 0.8.26\nSolc 0.8.26 finished in 850.54ms\nCompiler run successful!\n","passed":true},{"durationMs":82,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/MonkeyToken.t.sol:MonkeyTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 95466, ~: 95752)\n[PASS] test_approveAndTransferFrom() (gas: 219313)\n[PASS] test_approveZeroSpenderReverts() (gas: 32928)\n[PASS] test_burnFromRequiresAllowance() (gas: 216370)\n[PASS] test_burnMoreThanBalanceReverts() (gas: 94952)\n[PASS] test_burnedSupplyNeverComesBack() (gas: 173637)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8435)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 32830)\n[PASS] test_deployScriptMintsToCaller() (gas: 2379852)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 100229)\n[PASS] test_domainSeparatorUsesTokenName() (gas: 15862)\n[PASS] test_eachDeploymentIsIndependent() (gas: 21068)\n[PASS] test_holderCanBurnOwnTokens() (gas: 114626)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 180184)\n[PASS] test_launchFlowsArriveWhole() (gas: 284357)\n[PASS] test_metadata() (gas: 64705)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 679657)\n[PASS] test_permitExpiredReverts() (gas: 49923)\n[PASS] test_permitReplayReverts() (gas: 148200)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 115861)\n[PASS] test_permitWrongSignerReverts() (gas: 74979)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1743329)\n[PASS] test_supplyConstantsAgree() (gas: 16336)\n[PASS] test_transferEmitsEvent() (gas: 126209)\n[PASS] test_transferFromEmptyAccountReverts() (gas: 37847)\n[PASS] test_transferFromRevertsOverAllowance() (gas: 145864)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 98041)\n[PASS] test_transferMovesExactAmount() (gas: 164172)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 97682)\n[PASS] test_transferToZeroAddressReverts() (gas: 92623)\n[PASS] test_transferWholeBalanceAndZero() (gas: 176240)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 6.69ms (16.40ms CPU time)\n\nRan 1 test suite in 7.27ms (6.69ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MonkeyToken.approve(address,uint256)\",\"MonkeyToken.burn(uint256)\",\"MonkeyToken.burnFrom(address,uint256)\",\"MonkeyToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"MonkeyToken.transfer(address,uint256)\",\"MonkeyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":124,\"foundry.toml\":26,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployMonkeyToken.s.sol\":25,\"src/MonkeyToken.sol\":39,\"test/MonkeyToken.t.sol\":407},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9bdd7adcaaa970317d43e1235e6b84b9feabc20c03b9db93a6fa9f6350012992","verifiedTreeHash":"2ad3fca207f16a60b2d790345dd21a5da217c350","verifierVersion":"0.1.0+fdeb4d4a"}]}