{"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":"bc018430-5b52-482d-8359-c1fa6c63d830","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"d5213a7b01449dda86f875aca4239cbad00eed12b8bfdd74a278bb9d214cb8d6","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":"d51c5d108f93ecbd6d20fa5d50355447cd3a117733afc898e818503b7e5ce636","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":"1d28f22f787b9be08a7d142771f101a3839cd757fb9cd8a45d4bbafb82e0dfbb","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":"c12289dd0084599ebbc0f503084ff5b312e56cbdd739344547424c9c6197a3d9","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":"5010f195c923666485471aafc600a72e07b5d14a8939dbf226392cd8f1ca842a","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":"b403948d6256850ab6a29667ba6bd320a96926fd1f47918a39dde31d7b971adf","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":"d76e6420d5f2de4b330495f54f68fd044653fd791bf531a5f0768e4b331ad332","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b74cb13500f1c34e3f8bf11b8a43fe8d2a3f3c561ba7710cd6d6550cbc99ad76","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: 1 Million Dollar (1MD).\nToken name: 1 Million Dollar\nToken symbol: 1MD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"19a96d686e2b5d2edd3015392e3ae260b6bc797a109c5be959ee13d9dafef92a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"bc018430-5b52-482d-8359-c1fa6c63d830","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2130-1-million-dollar"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51530","feedbackHash":"5bbdf093c2bc2d8ba7161687594c8307da2b74fd030832e183f3f0645731c63e","nodeKey":"audit_economics","submissionHash":"d5213a7b01449dda86f875aca4239cbad00eed12b8bfdd74a278bb9d214cb8d6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52188","feedbackHash":"94c94e435252fbcac7149250b65e828e762a975a14b559902acb921899787f66","nodeKey":"audit_flow","submissionHash":"d51c5d108f93ecbd6d20fa5d50355447cd3a117733afc898e818503b7e5ce636","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51374","feedbackHash":"498277e614140b1a5386858c5fa8cac8ed59ae1856e71e1da2a2c987ea43e438","nodeKey":"audit_judge","submissionHash":"1d28f22f787b9be08a7d142771f101a3839cd757fb9cd8a45d4bbafb82e0dfbb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51316","feedbackHash":"e729732ae81f25640cf72537ff85cf92a38c690e99eb8a9a4999af0de09275f4","nodeKey":"audit_math","submissionHash":"c12289dd0084599ebbc0f503084ff5b312e56cbdd739344547424c9c6197a3d9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51025","feedbackHash":"83f1260eb2cd904431802c3a6debba9fd75ec2bbdaa8e46f338ac277b564787b","nodeKey":"audit_permissions","submissionHash":"5010f195c923666485471aafc600a72e07b5d14a8939dbf226392cd8f1ca842a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54233","feedbackHash":"2b8e06e573d67c11dddad636acdeb749dff932a2c6325eed1d5a87781ae3764b","nodeKey":"build_contract_project","submissionHash":"b403948d6256850ab6a29667ba6bd320a96926fd1f47918a39dde31d7b971adf","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52270","feedbackHash":"c3ec2fe0c0450fba89b10b4576ef3b99e4e6f9bb1e44b8dd07a6e288f507c90b","nodeKey":"manifest","submissionHash":"d76e6420d5f2de4b330495f54f68fd044653fd791bf531a5f0768e4b331ad332","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"54237","feedbackHash":"e6773dc1cc82845377e29330c331a44925e212a6d2ee4097af31a5b3b85a8d51","nodeKey":"write_foundry_tests","submissionHash":"b74cb13500f1c34e3f8bf11b8a43fe8d2a3f3c561ba7710cd6d6550cbc99ad76","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"02bfeb2baf6ffe811a3b9e49e281fe1aaffe52d253f17b7215a63962de6a3b1a","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"13603a08ada71730","findings":[],"hash":"1d28f22f787b9be08a7d142771f101a3839cd757fb9cd8a45d4bbafb82e0dfbb","nodeId":"ed437917-1b5d-4cfe-bb2c-201430baf470","outcome":"completed","summary":"The review is finished and found no defects that can be reproduced. `.imd-findings.json` holds `{\"findings\": []}` and a coverage record, and no tracked files were changed.\n\n**What I checked**\n- `src/OneMillionDollarToken.sol` is a plain OpenZeppelin v5.4.0 ERC20. The vendored `ERC20.sol` header says v5.4.0 and its logic is the standard code. The only state change outside OpenZeppelin is the constructor, which mints `1_000_000_000 * 10**18` to `msg.sender`. There is no mint or burn function, no owner, fee, hook or pause.\n- The repo's own tests pass (43 of 43).\n- The protected floor tests can't run here: they need platform harness files and `IMD_*` environment variables that aren't in this tree. I read them instead and checked what they test by hand:\n  - **Supply:** `totalSupply()` is 1e27, matching `launch.json`.\n  - **Decimals:** `decimals()` is 18, matching the manifest.\n  - **Forbidden opcodes:** the runtime bytecode has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n  - **Size:** runtime is 2,170 bytes and initcode 3,343 bytes, well within both limits.\n  - **Constructor arguments:** the constructor takes none, and `launch.json` lists `constructorArgs: []`.\n- `launch.json` follows the schema.\n\n**Specialist findings, both dropped**\n- **audit_math, `decimals()` not derived from `TOKEN_DECIMALS`:** it only goes wrong if someone edits the constant. On the current code nothing produces a wrong value, so it isn't a defect.\n- **audit_economics, approve race:** this is how every ERC-20 `approve` works, and it was in the standard token that was requested. It isn't a flaw in this code.\n\n**Static analysis:** aderyn's \"large numeric literal\" at line 29 is cosmetic; the value is correct.\n\n**Coverage:** `approve`, `transfer` and `transferFrom` are each marked `holds`, plus two invariant rows: fixed supply minted once, and deployability against the floor checks.","treeHash":null,"usage":{"cachedInputTokens":315708,"inputTokens":16,"model":"claude-opus-5-5","outputTokens":3611,"runtime":"claude","turns":8,"wallClockMs":89911}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b273d407784470b4","findings":[],"hash":"5010f195c923666485471aafc600a72e07b5d14a8939dbf226392cd8f1ca842a","nodeId":"95832fb0-50a3-410c-a53e-a1af47dd3f39","outcome":"completed","summary":"The findings file is in place and the repository's own exclude list hides it from git status, which is expected. The working tree is otherwise unchanged and the scratch directory is gone.\n\n## Result\n\n**No defects found** in the assigned area. The token is a 35-line wrapper over an unmodified OpenZeppelin v5.4.0 ERC20 with a single constructor mint and no custom logic, so there is no permission model to break.\n\n**What I checked, per the three guides:**\n\n- **Access Control.** The compiled ABI exposes 13 methods: the 9 standard ERC-20 functions plus 4 constant getters. There is no owner, role, modifier, initializer, proxy or hidden admin slot. Every writer of balances and allowances is scoped to the caller. A scratch test confirmed the deployer holds no residual power over a holder after forwarding, and storage slots beyond the ERC20 layout are zero.\n- **Asymmetry.** The approve/transferFrom and transfer/transferFrom pairs write identical state in mirror directions. There is no admin variant, fee branch, or exemption list to diverge from the user path.\n- **Trust Gap.** With no privileged actor, no seam between authorization and economics exists. The only trust assumption is that the factory holds the full supply until it forwards the launch flows, and the project suite shows those flows arrive whole.\n\n**Integrity checks.** The vendored ERC20, Context, IERC20, IERC20Metadata and IERC6093 files are sha256-identical to the upstream v5.4.0 release. The project's 30 tests pass, and my 6 permission probes passed before I removed them. The aderyn large-literal lead on line 29 resolves to exactly the brief's supply and is not a defect.\n\n**Output.** The file at `.imd-findings.json` holds an empty findings list and 8 coverage rows: one `holds` row for each of the three listed entry points plus rows for the constructor, the no-privileged-role invariant, the fixed-supply invariant, dependency integrity and the deploy script. Nothing in the assigned area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":947939,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":9875,"runtime":"claude","turns":20,"wallClockMs":194986}},{"artifacts":[],"attempt":1,"bundleHash":"cb328941eda628715f4165e077bb7d83c1adff7efd08cbda25b9d31cbf754b16","device":"d2b8b66fa0a1ce68","findings":[],"hash":"b403948d6256850ab6a29667ba6bd320a96926fd1f47918a39dde31d7b971adf","nodeId":"e83d3a83-2960-4867-819b-d066c49be097","outcome":"completed","summary":"The 1MD token is built, tested, documented and committed. Nothing is outstanding.\n\n**What was delivered**\n\n- `src/OneMillionDollarToken.sol` is a fixed-supply ERC-20 on OpenZeppelin v5.4.0. Its name is \"1 Million Dollar\", symbol \"1MD\", 18 decimals, and the constructor mints 1,000,000,000 tokens once to the deployer, which under the launch is the factory. It has no owner, no mint, burn, pause or blocklist, no constructor arguments, and no external calls at deploy. The Solidity identifier is 21 characters, within the launch's 32-byte limit.\n- `foundry.toml` pins solc 0.8.26 with `bytecode_hash = \"none\"`, optimizer on, ffi off and no filesystem permissions.\n- forge-std v1.9.7 and OpenZeppelin Contracts v5.4.0 are vendored as ordinary files under lib/ with no submodule, so the offline verifier can build.\n- `test/OneMillionDollarToken.t.sol` holds 30 tests. They cover metadata and the exact supply, the single mint event, deployment through a CREATE2 factory stand-in, transfer and allowance success paths, revert paths with OpenZeppelin's custom errors, absence of all the admin and freeze selectors the protected floor probes, bytecode free of DELEGATECALL, CALLCODE and SELFDESTRUCT, whole-amount launch flows, and four fuzz tests for conservation and enforcement.\n- `script/Deploy.s.sol` is a reviewable helper whose deploy step the tests call directly. It reads no environment variables.\n- `README.md` documents assumptions, manifest-facing parameters, operational responsibilities, and why there is nothing to configure after launch.\n\n**Verification**\n\n| Check | Result |\n|---|---|\n| forge build | success, 28 files |\n| forge test with the verifier's fuzz seed | 30 passed, 0 failed |\n| forge test with an empty environment | 30 passed |\n| forge fmt --check | clean |\n| fresh clone of the commit, offline build and test | all passed |\n\nTwo things worth knowing. The git commit uses a neutral placeholder author identity because the machine has none configured. The launch-specific values in the brief, such as pool fee, pair token and economics, are not encoded in the token and need no action from the requester, since the token has no exemptions or settings at all.","treeHash":"7aa82fd565cc7b2af15bdba5a84bf5e477b51999","usage":{"cachedInputTokens":1074172,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":24412,"runtime":"claude","turns":33,"wallClockMs":401155}},{"artifacts":[],"attempt":1,"bundleHash":"248a659a63dda456c6d65ada98bd772a8e0c8ed14691467bc4bf3f0ce3d682d2","device":"d2d0460994f47014","findings":[],"hash":"b74cb13500f1c34e3f8bf11b8a43fe8d2a3f3c561ba7710cd6d6550cbc99ad76","nodeId":"1764ed8c-a61d-4330-9e71-d0b4491bb65d","outcome":"completed","summary":"I added tests for the 1MD token, and found no defects to report. The full suite of 43 tests passes with `forge build` and `forge test`, run with the verifier's fuzz seed.\n\nThe 30 tests already in `test/OneMillionDollarToken.t.sol` cover name, symbol, decimals, the 1,000,000,000 × 10¹⁸ supply minted to the deployer, transfers that should fail, and the absence of mint, pause, blacklist or admin functions. I left that file alone and added two new ones.\n\n**`test/OneMillionDollarToken.invariant.t.sol`**: invariant tests over random call sequences.\n- A handler moves tokens between five actors: transfers, approvals (including unlimited ones) and spends on someone else's behalf. It also makes calls that must fail: spending more than the balance or the allowance, sending to the zero address, and an outsider with no allowance pulling funds. Failing calls must revert with the exact expected error.\n- The handler keeps its own record of every balance and allowance, worked out from the ERC-20 rules rather than read back from the token.\n- After every call, the invariants check that:\n  - the supply never changes;\n  - the actors' balances add up to the supply;\n  - nothing reaches the zero address, the token itself or the outsider;\n  - balances and allowances match the handler's record;\n  - no call broke the rules;\n  - name, symbol and decimals never change, and the token holds no ether.\n- With the verifier's seed it ran 256 sequences of 64 calls (16,384 calls). Every handler function was reached and nothing reverted unexpectedly.\n- A unit test checks that the handler really moves tokens, so the suite can't pass without testing anything.\n\n**`test/OneMillionDollarToken.edges.t.sol`**: 11 edge cases, three of them fuzzed.\n- A failed spend to the zero address must leave the allowance untouched.\n- Spending from the zero address must fail, as must an owner spending their own tokens through the allowance path without having approved themselves.\n- Spending an allowance exactly leaves zero, and a second spend then fails.\n- An allowance one below the maximum still goes down when spent; only the true maximum stays unlimited.\n- Zero-amount spends, allowances that don't affect each other, and the token rejecting unknown calls.\n- Fuzz tests on approve, sending to yourself, and spends at the edges of both balance and allowance.\n\nTo check the invariants can actually catch a bug, I ran them against a deliberately broken copy of the token that takes 1 wei on each transfer. Four of them failed, as they should: the balance sum, the balance record, the rule-break counter and the handler unit test. That copy was in `test/scratch/` and is not submitted.\n\nThe token is plain OpenZeppelin ERC-20 code with no owner, fees or extra mint or burn functions, so I didn't write `.imd-findings.json`. The invariant suite takes about 90 seconds to run. Nothing is committed.","treeHash":"195d8fd5f3d770d698958e2d212107f583308061","usage":{"cachedInputTokens":400714,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":11807,"runtime":"claude","turns":11,"wallClockMs":366690}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b0a28df3d585600","findings":[{"citation":"resolved","description":"Informational, not a reachable defect on the code as it stands. INITIAL_SUPPLY (line 29) is scaled by `10 ** uint256(TOKEN_DECIMALS)`, but `decimals()` is never overridden, so it returns OpenZeppelin ERC20's hard-coded 18 regardless of TOKEN_DECIMALS. The comment on line 25 ('Decimals, as returned by decimals()') claims a coupling that the code does not enforce. Today both are 18, totalSupply() == 1e27 and the manifest's decimals 18 match, so the launch floor (test_decimalsMatchTheManifest, test_mintsTheManifestSupplyToTheFactory) passes. The gap is a Numerical-Gap seam (boundary x invariant): the invariant 'supply is 1,000,000,000 whole tokens at decimals() scale' is held by two independent constants rather than by one source of truth. Minimal hardening that preserves behaviour: `function decimals() public pure override returns (uint8) { return TOKEN_DECIMALS; }` (bytecode-neutral in meaning, still returns 18).","line":26,"path":"src/OneMillionDollarToken.sol","reproduction":"State that exposes the gap: edit TOKEN_DECIMALS to 6 and redeploy. Expected (per the line-25 comment): decimals() == 6 and totalSupply() == 1_000_000_000 * 10**6. Actual: decimals() == 18 while totalSupply() == 1_000_000_000 * 10**6 == 1e15, i.e. the token reports 0.000001 whole tokens of supply, and the launch manifest's decimals would disagree with decimals(). On the current tree (TOKEN_DECIMALS == 18) no input triggers a wrong value: token.decimals() == 18, token.totalSupply() == 1000000000000000000000000000, token.INITIAL_SUPPLY() == token.totalSupply().","severity":"info","snippet":"    uint8 public constant TOKEN_DECIMALS = 18;","title":"decimals() is not derived from TOKEN_DECIMALS, so supply scale and reported decimals agree only by coincidence"}],"hash":"c12289dd0084599ebbc0f503084ff5b312e56cbdd739344547424c9c6197a3d9","nodeId":"7b3e8834-5c36-4010-a430-551e9c421e6d","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The scratch test directory is removed and the working tree is otherwise unchanged.\n\n**Outcome: no reachable math defect.** The token is a 35-line wrapper over OpenZeppelin v5.4.0 `ERC20` with a single compile-time constant mint. There is no division, no fixed-point scaling, no narrowing cast, no external call, no payable path and no sentinel branch beyond OpenZeppelin's zero-address reverts, so the Math Precision, Boundary and Numerical Gap failure modes have nothing to attach to.\n\n**What I checked**\n\n- **Supply constant.** It evaluates to exactly 1e27, well under 2^90. The aderyn large-literal lead is benign. The checked `_totalSupply += value` starts from zero, and the unchecked balance arithmetic in `_update` is safe because every value is bounded by a sender balance bounded by total supply.\n- **Edge inputs on all three entry points.** Zero amount from an empty account, whole-balance self-transfer, max-uint transfer, allowance exactly consumed, max-minus-one allowance decrementing, self-transferFrom without allowance, zero sender and zero receiver, and ether or unknown selectors sent to the token. All behaved per the ERC-20 spec in a scratch Foundry suite plus a 3-party conservation fuzz. The existing 30-test suite also passes.\n- **Vendored dependency.** The five files in the ERC20 import closure are byte-identical to the upstream v5.4.0 tag, fetched and diffed during the review.\n- **Launch floor.** The protected tests need exact arrival of the swarm, pool and remainder flows, decimals matching the manifest, and no supply growth. Nothing in the token's math can break any of them.\n\n**One informational note filed.** `decimals()` is never overridden, so it returns OpenZeppelin's hard-coded 18 while the supply is scaled by the separate `TOKEN_DECIMALS` constant. They agree today only because both are 18. Changing the constant to 6 would leave `decimals()` at 18 against a 1e15 supply. A one-line `decimals()` override returning the constant closes the gap without changing behaviour.\n\n**Coverage record.** All three listed entry points are marked `holds`, with five extra rows for the constructor, conservation, decimals, boundary surface and dependency integrity. Nothing in the assigned area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":742346,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":12263,"runtime":"claude","turns":17,"wallClockMs":184549}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d4b53d656a3fbe07","findings":[],"hash":"d51c5d108f93ecbd6d20fa5d50355447cd3a117733afc898e818503b7e5ce636","nodeId":"e37d6702-827d-4ee7-a8ff-5e2e4c7c2e41","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result: zero findings and nine coverage rows. The only untracked file in the tree is that findings file.\n\n**What I audited**, under the Execution Trace, Periphery and First Principles guides:\n\n- **Execution trace of all three entry points.** `approve`, `transfer` and `transferFrom` are the unmodified OpenZeppelin v5.4.0 implementations with no override. I traced each check, state write and revert path with concrete values. Zero-address sentinel paths revert, debit happens before credit, the whole transaction is undone on a late revert, infinite allowance is never decremented while max-minus-one is, and self-transfers and from-equals-to pulls are net zero.\n- **Periphery.** The vendored OpenZeppelin tree diffs byte-identical to the upstream v5.4.0 release, including `Context.sol`, so the constructor's `msg.sender` and the ERC-20's `_msgSender()` agree. forge-std matches v1.9.7, so the shipped tests are trustworthy.\n- **First principles and deployment phase.** The constructor takes no arguments, makes no external calls and mints 1e27 minor units once to the deployer. The compiled ABI exposes only three state-changing functions plus views, with no receive, fallback, owner, mint, burn or pause selectors. The runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT. The aderyn large-literal lead is a compile-time constant equal to the manifest supply.\n- **Scratch tests.** Nine extra edge-path tests I wrote and ran all passed, including a fuzzed sum-of-balances invariant. The shipped suite's 30 tests also pass. The scratch directory was removed afterwards.\n\n**Not reached:** nothing inside the assigned area. I did not run the protected floor test itself, since it needs Uniswap v4 sources and launch environment variables this tree does not carry, but the token's behaviour on every path that test exercises was traced by hand and matches.","treeHash":null,"usage":{"cachedInputTokens":559039,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":12526,"runtime":"claude","turns":25,"wallClockMs":194778}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5ded77c3c883b7b0","findings":[{"citation":"resolved","description":"The token inherits OpenZeppelin v5.4.0 ERC20 unchanged (verified byte-identical to upstream). Its approve(spender, value) overwrites the allowance, so the well-known ERC-20 front-running property applies: a spender who sees a pending approve that lowers their allowance can spend the old allowance first, then the new one. This is the only value-extraction path in a plain fixed-supply ERC-20 and is a property of the standard the brief asked for, not a defect in this implementation; OpenZeppelin v5 deliberately dropped increaseAllowance/decreaseAllowance. No fix is required to the agreed design. The README already says 'Approve only what is needed'; the author may additionally want to state that an allowance should be set to 0 before being changed to a new non-zero value. Recorded at info so the judge sees the economics were traced.","line":18,"path":"src/OneMillionDollarToken.sol","reproduction":"State: Alice holds >= 150 1MD. 1) Alice calls approve(Bob, 100). 2) Alice broadcasts approve(Bob, 50) intending to reduce. 3) Bob front-runs with transferFrom(Alice, Bob, 100): succeeds, allowance 0. 4) Alice's approve(Bob, 50) mines: allowance 50. 5) Bob calls transferFrom(Alice, Bob, 50): succeeds. Result: Bob moved 150 while Alice never intended more than 100 to be spendable. Expected by a naive user: at most 100 moved. Actual: 150. Verified with test test_approveRaceStandardProperty in test/scratch/EconomicsReview.t.sol (passes on current code because this is the standard's behaviour).","severity":"info","snippet":"contract OneMillionDollarToken is ERC20 {","title":"Standard ERC-20 approve race: a spender can move old plus new allowance when an allowance is lowered (inherent to the requested plain ERC-20, not a design violation)"}],"hash":"d5213a7b01449dda86f875aca4239cbad00eed12b8bfdd74a278bb9d214cb8d6","nodeId":"1fe79d7c-9c51-4eab-8de2-cf06191b9a47","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one info-level note and nine coverage rows, including all three listed entry points.\n\n**Outcome: no defect in the Economic Security, Invariant or Flow Gap area.** The token is OpenZeppelin v5.4.0 ERC-20 with a single constructor mint and nothing else.\n\nWhat I verified:\n- **Dependency integrity.** The five vendored OpenZeppelin files the token compiles against are byte-identical to the upstream v5.4.0 tag.\n- **Supply invariant.** The constant equals 1e27, matching the manifest value the README states. The only mint is in the constructor, and mint, burn, burnFrom and permit selectors all revert with no code path.\n- **Conservation invariant.** A Foundry invariant test with a handler driving transfer, approve and transferFrom from five actors held sum of balances equal to total supply across 256 runs.\n- **Launch flows.** No transfer override exists, so distributor, claim, seed and swap flows move exact amounts. A sync, transfer, settle probe modelled on the v4 PoolManager credited exactly the sent amount for any fuzzed value.\n- **Economic surface.** Zero-address paths revert, no fee, rebase, pause, blacklist, oracle, callback, receive or fallback. Project suite of 30 tests and `forge fmt --check` pass.\n\nThe one recorded item is the standard ERC-20 approve race, filed at info with a concrete 100 then 50 allowance trace. It is a property of the plain ERC-20 the brief asked for, not a defect to fix, and the README already warns holders about allowances.\n\nLeft unreached: no launch.json exists yet, and the protected floor tests depend on v4-core sources absent from this tree, so I read them and checked the README's manifest values by hand rather than executing them. The aderyn large-literal lead on line 29 is tool noise. The literal uses underscores and evaluates to the correct value.","treeHash":null,"usage":{"cachedInputTokens":859367,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":11828,"runtime":"claude","turns":15,"wallClockMs":240097}},{"artifacts":[],"attempt":1,"bundleHash":"cea1c38d7cf77f1d8c1bd61bd374dc9ae64e78224070d7acfdcfa6b82d26d276","device":"f9a12c57a094ca8d","findings":[],"hash":"d76e6420d5f2de4b330495f54f68fd044653fd791bf531a5f0768e4b331ad332","nodeId":"363afe4b-c5ea-4066-92d9-a3a99bea1ebb","outcome":"completed","summary":"Done. `launch.json` is written and is the only changed file in the tree.\n\n**What the manifest describes**\n\n- **Token** is `OneMillionDollarToken`, name \"1 Million Dollar\", symbol \"1MD\", 18 decimals. Its constructor takes no arguments, so constructorArgs is an empty list, and it mints the whole supply once to msg.sender. totalSupply is written as 1000000000000000000000000000 minor units, matching the contract's INITIAL_SUPPLY constant.\n- **Application contracts** list is empty. The accepted tree contains only the token, so nothing else is named.\n- **Pool and economics** are copied exactly as the launch reference gives them: IMD at the lowercase pair address, fee 12500, tick spacing 60, the one-to-one initialPrice, and the requester's economics object verbatim.\n- **Notes** run just over 1,000 characters and describe only what exists in the tree.\n\n**Verification**\n\n- A JSON check confirmed the schema keys, the supply string, the verbatim economics, and the length limits on notes and the contract name.\n- `forge build` compiled cleanly and `forge test` with the verifier's fuzz seed passed all 30 tests.\n- `git status` shows launch.json as the only new file. No configuration, lib, or source file was touched.","treeHash":"5a25a8564d0c960f9763d972aacbf03ed50666a1","usage":{"cachedInputTokens":173246,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2766,"runtime":"claude","turns":8,"wallClockMs":50056}}],"verification":[{"checks":[{"durationMs":996,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 923.51ms\nCompiler run successful!\n","passed":true},{"durationMs":94,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/OneMillionDollarToken.t.sol:OneMillionDollarTokenTest\n[PASS] testFuzz_multiHopTransfersConserveSupply(uint256,uint256,uint256) (runs: 256, μ: 246871, ~: 249984)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\n[PASS] testFuzz_transferAboveBalanceReverts(address,uint256,uint256) (runs: 256, μ: 104708, ~: 104957)\nLogs:\n  Bound result 272\n  Bound result 1694\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 105377, ~: 105685)\nLogs:\n  Bound result 3409\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 127758, ~: 108120)\nLogs:\n  Bound result 476092358965095892850612968\n  Bound result 60\n\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30512)\n[PASS] test_RevertWhen_sendingEtherToTheToken() (gas: 37458)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 102990)\n[PASS] test_RevertWhen_transferFromAccountWithNothing() (gas: 33186)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 150924)\n[PASS] test_RevertWhen_transferFromExceedsBalanceEvenWithAllowance() (gas: 138398)\n[PASS] test_RevertWhen_transferFromWithoutAnyAllowance() (gas: 92441)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 37496)\n[PASS] test_approveAndTransferFrom() (gas: 207380)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 127032)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 10999)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1532794)\n[PASS] test_deployScriptDeploysTheSameToken() (gas: 1535912)\n[PASS] test_factoryDeploymentMintsEverythingToTheFactory() (gas: 903122)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 173835)\n[PASS] test_launchFlowsArriveWhole() (gas: 1150624)\n[PASS] test_metadata() (gas: 60510)\n[PASS] test_noCommonAdminCallIncreasesSupply() (gas: 854503)\n[PASS] test_noPrivilegedHandMovesOrFreezesAHolder() (gas: 503083)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2786311)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 22873)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 94183)\n[PASS] test_transferOfZeroSucceeds() (gas: 42883)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43388)\n[PASS] test_transferWholeBalance() (gas: 73490)\n[PASS] test_wholeSupplyIsMintedToTheDeployer() (gas: 34558)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 12.74ms (56.27ms CPU time)\n\nRan 1 test suite in 13.65ms (12.74ms CPU time): 30 tests passed, 0 failed, 0 skipped (30 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMillionDollarToken.approve(address,uint256)\",\"OneMillionDollarToken.transfer(address,uint256)\",\"OneMillionDollarToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":11,\"README.md\":139,\"foundry.toml\":26,\"remappings.txt\":2,\"script/Deploy.s.sol\":27,\"src/OneMillionDollarToken.sol\":35,\"test/OneMillionDollarToken.t.sol\":432},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":444,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":214,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/OneMillionDollarToken.sol:29: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b403948d6256850ab6a29667ba6bd320a96926fd1f47918a39dde31d7b971adf","verifiedTreeHash":"7aa82fd565cc7b2af15bdba5a84bf5e477b51999","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1463,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.37s\nCompiler run successful!\n","passed":true},{"durationMs":6560,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/OneMillionDollarToken.t.sol:OneMillionDollarTokenTest\n[PASS] testFuzz_multiHopTransfersConserveSupply(uint256,uint256,uint256) (runs: 256, μ: 246709, ~: 250286)\nLogs:\n  Bound result 8837\n  Bound result 7409\n  Bound result 4539\n\n[PASS] testFuzz_transferAboveBalanceReverts(address,uint256,uint256) (runs: 256, μ: 104773, ~: 104971)\nLogs:\n  Bound result 500000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640564038957584007913129639935\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 105150, ~: 105685)\nLogs:\n  Bound result 37030\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 125800, ~: 108108)\nLogs:\n  Bound result 476092358965095892850612968\n  Bound result 60\n\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30512)\n[PASS] test_RevertWhen_sendingEtherToTheToken() (gas: 37458)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 102990)\n[PASS] test_RevertWhen_transferFromAccountWithNothing() (gas: 33186)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 150924)\n[PASS] test_RevertWhen_transferFromExceedsBalanceEvenWithAllowance() (gas: 138398)\n[PASS] test_RevertWhen_transferFromWithoutAnyAllowance() (gas: 92441)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 37496)\n[PASS] test_approveAndTransferFrom() (gas: 207380)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 127032)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 10999)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1532794)\n[PASS] test_deployScriptDeploysTheSameToken() (gas: 1535912)\n[PASS] test_factoryDeploymentMintsEverythingToTheFactory() (gas: 903122)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 173835)\n[PASS] test_launchFlowsArriveWhole() (gas: 1150624)\n[PASS] test_metadata() (gas: 60510)\n[PASS] test_noCommonAdminCallIncreasesSupply() (gas: 854503)\n[PASS] test_noPrivilegedHandMovesOrFreezesAHolder() (gas: 503083)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2786311)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 22873)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 94183)\n[PASS] test_transferOfZeroSucceeds() (gas: 42883)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43388)\n[PASS] test_transferWholeBalance() (gas: 73490)\n[PASS] test_wholeSupplyIsMintedToTheDeployer() (gas: 34558)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 22.96ms (97.04ms CPU time)\n\nRan 11 tests for test/OneMillionDollarToken.edges.t.sol:OneMillionDollarTokenEdgesTest\n[PASS] testFuzz_approveSetsExactly(address,uint256) (runs: 1000, μ: 75145, ~: 75483)\nLogs:\n  Bound result 455509043691848779342680215479017926579551070745\n\n[PASS] testFuzz_selfTransferNeverChangesBalance(uint256) (runs: 1000, μ: 54859, ~: 54571)\nLogs:\n  Bound result 681944602283420835387\n\n[PASS] testFuzz_transferFromAtTheEdgesOfBalanceAndAllowance(uint256,uint256,uint256) (runs: 1000, μ: 171574, ~: 167759)\nLogs:\n  Bound result 179585982146738995788338861\n  Bound result 14633782064429\n  Bound result 21\n\n[PASS] test_RevertWhen_allowanceSpentTwice() (gas: 152038)\n[PASS] test_RevertWhen_callingWithUnknownSelector() (gas: 29526)\n[PASS] test_RevertWhen_ownerSpendsOwnTokensWithoutSelfAllowance() (gas: 33540)\n[PASS] test_RevertWhen_transferFromTheZeroAddress() (gas: 40290)\n[PASS] test_RevertWhen_transferFromToZeroAddress_allowanceUntouched() (gas: 112161)\n[PASS] test_allowanceJustBelowMaxIsDecremented() (gas: 119662)\n[PASS] test_approvalsAreIndependentPerSpender() (gas: 183332)\n[PASS] test_zeroAmountTransferFromWithoutAllowanceSucceeds() (gas: 57026)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 23.16ms (68.00ms CPU time)\n\nRan 2 tests for test/OneMillionDollarToken.invariant.t.sol:OneMillionDollarTokenInvariantTest\n[PASS]\nOneMillionDollarTokenInvariantTest invariants:\n[PASS] invariant_actorsHoldTheWholeSupply\n[PASS] invariant_allowancesMatchTheModel\n[PASS] invariant_balancesMatchTheModel\n[PASS] invariant_metadataNeverChanges\n[PASS] invariant_noCallBrokeTheErc20Rules\n[PASS] invariant_supplyNeverChanges\n OneMillionDollarTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+-----------------------------+-------+---------+----------╮\n| Contract     | Selector                    | Calls | Reverts | Discards |\n+=========================================================================+\n| TokenHandler | approve                     | 2017  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | strangerPulls               | 1985  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | transfer                    | 2115  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | transferFrom                | 2061  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | transferFromBeyondAllowance | 2034  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | transferFromBeyondBalance   | 2143  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | transferToZero              | 2014  | 0       | 0        |\n|--------------+-----------------------------+-------+---------+----------|\n| TokenHandler | transferTooMuch             | 2015  | 0       | 0        |\n╰--------------+-----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 107\n  Bound result 1000000000000000000\n  Bound result 9612\n  Bound result 60000000000000000000\n  Bound result 143817887229103005703119498989326881928261960698713059862508753\n  Bound result 4\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 832716283019655932542975\n  Bound result 0\n  Bound result 10000\n  Bound result 255\n  Bound result 4569\n  Bound result 40000000000000000000\n  Bound result 40000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 32\n  Bound result 0\n  Bound result 95\n  Bound result 10000\n  Bound result 12\n  Bound result 6000000000000000000\n  Bound result 2355\n  Bound result 9159\n  Bound result 14\n  Bound result 340282366920938463463374607431768211455\n  Bound result 454\n  Bound result 208\n  Bound result 4202047188\n  Bound result 38\n  Bound result 37\n  Bound result 84041965540739204618721147399484214518846132\n  Bound result 12\n  Bound result 713\n  Bound result 31\n  Bound result 100000000000000000000\n  Bound result 0\n  Bound result 412232454945803133555663\n  Bound result 828417\n  Bound result 2104\n  Bound result 659918\n  Bound result 120\n  Bound result 255\n  Bound result 82\n  Bound result 54\n  Bound result 1314\n  Bound result 5\n  Bound result 0\n  Bound result 7513\n  Bound result 1755\n  Bound result 3433\n  Bound result 216\n  Bound result 6138\n  Bound result 12\n\n[PASS] test_handlerMovesTokens() (gas: 764097)\nLogs:\n  Bound result 500000000000000000000\n  Bound result 40000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.46s (6.46s CPU time)\n\nRan 3 test suites in 6.47s (6.51s CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMillionDollarToken.approve(address,uint256)\",\"OneMillionDollarToken.transfer(address,uint256)\",\"OneMillionDollarToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":11,\"README.md\":139,\"foundry.toml\":26,\"remappings.txt\":2,\"script/Deploy.s.sol\":27,\"src/OneMillionDollarToken.sol\":35,\"test/OneMillionDollarToken.edges.t.sol\":139,\"test/OneMillionDollarToken.invariant.t.sol\":305,\"test/OneMillionDollarToken.t.sol\":432},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b74cb13500f1c34e3f8bf11b8a43fe8d2a3f3c561ba7710cd6d6550cbc99ad76","verifiedTreeHash":"195d8fd5f3d770d698958e2d212107f583308061","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":951,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 871.73ms\nCompiler run successful!\n","passed":true},{"durationMs":95,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/OneMillionDollarToken.t.sol:OneMillionDollarTokenTest\n[PASS] testFuzz_multiHopTransfersConserveSupply(uint256,uint256,uint256) (runs: 256, μ: 246871, ~: 249984)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\n[PASS] testFuzz_transferAboveBalanceReverts(address,uint256,uint256) (runs: 256, μ: 104708, ~: 104957)\nLogs:\n  Bound result 272\n  Bound result 1694\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 105377, ~: 105685)\nLogs:\n  Bound result 3409\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 127758, ~: 108120)\nLogs:\n  Bound result 476092358965095892850612968\n  Bound result 60\n\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30512)\n[PASS] test_RevertWhen_sendingEtherToTheToken() (gas: 37458)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 102990)\n[PASS] test_RevertWhen_transferFromAccountWithNothing() (gas: 33186)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 150924)\n[PASS] test_RevertWhen_transferFromExceedsBalanceEvenWithAllowance() (gas: 138398)\n[PASS] test_RevertWhen_transferFromWithoutAnyAllowance() (gas: 92441)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 37496)\n[PASS] test_approveAndTransferFrom() (gas: 207380)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 127032)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 10999)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1532794)\n[PASS] test_deployScriptDeploysTheSameToken() (gas: 1535912)\n[PASS] test_factoryDeploymentMintsEverythingToTheFactory() (gas: 903122)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 173835)\n[PASS] test_launchFlowsArriveWhole() (gas: 1150624)\n[PASS] test_metadata() (gas: 60510)\n[PASS] test_noCommonAdminCallIncreasesSupply() (gas: 854503)\n[PASS] test_noPrivilegedHandMovesOrFreezesAHolder() (gas: 503083)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2786311)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 22873)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 94183)\n[PASS] test_transferOfZeroSucceeds() (gas: 42883)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43388)\n[PASS] test_transferWholeBalance() (gas: 73490)\n[PASS] test_wholeSupplyIsMintedToTheDeployer() (gas: 34558)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 12.05ms (53.29ms CPU time)\n\nRan 1 test suite in 12.93ms (12.05ms CPU time): 30 tests passed, 0 failed, 0 skipped (30 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMillionDollarToken.approve(address,uint256)\",\"OneMillionDollarToken.transfer(address,uint256)\",\"OneMillionDollarToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":11,\"README.md\":139,\"foundry.toml\":26,\"launch.json\":24,\"remappings.txt\":2,\"script/Deploy.s.sol\":27,\"src/OneMillionDollarToken.sol\":35,\"test/OneMillionDollarToken.t.sol\":432},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d76e6420d5f2de4b330495f54f68fd044653fd791bf531a5f0768e4b331ad332","verifiedTreeHash":"5a25a8564d0c960f9763d972aacbf03ed50666a1","verifierVersion":"0.1.0+c3fba9eb"}]}