{"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":"3d269e12-94da-4655-8df4-f307aa430315","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"6d8b34fdc099e1d829bd4bfc8297ad173f5215c03e6ce8121f11923ab1bc4598","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":"470d32c3ec8942d2f0f0bf52fd5aa042d5b7b73b780759c9b1b8bf6b48ab31d7","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":"9f3a0fd70dedf92c6f1a541d25b87ade8d90c46806ec1ae5bafed43dd5dd78b1","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":"08d382da012b56b97fa25001edc1d6b2fe6300da3132c5e8f677c16b1c835fc7","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":"d613124d5821c830acdaf2d769ce7f85774731f75ae9f5f4b7b790f4b2e2e416","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":"93d70bd2f3f2f365df4749fcb1ad43a4d64954a86d9ce740788f673235138256","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":"80b8be18dce3fc97408d10dadf31052ebd3c2293c3a4af50af38aecf0d6da9df","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"59fef502eb13aade3805f1eda2943174747f62596f5d6796c15c1325a76d6f99","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: Messenger (MAIL).\nToken name: Messenger\nToken symbol: MAIL\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"9c0b29566035dca403ea0f527ab0995c02a4e004727af5de4c22c7b8a2202dee","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"3d269e12-94da-4655-8df4-f307aa430315","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2301-messenger"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51141","feedbackHash":"371b68bb906bf929d4a1623fc16b6170b13c8abeace2299c1668d99b2eead12e","nodeKey":"audit_economics","submissionHash":"6d8b34fdc099e1d829bd4bfc8297ad173f5215c03e6ce8121f11923ab1bc4598","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52161","feedbackHash":"9c11ae0628694f09b330f4f658a87625b99f03ccd82580f08ff49a055aa43e77","nodeKey":"audit_flow","submissionHash":"470d32c3ec8942d2f0f0bf52fd5aa042d5b7b73b780759c9b1b8bf6b48ab31d7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52130","feedbackHash":"1116bd1320b160bba1a7be9dd0cf36b6663d5e3af59bb5ec5e26d12417c82269","nodeKey":"audit_judge","submissionHash":"9f3a0fd70dedf92c6f1a541d25b87ade8d90c46806ec1ae5bafed43dd5dd78b1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51484","feedbackHash":"ed6280534205a1ed2a068814c2396685d5d0bae73ccc7739925264a69535b5aa","nodeKey":"audit_math","submissionHash":"08d382da012b56b97fa25001edc1d6b2fe6300da3132c5e8f677c16b1c835fc7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53929","feedbackHash":"0d08d5e738888b468b765322eef5a1ed3f8a61d64302e20b0748851b656a6876","nodeKey":"audit_permissions","submissionHash":"d613124d5821c830acdaf2d769ce7f85774731f75ae9f5f4b7b790f4b2e2e416","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51746","feedbackHash":"9988754a31dcc6d9c495b5895ae294d79e3ecacdc8531a927bbebd74e6e9944a","nodeKey":"build_contract_project","submissionHash":"93d70bd2f3f2f365df4749fcb1ad43a4d64954a86d9ce740788f673235138256","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"53925","feedbackHash":"08c0cb3ad1cf218b972533d0e4563b6e78532b27d322b811dc711ccf623c669a","nodeKey":"manifest","submissionHash":"80b8be18dce3fc97408d10dadf31052ebd3c2293c3a4af50af38aecf0d6da9df","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52144","feedbackHash":"4c044703b84cf373c6a4a5b752b939e686b3a96cf2a8c538e6d27b163741c1ac","nodeKey":"write_foundry_tests","submissionHash":"59fef502eb13aade3805f1eda2943174747f62596f5d6796c15c1325a76d6f99","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3e194c0ef2015935661ed6efb670bcca26d79230510a58cd1a66faf772e0129a","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6ed09c2eb1ff6aec","findings":[],"hash":"08d382da012b56b97fa25001edc1d6b2fe6300da3132c5e8f677c16b1c835fc7","nodeId":"f4bf0438-9b2d-414f-8c6d-9fe92870e03f","outcome":"completed","summary":"I found no defects in the math area, so `.imd-findings.json` has an empty findings list plus coverage rows. I did not run the Foundry tests; with no finding, there was nothing to prove.\n\nThere is very little math to check. `src/Messenger.sol` is a standard OpenZeppelin ERC20 with nothing changed. Its constructor mints `INITIAL_SUPPLY = 1_000_000_000 * 10 ** 18`, worked out at compile time, to the deployer once. That matches the stated 1,000,000,000 supply with 18 decimals. There are no fees, burns, tax rates, division or extra mint paths, so nothing can round, lose precision or overflow.\n\nCoverage rows, all `holds`:\n- **`Messenger.approve(address,uint256)`:** standard OpenZeppelin behaviour with no arithmetic. It reverts for a zero-address spender, and the maximum allowance is never decreased.\n- **`Messenger.transfer(address,uint256)`:** the balance subtraction is checked and moves the exact amount. Sending more than the balance reverts; zero and full-balance transfers are exact.\n- **`Messenger.transferFrom(address,address,uint256)`:** the allowance decrease is checked, and a `type(uint256).max` allowance is not decreased.\n- **Supply invariant:** total supply stays fixed at 10^27 units because nothing after the constructor can mint or burn.\n\nThe aderyn \"large numeric literal\" lead at `src/Messenger.sol:10` is only a style note. The value is correct, so I didn't report it.","treeHash":null,"usage":{"cachedInputTokens":94917,"inputTokens":6,"model":"claude-opus-5-5","outputTokens":1215,"runtime":"claude","turns":3,"wallClockMs":14938}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca075d17c94a854b","findings":[{"citation":"resolved","description":"Periphery guide: the base contract Messenger inherits (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol) is trusted implicitly, and DEPENDENCIES.md tells a reviewer to confirm it is unmodified upstream via the per-directory SHA256SUMS. Those checksum files record the hashes of the upstream v5.1.0 / v1.9.6 release files, but the files actually present in lib/ were re-formatted after vendoring (forge fmt line-wrapping), so `sha256sum -c SHA256SUMS` fails for 2 of 6 OpenZeppelin entries (ERC20.sol, draft-IERC6093.sol) and 18 of 26 forge-std entries. I fetched both upstream archives (archive SHA-256 values match those stated in DEPENDENCIES.md) and compared every vendored file with all whitespace stripped: all are identical to upstream, so there is no semantic change to ERC20.sol or any other file and the compiled Messenger bytecode is the genuine OpenZeppelin v5.1.0 implementation. The defect is that the repository's own integrity check is broken: a verifier or auditor following DEPENDENCIES.md gets a failed check and cannot tell a benign reformat from a tampered base contract without doing the upstream diff by hand. Minimal fix: either restore the byte-exact upstream files (and exclude lib/ from forge fmt) or regenerate SHA256SUMS from the files as shipped and state in DEPENDENCIES.md that they were reformatted. Not a bytecode or funds-safety issue; no proof test is attached because the failure is in the provenance record, not in Solidity behaviour.","line":3,"path":"DEPENDENCIES.md","reproduction":"State: the tree as committed (461d63e). Input: `cd lib/openzeppelin-contracts && sha256sum -c SHA256SUMS`. Expected (per DEPENDENCIES.md line 3): every line OK. Actual: `contracts/interfaces/draft-IERC6093.sol: FAILED`, `contracts/token/ERC20/ERC20.sol: FAILED`, `WARNING: 2 computed checksums did NOT match`. Likewise `cd lib/forge-std && sha256sum -c SHA256SUMS` reports 18 FAILED. Confirming cause: `diff -u` of lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol against upstream v5.1.0 (archive sha256 8a3b08cf…) differs only at the `_approve(address,address,uint256,bool)` signature, which was wrapped onto four lines; draft-IERC6093.sol differs only at the `ERC1155InsufficientBalance` error declaration wrapped onto three lines. The recorded hashes be0df7e4… and 56380323… are exactly the upstream files' hashes, so the SHA256SUMS were generated from upstream before the reformat, not from the vendored files.","severity":"low","snippet":"These ordinary source files are included for builds without network access. No submodules or package installation are required. Upstream sources are unmodified. SHA256SUMS in each dependency directory records the included files.","title":"Vendored dependency checksum files do not match the vendored sources, contradicting the 'unmodified upstream' provenance claim"}],"hash":"470d32c3ec8942d2f0f0bf52fd5aa042d5b7b73b780759c9b1b8bf6b48ab31d7","nodeId":"c4113c84-37db-4221-8b76-48900320bfcf","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds one low finding and eight coverage rows. The working tree is otherwise untouched.\n\n**Result:** the Messenger token is a plain, unmodified OpenZeppelin v5.1.0 ERC20 with a single constructor mint, and all three entry points hold.\n\n- **approve** reverts for a zero spender, overwrites the allowance, emits Approval, and treats max uint256 as the documented infinite sentinel. The classic approve race is a known ERC20 property the README already documents, not a defect of the requested design.\n- **transfer** reverts for a zero receiver or insufficient balance, moves exact amounts with no fee or burn, handles self-transfer correctly, and makes no external calls.\n- **transferFrom** spends the allowance before moving tokens, so any later revert unwinds atomically. The factory cannot pull a holder's balance without an approval.\n- **Constructor and supply** mint exactly one billion tokens with 18 decimals to msg.sender once. No mint, burn, owner, pause or upgrade path exists afterwards. The deployed runtime contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, PUSH0 or transient-storage opcodes.\n- **Existing suite** builds and passes under the README's fuzz seed. The formatter check also passes.\n\n**One low finding, in the Periphery area.** The dependency notes say the vendored sources are unmodified upstream and point to per-directory checksum files for proof. Running `sha256sum -c` fails for two OpenZeppelin files and eighteen forge-std files. I fetched both upstream archives, whose hashes match what the notes state, and compared every file with whitespace stripped. All are identical to upstream, so this is a forge fmt reformat after vendoring and the compiled bytecode is genuine OpenZeppelin. The defect is a broken provenance record: a verifier following the notes gets a failure and cannot distinguish a reformat from a tampered base contract without redoing that diff. No proof test is attached since the failure is not in Solidity behaviour.\n\n**Not reached:** a live Uniswap v4 seed and swap, since no v4 sources exist in this tree. Nothing in the token's transfer logic could treat the pool manager differently from any other address, so I see no token-side risk there.","treeHash":null,"usage":{"cachedInputTokens":682894,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":11748,"runtime":"claude","turns":23,"wallClockMs":174153}},{"artifacts":[],"attempt":1,"bundleHash":"624526d6833902a989c6c1159ae576130317636decf2b72ef0ff53d9d0a7c249","device":"5f419f6fdfb42f37","findings":[],"hash":"59fef502eb13aade3805f1eda2943174747f62596f5d6796c15c1325a76d6f99","nodeId":"2a4b8868-ffbd-49a4-8e1e-a8530842e68a","outcome":"completed","summary":"Added boundary and failure-path tests, plus stateful invariants tracking supply, balances, and allowances across valid and rejected calls.\n\nOffline `forge build` and `forge test` passed with the required seed: **52 tests passed**, including **32,768 invariant calls**.\n\nOnly `test/` files changed. No implementation defects found.","treeHash":"8f13a9d6125e81f18a87dd88d75193716e71d73e","usage":{"cachedInputTokens":1148288,"inputTokens":66872,"model":"gpt-6-astra","outputTokens":14237,"runtime":"codex","turns":5,"wallClockMs":463288}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7d454e6cee88c390","findings":[{"citation":"resolved","description":"DEPENDENCIES.md states that the vendored OpenZeppelin v5.1.0 sources are unmodified and that lib/openzeppelin-contracts/SHA256SUMS records the included files. Two of the six vendored files fail that checksum: contracts/token/ERC20/ERC20.sol (recorded be0df7e4..., actual 41a3a141...) and contracts/interfaces/draft-IERC6093.sol (recorded 56380323..., actual de6e5bd9...). The recorded hashes are the genuine upstream v5.1.0 hashes (confirmed by downloading the files from the v5.1.0 tag); the vendored copies were reformatted after vendoring (forge fmt line-wrapped the `_approve(..., bool emitEvent)` signature at ERC20.sol:280-283 and the `ERC1155InsufficientBalance` error at draft-IERC6093.sol:121-123). The diff is whitespace only: compiling the project with the pristine upstream files produces byte-identical Messenger runtime bytecode (sha256 4c9e842d... for both). So there is no behavioral or economic impact on the token. The defect is that the documented verification step, the one thing that lets a reviewer or the launch operator confirm the transfer/allowance logic the whole token relies on is really OpenZeppelin's, fails as shipped, and the provenance statement in DEPENDENCIES.md is untrue. Fix: either restore the two files to their upstream bytes (re-extract from the v5.1.0 archive whose SHA-256 is already recorded) and exclude lib/ from `forge fmt`, or regenerate SHA256SUMS from the files actually shipped and drop the 'unmodified' wording. Restoring the upstream bytes is the better fix because it keeps the recorded archive hash meaningful.","line":3,"path":"DEPENDENCIES.md","reproduction":"State: the working tree at commit 461d63e. Run from the repository root:\n\n  cd lib/openzeppelin-contracts && sha256sum -c SHA256SUMS\n\nExpected (per DEPENDENCIES.md): all six lines report OK.\nActual:\n  contracts/interfaces/draft-IERC6093.sol: FAILED\n  contracts/token/ERC20/ERC20.sol: FAILED\n  sha256sum: WARNING: 2 computed checksums did NOT match\n  (exit status 1)\n\nConfirming it is whitespace only: curl the two files from https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v5.1.0/... and `diff` them against the vendored copies; the only hunks are ERC20.sol line 280 (one-line `function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {` wrapped onto four lines) and draft-IERC6093.sol line 121 (the `ERC1155InsufficientBalance` error declaration wrapped onto three lines). Building a copy of the project with the upstream files swapped in and comparing `forge inspect src/Messenger.sol:Messenger deployedBytecode` yields identical output, so the token's economics are unaffected.","severity":"low","snippet":"These ordinary source files are included for builds without network access. No submodules or package installation are required. Upstream sources are unmodified. SHA256SUMS in each dependency directory records the included files.","title":"Vendored OpenZeppelin ERC20.sol and draft-IERC6093.sol do not match the recorded SHA256SUMS; the 'unmodified upstream' provenance claim is false"}],"hash":"6d8b34fdc099e1d829bd4bfc8297ad173f5215c03e6ce8121f11923ab1bc4598","nodeId":"ab982d0d-f464-43f6-a9da-f9d988fa8d97","outcome":"completed","summary":"The review is complete and the working tree is clean.\n\n**Outcome.** The Messenger token's economics hold. It is a verbatim OpenZeppelin v5.1.0 ERC-20 with one constructor mint of 1e27 units to the factory, no owner, no fee, no hook, no callback, and no path that can grow supply or move a holder's balance. I found one low-severity defect, recorded in `.imd-findings.json` with a reproduction.\n\n**Finding (low).** DEPENDENCIES.md claims the vendored OpenZeppelin sources are unmodified and hash-recorded, but `sha256sum -c` fails on two files. I downloaded the upstream v5.1.0 files and diffed them. The differences are whitespace only, from a formatter line-wrapping two declarations. A build with the pristine files produces byte-identical runtime bytecode, so there is no economic impact. The defect is a false provenance claim that breaks the documented verification step. Suggested fix: restore the upstream bytes and keep lib out of the formatter, or regenerate the checksums.\n\n**What I checked against the three guides:**\n- Economic Security: no external dependencies, oracles, fees or sentinel-address quirks beyond standard zero-address reverts. ERC-20 surface is exactly approve, transfer and transferFrom plus views. No receive or fallback.\n- Invariant: supply constant after construction, balances conserved, allowance accounting exact. Confirmed by the repo's invariant suite and a scratch fuzz I ran and then deleted.\n- Flow Gap: the launch split, distributor claim, and the Uniswap v4 sync/transfer/settle pattern all move the exact amount. The pristine-upstream build comparison closes the \"modified library\" seam.\n\n**Coverage record.** All three listed entry points are marked holds, with six invariant and flow rows also holds and one provenance row pointing at the finding. Nothing was left unreached.\n\n**Verification run.** Full suite with the documented seed: 32 tests passed. Formatting check passed. Scratch probes passed and were removed. Only ignored build output and the findings file remain outside the committed tree.","treeHash":null,"usage":{"cachedInputTokens":820584,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":15185,"runtime":"claude","turns":29,"wallClockMs":233424}},{"artifacts":[],"attempt":1,"bundleHash":"ae1ff63e7c701219e154be5ae1b42b6d17f7f15ec9d85a0dbcf40c6ab325f552","device":"96ecbe9236c400bb","findings":[],"hash":"80b8be18dce3fc97408d10dadf31052ebd3c2293c3a4af50af38aecf0d6da9df","nodeId":"aa2e54f9-f4bb-4f6b-987a-378cc5a7e52b","outcome":"completed","summary":"Wrote launch.json for the Messenger (MAIL) launch. It is the only changed file.\n\n**What the manifest says**\n- Token contract is Messenger, name Messenger, symbol MAIL, decimals 18. Its constructor takes no arguments, so constructorArgs is empty, matching the ABI reported by forge inspect.\n- totalSupply is one billion tokens in minor units, exactly what the constructor mints to msg.sender via INITIAL_SUPPLY.\n- contracts is empty. The accepted tree contains only the token, with no application contracts and no initialization calls.\n- pool and economics are copied verbatim from the launch reference, with IMD as the paired currency, fee 12500 and tick spacing 60.\n- notes describe the token's fixed supply and lack of any privileged mechanism, well under the 4000-character limit.\n\n**Checks run**\n- A script confirmed the manifest's key set, the supply figure, and that pool and economics match the job byte for byte.\n- forge build compiled cleanly.\n- forge test with the verifier's fuzz seed passed all 32 tests across 3 suites, including the invariant suite.\n- git status shows launch.json as the only new or modified file.","treeHash":"e1e60b3b9486a399ec754ed99cd671aa00933c2c","usage":{"cachedInputTokens":183747,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3244,"runtime":"claude","turns":10,"wallClockMs":52276}},{"artifacts":[],"attempt":1,"bundleHash":"f6c57aae10f05dce088f49619ce7c5d63986e666af379ac76c8e648cbe1e4393","device":"1c0fa8d0cf677236","findings":[],"hash":"93d70bd2f3f2f365df4749fcb1ad43a4d64954a86d9ce740788f673235138256","nodeId":"87d7211e-d0e8-4646-afb4-01b07553788b","outcome":"completed","summary":"Implemented Messenger (MAIL): 1 billion tokens, 18 decimals, minted once to the deployer. No additional minting or administrative controls.\n\nDependencies are vendored for offline builds. README documents deployment parameters, assumptions, and operational responsibilities.\n\nValidation passed:\n\n- `forge build` with Solidity 0.8.26\n- `forge test`: 32 tests passed using the specified fuzz seed\n- `forge fmt --check`\n\nFull launch/Uniswap integration checks remain with the network verifier.","treeHash":"d03cb9b5abd480e4e60dd110927b830bff6a9bee","usage":{"cachedInputTokens":584704,"inputTokens":53734,"model":"gpt-6-astra","outputTokens":12174,"runtime":"codex","turns":5,"wallClockMs":346164}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1c29c7c6e4cf57eb","findings":[{"citation":"resolved","description":"Merged from audit_economics (491a01de) and audit_flow (bfb7a298), which have the same root cause: the vendored files in lib/ were run through forge fmt after their checksums were recorded. DEPENDENCIES.md says the sources are unmodified and that SHA256SUMS records them, but the integrity check it describes fails. lib/openzeppelin-contracts: 2 of 6 entries fail (contracts/token/ERC20/ERC20.sol and contracts/interfaces/draft-IERC6093.sol). lib/forge-std: 18 of 26 entries fail. The recorded hashes are the real upstream v5.1.0 hashes. The only differences are line wraps: ERC20.sol:280-283 (the _approve(address,address,uint256,bool) signature) and draft-IERC6093.sol:121-123 (the ERC1155InsufficientBalance error). So Messenger's behaviour and bytecode are the genuine OpenZeppelin ERC20 and no funds are at risk. The harm is that the provenance check is broken: anyone who follows DEPENDENCIES.md gets FAILED and cannot tell a harmless reformat from a tampered base contract without diffing against upstream by hand. Fix: restore the upstream bytes of the reformatted files (and keep lib/ out of forge fmt), or regenerate SHA256SUMS from the shipped files and drop the 'unmodified' wording.","line":3,"path":"DEPENDENCIES.md","reproduction":"State: tree at 3c70d94. Run `cd lib/openzeppelin-contracts && sha256sum -c SHA256SUMS`. Expected per DEPENDENCIES.md:3: all OK. Actual: 'contracts/interfaces/draft-IERC6093.sol: FAILED', 'contracts/token/ERC20/ERC20.sol: FAILED', 'WARNING: 2 computed checksums did NOT match'. Running `cd lib/forge-std && sha256sum -c SHA256SUMS` gives 'WARNING: 18 computed checksums did NOT match'. Run curl on raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v5.1.0/contracts/token/ERC20/ERC20.sol: its sha256 is be0df7e4b899a61a4beb3c8675088de494866438600ce2d529523807b558cf64, which equals the SHA256SUMS line 3 entry. `diff` against the vendored copy shows only hunk 280c280,283 (the signature wrapped onto four lines). draft-IERC6093.sol upstream sha256 is 56380323009ef4a119d44550b910fde1bff9cedde8f7f4c690152c7629bc3338, and its diff is only 121c121,123.","severity":"low","snippet":"These ordinary source files are included for builds without network access. No submodules or package installation are required. Upstream sources are unmodified. SHA256SUMS in each dependency directory records the included files.","title":"Vendored dependency SHA256SUMS fail against the shipped files; DEPENDENCIES.md 'Upstream sources are unmodified' is untrue (whitespace-only reformat, no bytecode impact)"}],"hash":"9f3a0fd70dedf92c6f1a541d25b87ade8d90c46806ec1ae5bafed43dd5dd78b1","nodeId":"787bd952-a9f0-41b2-9add-7ad7977049e2","outcome":"completed","summary":"I found one low-severity finding and nothing that blocks deployment. The token code itself holds up. The findings and coverage record are in `.imd-findings.json`.\n\n**The one finding (low): the dependency checksums don't match, which also covers both specialist reports.** The economics and flow specialists reported the same problem, so I merged their two findings into one.\n- **Where:** `DEPENDENCIES.md:3` says \"Upstream sources are unmodified\" and that the `SHA256SUMS` files record the included files.\n- **What I saw:** running `sha256sum -c SHA256SUMS` fails for 2 of 6 files in `lib/openzeppelin-contracts` (`ERC20.sol` and `draft-IERC6093.sol`) and 18 of 26 in `lib/forge-std`.\n- **Cause:** I downloaded the v5.1.0 originals. Their hashes match the recorded ones exactly (`be0df7e4…`, `56380323…`). The vendored copies differ only by line wrapping from `forge fmt`, at `ERC20.sol:280-283` and `draft-IERC6093.sol:121-123`.\n- **Impact:** none on behaviour or funds. The damage is that the integrity check the docs point to fails, so a reviewer can't tell a harmless reformat from a tampered base contract without diffing against upstream by hand.\n- **Fix:** restore the original upstream files, or regenerate the checksums and drop the \"unmodified\" wording. Both options touch `lib/` except a wording-only change to `DEPENDENCIES.md`.\n\n**Coverage, my own checks:**\n- **`approve`, `transfer`, `transferFrom`: holds.** `Messenger` adds nothing to the standard OpenZeppelin v5.1.0 ERC20: no fees, burns, exemptions, owner, mint, pause or blacklist. Every launch transfer moves exactly the amount requested.\n- **Supply: holds.** The constructor mints 1,000,000,000 × 10^18 once to the deployer, matching `totalSupply` in `launch.json`. The static-analysis \"large numeric literal\" warning is correct code, not a defect.\n- **Deployability: holds.** The constructor takes no arguments, matching the empty `constructorArgs`. The contract is 1,814 bytes deployed and 2,722 bytes of creation code, far under both limits. It uses no `DELEGATECALL`, `SELFDESTRUCT` or linked libraries.\n- **Manifest:** `launch.json` uses only schema keys and its types and addresses are valid. I couldn't check `economics` against the original job, because the job's values weren't given to me.\n- **Tests:** `forge build` succeeds and all 52 tests pass. I couldn't run the protected floor tests here, because the files they import (`floor/OwnerChecks.sol`, `src/LaunchLiquidity.sol`, v4-core) aren't in this tree.\n\nI modified no repository files. However, `git status` lists files I didn't create: shell profiles, `.claude/`, `.gitmodules`, `.mcp.json`, `.idea`, `.vscode` and others. They need removing before upload, or the submission may be rejected for touching files.","treeHash":null,"usage":{"cachedInputTokens":282865,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":4820,"runtime":"claude","turns":7,"wallClockMs":80232}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"23617eab0c5242d6","findings":[],"hash":"d613124d5821c830acdaf2d769ce7f85774731f75ae9f5f4b7b790f4b2e2e416","nodeId":"134a4fc5-e696-4631-8a29-7ea926f17f2a","outcome":"completed","summary":"I found no defects in the permissions area (access control, trust gaps and asymmetry), so `.imd-findings.json` has an empty findings list plus a coverage record.\n\n**What the token is:** `src/Messenger.sol` is a plain OpenZeppelin v5 `ERC20` with nothing overridden. Its constructor mints `1_000_000_000 * 10 ** 18` once to `msg.sender`, which is the factory at launch.\n\n**Access control:** There is no owner, role, mint, burnFrom, pause, blacklist or upgrade function anywhere. No external path reaches `_mint` or `_burn`, so the supply can't grow after deployment and no privileged account can move or freeze a holder's balance.\n\n**Trust gaps and asymmetry:** The token has no fees, burns or exempt addresses on transfer. Every account follows the same rules, so the transfers from the factory to the distributor, from the distributor to claimants, the pool seed and swaps all move exactly what they say.\n\n**Entry points** (all marked `holds` in the coverage record, along with two invariant rows: supply can't grow, launch flows are exact):\n- `approve`: the caller can only set its own allowance, and a zero spender reverts.\n- `transfer`: moves only the caller's balance, and reverts on an insufficient balance or the zero address as receiver.\n- `transferFrom`: the allowance is checked and spent before the balance moves, and no privileged path skips that check. An unlimited (max) allowance isn't decremented, which is standard ERC-20 behaviour.\n\n**Static-analysis lead:** Aderyn flagged a large numeric literal at `Messenger.sol:10`. That's the supply constant, written with digit separators, and it's correct, so it isn't a defect.\n\nThe project's 32 existing tests all pass under `forge test`. I had nothing to prove, so I wrote no scratch tests. I traced the vendored OpenZeppelin source directly but didn't check it against the upstream release.","treeHash":null,"usage":{"cachedInputTokens":177075,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":2144,"runtime":"claude","turns":5,"wallClockMs":29985}}],"verification":[{"checks":[{"durationMs":1609,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.54s\nCompiler run successful!\n","passed":true},{"durationMs":11934,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/MessengerLaunch.t.sol:MessengerLaunchTest\n[PASS] test_create2MintsEverythingToImmediateFactory() (gas: 312474)\n[PASS] test_launchDistributionClaimsAndPoolTransfersAreExact() (gas: 652645)\n[PASS] test_runtimeIsDeployableAndHasNoForbiddenOpcodes() (gas: 2506744)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.04ms (8.45ms CPU time)\n\nRan 28 tests for test/Messenger.t.sol:MessengerTest\n[PASS] testFuzz_delegatedTransfer(uint256,uint256) (runs: 512, μ: 164703, ~: 165813)\nLogs:\n  Bound result 0\n  Bound result 10000000000000000000\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 93038, ~: 93274)\nLogs:\n  Bound result 320052460860322877726336903\n\n[PASS] testFuzz_transferMoreThanAllowanceReverts(uint256,uint256) (runs: 512, μ: 124024, ~: 124552)\nLogs:\n  Bound result 999999999999999999999999998\n  Bound result 2\n\n[PASS] testFuzz_transferMoreThanBalanceReverts(uint256,uint256) (runs: 512, μ: 127972, ~: 128261)\nLogs:\n  Bound result 5081\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129634853\n\n[PASS] test_approveReplacesAllowanceAndCanRevoke() (gas: 172738)\n[PASS] test_approveSetsAllowanceAndEmitsEvent() (gas: 76243)\n[PASS] test_approveZeroSpenderReverts() (gas: 30572)\n[PASS] test_constructorEmitsMintTransfer() (gas: 5469)\n[PASS] test_deployerCannotSpendHoldersTokensWithoutApproval() (gas: 158847)\n[PASS] test_entireSupplyCanMoveAndReturn() (gas: 146968)\n[PASS] test_failedTransferFromPreservesAllowanceAndBalances() (gas: 126979)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 215169)\n[PASS] test_metadataAndInitialSupply() (gas: 108332)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 771351)\n[PASS] test_rejectsNativeCurrency() (gas: 42634)\n[PASS] test_selfTransferFromConsumesAllowanceWithoutChangingBalance() (gas: 114047)\n[PASS] test_selfTransferPreservesBalance() (gas: 51431)\n[PASS] test_transferFromCanExhaustAllowance() (gas: 162593)\n[PASS] test_transferFromConsumesAllowanceAndEmitsTransfer() (gas: 160555)\n[PASS] test_transferFromEmptyAccountReverts() (gas: 45142)\n[PASS] test_transferFromToZeroRevertsAndPreservesAllowance() (gas: 114857)\n[PASS] test_transferFromZeroSenderReverts() (gas: 35530)\n[PASS] test_transferMovesExactAmountAndEmitsEvent() (gas: 93504)\n[PASS] test_transferToZeroReverts() (gas: 47749)\n[PASS] test_unapprovedSpenderCannotTransfer() (gas: 116508)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63082)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78790)\n[PASS] test_zeroTransferToZeroReverts() (gas: 30620)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 79.49ms (303.21ms CPU time)\n\nRan 19 tests for test/MessengerEdges.t.sol:MessengerEdgesTest\n[PASS] testFuzz_delegatedOverdraftRestoresAllowanceAndCanRecover(uint256,uint256,bool) (runs: 1000, μ: 303000, ~: 301715)\nLogs:\n  Bound result 1652551\n  Bound result 16627146656004\n\n[PASS] testFuzz_invalidRecipientRollsBackAllowanceAndCanRecover(uint256,uint256) (runs: 1000, μ: 229473, ~: 230704)\nLogs:\n  Bound result 16183\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129634299\n\n[PASS] testFuzz_replacingApprovalDoesNotAffectOtherOwnerOrSpender(uint256,uint256,uint256,uint256) (runs: 1000, μ: 318087, ~: 318955)\n[PASS] testFuzz_splitDelegatedTransferMatchesSingleTransfer(uint256,uint256,uint256) (runs: 1000, μ: 377509, ~: 379905)\nLogs:\n  Bound result 2322626299639939\n  Bound result 1281310265586776\n  Bound result 115792089237316195423570985008687907853269984665640564039457583253397935938506\n\n[PASS] testFuzz_transferRoundTripRestoresBalancesAndApprovals(uint256,uint256,uint256) (runs: 1000, μ: 258700, ~: 260764)\nLogs:\n  Bound result 145522249763734\n  Bound result 42768382662590\n\n[PASS] test_approvalBeforeFundingCannotCreateTokensAndWorksAfterFunding() (gas: 283831)\n[PASS] test_delegatedSelfTransferCannotBypassBalanceCheck() (gas: 118100)\n[PASS] test_entireSupplyCanBeSpentWithExactApprovalOnlyOnce() (gas: 193282)\n[PASS] test_holderMustAuthorizeItselfToUseTransferFrom() (gas: 248722)\n[PASS] test_infiniteApprovalCanBeReducedAndRevoked() (gas: 307229)\n[PASS] test_largestFiniteAllowanceIsConsumed() (gas: 237716)\n[PASS] test_maximumAllowanceDoesNotAuthorizeAnOverdraft() (gas: 129821)\n[PASS] test_oneWeiCanBeTransferredAndSpentWithExactApproval() (gas: 220868)\n[PASS] test_selfTransferStillRequiresSufficientBalance() (gas: 50878)\n[PASS] test_tokensSentToTokenContractRemainPartOfSupply() (gas: 183255)\n[PASS] test_transferOfMaximumAmountRevertsWithoutOverflowOrMinting() (gas: 65705)\n[PASS] test_zeroAmountCannotBypassInvalidReceiverOrSpender() (gas: 112315)\n[PASS] test_zeroDelegatedTransferEmitsEventWithoutConsumingApproval() (gas: 139684)\n[PASS] test_zeroSenderCannotTransferOrApprove() (gas: 101597)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 79.49ms (393.41ms CPU time)\n\nRan 2 tests for test/MessengerInvariant.t.sol:MessengerInvariantTest\n[PASS]\nMessengerInvariantTest invariants:\n[PASS] invariant_allowancesMatchApprovalsAndSuccessfulSpends\n[PASS] invariant_eachBalanceMatchesAuthorizedTransfers\n[PASS] invariant_supplyAndBalancesAreConserved\n MessengerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+-------------------------+-------+---------+----------╮\n| Contract         | Selector                | Calls | Reverts | Discards |\n+=========================================================================+\n| MessengerHandler | approve                 | 3012  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | approveBoundary         | 3022  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | approveZeroSpender      | 3013  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transfer                | 2894  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferFrom            | 2961  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferFromOverBalance | 3023  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferFromToZero      | 2945  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferFullBalance     | 2965  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferOverAllowance   | 3018  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferOverBalance     | 2926  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| MessengerHandler | transferToZero          | 2989  | 0       | 0        |\n╰------------------+-------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 9\n  Bound result 64\n  Bound result 5219\n  Bound result 4999999999999999998\n  Bound result 37579299433648874\n  Bound result 255\n  Bound result 2852\n  Bound result 1000000000000000000\n  Bound result 11\n  Bound result 255\n  Bound result 3212548\n  Bound result 1\n  Bound result 10399741253477432206960348\n  Bound result 4228666473\n  Bound result 1\n  Bound result 9\n  Bound result 36582452221695816640816152064916231560184162941481722032537015\n  Bound result 6757\n  Bound result 0\n  Bound result 13\n  Bound result 242\n  Bound result 13\n  Bound result 9912\n  Bound result 0\n  Bound result 8567\n  Bound result 0\n  Bound result 18\n  Bound result 0\n  Bound result 17856008290252886083353315288710101631019015333421334653299337\n  Bound result 499999995000000000000000020\n  Bound result 127\n  Bound result 8560\n  Bound result 2172\n  Bound result 153531187496069555252751789\n  Bound result 771071070449272704128893283\n  Bound result 22\n  Bound result 1\n  Bound result 8695\n  Bound result 0\n  Bound result 244\n  Bound result 7939\n  Bound result 0\n  Bound result 0\n  Bound result 4622\n  Bound result 648\n  Bound result 207\n  Bound result 1434\n  Bound result 8048\n  Bound result 3\n  Bound result 0\n  Bound result 4\n  Bound result 96\n  Bound result 35000000000000000000\n  Bound result 96\n  Bound result 0\n  Bound result 154584485133346364573191188\n  Bound result 256581782487179755988992015475619906248110440\n  Bound result 3432\n  Bound result 1207\n  Bound result 7245\n  Bound result 0\n  Bound result 95\n  Bound result 495790613316\n  Bound result 132306549174415311\n  Bound result 12\n  Bound result 7123\n  Bound result 3913\n  Bound result 18\n  Bound result 2\n  Bound result 9063\n  Bound result 2757\n  Bound result 1889567282\n  Bound result 6\n  Bound result 142619903331\n  Bound result 6\n  Bound result 6428869334925754845058512592824265853917612106383838709981264492518485420054\n  Bound result 1654\n  Bound result 359863806\n  Bound result 999999999999999999640136194\n  Bound result 311\n  Bound result 5204\n  Bound result 11\n  Bound result 9190\n  Bound result 4553\n  Bound result 3\n  Bound result 95\n  Bound result 499999995000000495790610997\n  Bound result 638212886\n  Bound result 3497\n  Bound result 0\n  Bound result 255\n  Bound result 9859\n  Bound result 0\n  Bound result 24576\n  Bound result 127\n  Bound result 7000000000000000000\n  Bound result 7\n  Bound result 255\n  Bound result 302\n  Bound result 278427535735911661929637548\n  Bound result 12\n  Bound result 24255\n  Bound result 8262\n  Bound result 70601240775306837502619815\n  Bound result 2\n  Bound result 95\n  Bound result 6620\n  Bound result 6760\n  Bound result 11\n  Bound result 6\n\n[PASS] test_handlerExercisesNonzeroSpendingAndRecoveryAfterReverts() (gas: 1309333)\nLogs:\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 4\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 6\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.84s (11.84s CPU time)\n\nRan 4 test suites in 11.85s (12.02s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Messenger.approve(address,uint256)\",\"Messenger.transfer(address,uint256)\",\"Messenger.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":15,\"README.md\":110,\"foundry.toml\":21,\"remappings.txt\":2,\"src/Messenger.sol\":17,\"test/Messenger.t.sol\":344,\"test/MessengerEdges.t.sol\":394,\"test/MessengerInvariant.t.sol\":283,\"test/MessengerLaunch.t.sol\":104},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"59fef502eb13aade3805f1eda2943174747f62596f5d6796c15c1325a76d6f99","verifiedTreeHash":"8f13a9d6125e81f18a87dd88d75193716e71d73e","verifierVersion":"0.1.0+6a374fcd"},{"checks":[{"durationMs":2680,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.46s\nCompiler run successful!\n","passed":true},{"durationMs":1352,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/MessengerLaunch.t.sol:MessengerLaunchTest\n[PASS] test_create2MintsEverythingToImmediateFactory() (gas: 312474)\n[PASS] test_launchDistributionClaimsAndPoolTransfersAreExact() (gas: 652645)\n[PASS] test_runtimeIsDeployableAndHasNoForbiddenOpcodes() (gas: 2506744)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 37.54ms (14.48ms CPU time)\n\nRan 28 tests for test/Messenger.t.sol:MessengerTest\n[PASS] testFuzz_delegatedTransfer(uint256,uint256) (runs: 512, μ: 164832, ~: 165831)\nLogs:\n  Bound result 774071574619108085421853319\n  Bound result 115792089237316195423570985008687907853269984665639789967882964899831788766093\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 93076, ~: 93262)\nLogs:\n  Bound result 1984350766300121994566612\n\n[PASS] testFuzz_transferMoreThanAllowanceReverts(uint256,uint256) (runs: 512, μ: 124005, ~: 124546)\nLogs:\n  Bound result 4080979476\n  Bound result 61920367993873916167915639\n\n[PASS] testFuzz_transferMoreThanBalanceReverts(uint256,uint256) (runs: 512, μ: 127952, ~: 128211)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 18\n\n[PASS] test_approveReplacesAllowanceAndCanRevoke() (gas: 172738)\n[PASS] test_approveSetsAllowanceAndEmitsEvent() (gas: 76243)\n[PASS] test_approveZeroSpenderReverts() (gas: 30572)\n[PASS] test_constructorEmitsMintTransfer() (gas: 5469)\n[PASS] test_deployerCannotSpendHoldersTokensWithoutApproval() (gas: 158847)\n[PASS] test_entireSupplyCanMoveAndReturn() (gas: 146968)\n[PASS] test_failedTransferFromPreservesAllowanceAndBalances() (gas: 126979)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 215169)\n[PASS] test_metadataAndInitialSupply() (gas: 108332)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 771351)\n[PASS] test_rejectsNativeCurrency() (gas: 42634)\n[PASS] test_selfTransferFromConsumesAllowanceWithoutChangingBalance() (gas: 114047)\n[PASS] test_selfTransferPreservesBalance() (gas: 51431)\n[PASS] test_transferFromCanExhaustAllowance() (gas: 162593)\n[PASS] test_transferFromConsumesAllowanceAndEmitsTransfer() (gas: 160555)\n[PASS] test_transferFromEmptyAccountReverts() (gas: 45142)\n[PASS] test_transferFromToZeroRevertsAndPreservesAllowance() (gas: 114857)\n[PASS] test_transferFromZeroSenderReverts() (gas: 35530)\n[PASS] test_transferMovesExactAmountAndEmitsEvent() (gas: 93504)\n[PASS] test_transferToZeroReverts() (gas: 47749)\n[PASS] test_unapprovedSpenderCannotTransfer() (gas: 116508)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63082)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78790)\n[PASS] test_zeroTransferToZeroReverts() (gas: 30620)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 74.61ms (282.58ms CPU time)\n\nRan 1 test for test/MessengerInvariant.t.sol:MessengerInvariantTest\n[PASS] invariant_supplyAndBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭------------------+--------------+-------+---------+----------╮\n| Contract         | Selector     | Calls | Reverts | Discards |\n+==============================================================+\n| MessengerHandler | approve      | 2672  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| MessengerHandler | transfer     | 2805  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| MessengerHandler | transferFrom | 2715  | 0       | 0        |\n╰------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 242\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3668\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3133\n  Bound result 344\n  Bound result 999999999999999999999999808\n  Bound result 999999999999999999999999999\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 16193552504151708219\n  Bound result 573060792698002110919422165\n  Bound result 8\n  Bound result 879\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.15s (1.13s CPU time)\n\nRan 3 test suites in 1.15s (1.26s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":96,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Messenger.approve(address,uint256)\",\"Messenger.transfer(address,uint256)\",\"Messenger.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":15,\"README.md\":110,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/Messenger.sol\":17,\"test/Messenger.t.sol\":344,\"test/MessengerInvariant.t.sol\":79,\"test/MessengerLaunch.t.sol\":104},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"80b8be18dce3fc97408d10dadf31052ebd3c2293c3a4af50af38aecf0d6da9df","verifiedTreeHash":"e1e60b3b9486a399ec754ed99cd671aa00933c2c","verifierVersion":"0.1.0+6a374fcd"},{"checks":[{"durationMs":1273,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.18s\nCompiler run successful!\n","passed":true},{"durationMs":724,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/MessengerLaunch.t.sol:MessengerLaunchTest\n[PASS] test_create2MintsEverythingToImmediateFactory() (gas: 312474)\n[PASS] test_launchDistributionClaimsAndPoolTransfersAreExact() (gas: 652645)\n[PASS] test_runtimeIsDeployableAndHasNoForbiddenOpcodes() (gas: 2506744)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.57ms (5.71ms CPU time)\n\nRan 28 tests for test/Messenger.t.sol:MessengerTest\n[PASS] testFuzz_delegatedTransfer(uint256,uint256) (runs: 512, μ: 164832, ~: 165831)\nLogs:\n  Bound result 3\n  Bound result 6989026052528141351867676076990275375854195963226238677947\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 93076, ~: 93262)\nLogs:\n  Bound result 21153578186333205\n\n[PASS] testFuzz_transferMoreThanAllowanceReverts(uint256,uint256) (runs: 512, μ: 124005, ~: 124546)\nLogs:\n  Bound result 744511006516218497995224256\n  Bound result 105771751350532144868019400\n\n[PASS] testFuzz_transferMoreThanBalanceReverts(uint256,uint256) (runs: 512, μ: 127952, ~: 128211)\nLogs:\n  Bound result 16313\n  Bound result 127\n\n[PASS] test_approveReplacesAllowanceAndCanRevoke() (gas: 172738)\n[PASS] test_approveSetsAllowanceAndEmitsEvent() (gas: 76243)\n[PASS] test_approveZeroSpenderReverts() (gas: 30572)\n[PASS] test_constructorEmitsMintTransfer() (gas: 5469)\n[PASS] test_deployerCannotSpendHoldersTokensWithoutApproval() (gas: 158847)\n[PASS] test_entireSupplyCanMoveAndReturn() (gas: 146968)\n[PASS] test_failedTransferFromPreservesAllowanceAndBalances() (gas: 126979)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 215169)\n[PASS] test_metadataAndInitialSupply() (gas: 108332)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 771351)\n[PASS] test_rejectsNativeCurrency() (gas: 42634)\n[PASS] test_selfTransferFromConsumesAllowanceWithoutChangingBalance() (gas: 114047)\n[PASS] test_selfTransferPreservesBalance() (gas: 51431)\n[PASS] test_transferFromCanExhaustAllowance() (gas: 162593)\n[PASS] test_transferFromConsumesAllowanceAndEmitsTransfer() (gas: 160555)\n[PASS] test_transferFromEmptyAccountReverts() (gas: 45142)\n[PASS] test_transferFromToZeroRevertsAndPreservesAllowance() (gas: 114857)\n[PASS] test_transferFromZeroSenderReverts() (gas: 35530)\n[PASS] test_transferMovesExactAmountAndEmitsEvent() (gas: 93504)\n[PASS] test_transferToZeroReverts() (gas: 47749)\n[PASS] test_unapprovedSpenderCannotTransfer() (gas: 116508)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63082)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78790)\n[PASS] test_zeroTransferToZeroReverts() (gas: 30620)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 19.98ms (70.05ms CPU time)\n\nRan 1 test for test/MessengerInvariant.t.sol:MessengerInvariantTest\n[PASS] invariant_supplyAndBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭------------------+--------------+-------+---------+----------╮\n| Contract         | Selector     | Calls | Reverts | Discards |\n+==============================================================+\n| MessengerHandler | approve      | 2672  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| MessengerHandler | transfer     | 2805  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| MessengerHandler | transferFrom | 2715  | 0       | 0        |\n╰------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 242\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3668\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3133\n  Bound result 344\n  Bound result 999999999999999999999999808\n  Bound result 999999999999999999999999999\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 16193552504151708219\n  Bound result 573060792698002110919422165\n  Bound result 8\n  Bound result 879\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 633.79ms (632.64ms CPU time)\n\nRan 3 test suites in 635.18ms (668.34ms CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Messenger.approve(address,uint256)\",\"Messenger.transfer(address,uint256)\",\"Messenger.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":15,\"README.md\":110,\"foundry.toml\":21,\"remappings.txt\":2,\"src/Messenger.sol\":17,\"test/Messenger.t.sol\":344,\"test/MessengerInvariant.t.sol\":79,\"test/MessengerLaunch.t.sol\":104},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":481,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":233,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Messenger.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"93d70bd2f3f2f365df4749fcb1ad43a4d64954a86d9ce740788f673235138256","verifiedTreeHash":"d03cb9b5abd480e4e60dd110927b830bff6a9bee","verifierVersion":"0.1.0+6a374fcd"}]}