{"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":"6db84941-7d8c-4534-a37e-3bd615d2ec80","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"4843d5ce8f4ff49727034f8c864e88f9ca3300a0d89918eea466dee909aae8d1","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":"36e719988f2d01cf9f873eb78f8665fb69c3b7de5b252dd15ea243387bf348ad","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":"e6fcd0b4c3b3dccb18c986338c33592bee944a0599cd5fb623ca4d8f3e699929","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":"05dda6e1346c3821742367062552caa85b72eee82dac23fc2716c8b160efcb75","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":"38d066acab772021b4023b77c1ec2959d501d5d99d51b25c28b810abfbaf5bb0","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":"38c5973190323b3fc0778098b5835d5ffb6a2c63bc367977b7584c891d701a67","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"7fc5ed1a2c453b21c9c74de89eee4b8e8e5c4d0d8b61cdfade695526b61841a8","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b8f9b432c0e685f8f8cb63de3c63f1bfad33fffde634e6b5ac552e1366e31785","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Spectra IMD (SPECTRA).\nToken name: Spectra IMD\nToken symbol: SPECTRA\nToken supply: 10,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"d2a571f5c413bbfc96e5cbac690a104a0d01070846d0c1dfc10372f362e38d6b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"6db84941-7d8c-4534-a37e-3bd615d2ec80","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1360-spectra-imd"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51476","feedbackHash":"a077ede84de2c3746900fb36c50ebac54e38f6ace806e69a841e4689dde14233","nodeKey":"audit_economics","submissionHash":"4843d5ce8f4ff49727034f8c864e88f9ca3300a0d89918eea466dee909aae8d1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51401","feedbackHash":"25e07e0a98cd4df2c707cfe430afd526605956a5b22fef314d204a3cc97ec1e7","nodeKey":"audit_flow","submissionHash":"36e719988f2d01cf9f873eb78f8665fb69c3b7de5b252dd15ea243387bf348ad","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52572","feedbackHash":"989f33f59bb927f29a7f49ce1613cc7b4e025bebe386c7581e9efaa39584d9df","nodeKey":"audit_judge","submissionHash":"e6fcd0b4c3b3dccb18c986338c33592bee944a0599cd5fb623ca4d8f3e699929","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51512","feedbackHash":"9a24eb87d0e740a427bfdf53a62539454c416d0d091f13553872324fbed290eb","nodeKey":"audit_math","submissionHash":"05dda6e1346c3821742367062552caa85b72eee82dac23fc2716c8b160efcb75","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51540","feedbackHash":"2040fb3c26d9ac3aa603a6f26c404ab588380f50ed15267e15e3800e143bd33f","nodeKey":"audit_permissions","submissionHash":"38d066acab772021b4023b77c1ec2959d501d5d99d51b25c28b810abfbaf5bb0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52656","feedbackHash":"fc0d9f7b8a7d9f078e41f1dd042891617ab6c3144466aa51ee83441eacca7a01","nodeKey":"build_contract_project","submissionHash":"38c5973190323b3fc0778098b5835d5ffb6a2c63bc367977b7584c891d701a67","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52253","feedbackHash":"60d66c1370be4b8f8d89b27c72fcfba7aefba275a9898460b68f6fd93c2145f7","nodeKey":"manifest","submissionHash":"7fc5ed1a2c453b21c9c74de89eee4b8e8e5c4d0d8b61cdfade695526b61841a8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52660","feedbackHash":"5982b07193030d6af9a18e1194c18c6095e6d7f7665d54a9d373a2836003dd05","nodeKey":"write_foundry_tests","submissionHash":"b8f9b432c0e685f8f8cb63de3c63f1bfad33fffde634e6b5ac552e1366e31785","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"adec5f373772b5fcbcee581c8ba50395483c8786759c343e01df75007aa0b41e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8c9c4986ca881107","findings":[],"hash":"05dda6e1346c3821742367062552caa85b72eee82dac23fc2716c8b160efcb75","nodeId":"1f9e0e5b-cb35-4e35-9e6b-e83560e821dc","outcome":"completed","summary":"The review is complete. The math audit of Spectra IMD found no defects, and `.imd-findings.json` holds an empty findings list with a full coverage record.\n\n**What was reviewed.** The token is a 17-line contract that inherits the vendored OpenZeppelin v5.1.0 ERC20 and mints a constant supply once to the deployer. I checked it against every failure mode in the Math Precision, Boundary and Numerical Gap guides, plus the Senior Auditor's Mindset pass.\n\n**Why it holds.**\n- The supply constant is a compile-time expression equal to exactly 1e25, which is 10,000,000 whole units at 18 decimals with zero remainder. The aderyn \"large numeric literal\" lead is style only.\n- There is no division, fee, share, scaling or downcast anywhere, so none of the rounding, truncation or seam failures can occur. The only arithmetic is OpenZeppelin's balance update, whose unchecked steps are bounded by a total supply far below the uint256 limit.\n- There are no external calls, no payable or fallback paths, no bytes decoding, and the only sentinel is the zero address, which every reachable path rejects.\n- All six vendored OpenZeppelin files are byte-identical to the upstream commit named in the dependency manifest.\n\n**How it was verified.** The existing 36 tests and the stateful invariant campaign pass. I also ran a scratch Foundry test driving 1 wei, exact-balance, balance-plus-one, zero, max-uint, self-transfer, infinite and max-minus-one allowance cases and a conservation fuzz. All passed, and the scratch file was then removed so the tree is unchanged apart from the findings file.\n\n**Coverage.** All three ABI entry points are marked `holds`, with four extra rows for the constructor and supply constant, the conservation invariant, the boundary inventory, and dependency integrity. Nothing was left unreached. The standard ERC-20 approve race is inherent to the specification and already documented in the README, so it is not reported as a defect.","treeHash":null,"usage":{"cachedInputTokens":769594,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":11212,"runtime":"claude","turns":19,"wallClockMs":203966}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2ab0b432477fde6c","findings":[{"citation":"resolved","description":"Execution trace of SpectraToken.transferFrom(from, to, 0): _spendAllowance reads allowance(from, spender) == 0, the check `0 < 0` is false, so no allowance is required; _transfer then runs _update with value 0 and emits Transfer(from, to, 0). The net effect is that any address can cause the token to emit a Transfer event with an arbitrary `from` (for example the factory, the distributor or the pool manager) and an arbitrary `to`, without holding or moving anything. Balances, allowances and totalSupply are unchanged, so this is not a loss of funds and is the documented behaviour of the vendored OpenZeppelin v5.1.0 ERC20 (the project's own test test_ZeroTransferFromRequiresNoAllowance asserts it). It is reported for the record because off-chain consumers that treat Transfer events as evidence of activity (indexers, airdrop or 'first transfer' heuristics, explorer activity feeds) can be fed spoofed rows naming launch addresses. No code change is required; integrations should key on balance deltas rather than on event presence.","line":304,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"Deploy SpectraToken (deployer D holds 10,000,000e18). D.transfer(victim=0xA11CE, 5e18). allowance(victim, stranger=0xBAD) == 0. vm.prank(stranger); token.transferFrom(victim, stranger, 0). Expected by a reader who assumes transferFrom needs an allowance: revert ERC20InsufficientAllowance. Actual: returns true and emits Transfer(0xA11CE, 0xBAD, 0); balanceOf(victim) stays 5e18. Verified with a scratch Foundry test (test_zeroValueTransferFromWithoutAllowanceEmitsSpoofableEvent) that passed on this tree.","severity":"info","snippet":"            if (currentAllowance < value) {","title":"Anyone can emit a zero-value Transfer event naming any holder as sender via transferFrom without allowance (standard OpenZeppelin behaviour, no funds at risk)"}],"hash":"36e719988f2d01cf9f873eb78f8665fb69c3b7de5b252dd15ea243387bf348ad","nodeId":"1e1ffbc3-4821-403b-b32f-750d0f8441fb","outcome":"completed","summary":"The findings file is in place at the repository root, the working tree is otherwise unchanged, and the scratch directory is removed. The review is complete.\n\n**Outcome: no defects found that require a fix.** The token is a 17-line contract inheriting OpenZeppelin v5.1.0 ERC20 with no overrides, and every check in the Execution Trace, Periphery and First Principles guides holds.\n\n**What I verified**\n\n- **Execution trace of all three entry points.** The approve, transfer and transferFrom paths were traced through the vendored base. Failed transfers revert atomically with no partial allowance write. Infinite allowance is never decremented. No fees, exemptions, callbacks or external calls exist on any path, so the factory, distributor, pool manager and traders all move exactly what they ask to move.\n- **Periphery.** All five vendored OpenZeppelin files and the licence are byte-identical to the upstream commit pinned in the dependency manifest. The sender context is plain `msg.sender` with no meta-transaction forwarding.\n- **First principles.** The constructor mints exactly 10,000,000 tokens at 18 decimals once to the immediate deployer, which under CREATE2 is the factory. The compiled ABI exposes only the ERC-20 surface plus the supply constant. The runtime bytecode contains no DELEGATECALL, CALLCODE or SELFDESTRUCT and carries no metadata hash. The README's chain ID 1 claim is consistent: the paired IMD address has code on Ethereum mainnet and returns the IMD symbol.\n- **Tests.** The project's 36 tests including the invariant campaign pass. Three scratch tests I wrote confirmed the traces and were removed afterwards.\n\n**One info-level note recorded.** A zero-value `transferFrom` succeeds without any allowance and emits a `Transfer` event naming an arbitrary sender. Balances and supply are untouched. This is standard OpenZeppelin behaviour that the project's own tests assert, so it needs no code change. It is recorded so off-chain indexers are not treated as proof of activity.\n\n**Coverage record.** All three listed entry points have rows, plus four invariant rows covering the constructor mint, vendored-library integrity, the privileged-surface and opcode checks, and the launch flows. The protected harness's live Uniswap v4 seed and swap could not be executed here because the v4 dependencies are not in this tree. That row is marked as holding on the basis that the token has no sender- or recipient-dependent logic.","treeHash":null,"usage":{"cachedInputTokens":650472,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":12376,"runtime":"claude","turns":28,"wallClockMs":189331}},{"artifacts":[],"attempt":1,"bundleHash":"4a8c61a0c7ed0de6cf2d3aab36daba8aa218b6d63a47a2fa7b6800adc1198e89","device":"4d6b0e34f0d3e310","findings":[],"hash":"38c5973190323b3fc0778098b5835d5ffb6a2c63bc367977b7584c891d701a67","nodeId":"eed7129c-0641-43bf-8c10-b3de53f9a4b9","outcome":"completed","summary":"Implemented Spectra IMD (SPECTRA): 10,000,000 tokens with 18 decimals, minted once to the deployer.\n\nIncluded vendored dependencies, deployment documentation, and success/failure, fuzz, and invariant tests.\n\nPassed:\n- `forge build`\n- `forge test` — 36 passed\n- `forge fmt --check`\n- Clean offline build and tests\n\nProtected pool integration remains for the network verifier.","treeHash":"ec0467bfd140251ace89f6f02a338468052d046f","usage":{"cachedInputTokens":569600,"inputTokens":56397,"model":"gpt-6-astra","outputTokens":14863,"runtime":"codex","turns":5,"wallClockMs":411760}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"589ef002581a5371","findings":[],"hash":"38d066acab772021b4023b77c1ec2959d501d5d99d51b25c28b810abfbaf5bb0","nodeId":"41fbfb12-2062-44ae-b787-4a931fe9510f","outcome":"completed","summary":"The review is complete. The findings file holds an empty list and ten coverage rows, and the working tree is otherwise unchanged.\n\n**Result: no defects in the Access Control, Trust Gap or Asymmetry areas.** The token at `src/SpectraToken.sol` is a seventeen-line fixed-supply OpenZeppelin ERC-20 with no constructor arguments and no administrative surface. There is nothing in it for a privilege bypass, a trust-gap exploit or an asymmetric branch to attach to.\n\nWhat I verified, beyond reading the code against the three guides:\n\n- **Permission map is empty.** The compiled ABI is exactly seven views plus approve, transfer and transferFrom. There is no receive, fallback, owner, initializer, minter or pauser. A scratch test scanned every four-byte constant in the runtime bytecode and confirmed each is either a documented ABI selector or reverts when called.\n- **The deployer has no power over holders.** As the supply recipient it is just a balance. A transferFrom against a holder without an allowance reverts, and a granted allowance is consumed exactly. This is the path the protected floor test probes, and it holds.\n- **No asymmetry between paired functions.** transfer and transferFrom reach the same internal update, and a test compared end state for identical amounts through both paths. No branch exempts the factory, pool manager or distributor, so all launch flows move exactly what they say.\n- **Vendored library is genuine.** All five OpenZeppelin files and the LICENSE are byte-identical to the upstream v5.1.0 commit recorded in the dependency manifest. No submodule, no network needed at build time.\n- **Existing suite and formatter pass.** All 36 project tests pass offline, including the invariant campaign, and the formatter check is clean.\n- **Static-analysis lead dismissed.** The aderyn large-literal note on line 10 is style only. The literal evaluates to the exact smallest-unit supply the README and manifest state.\n\nNot reached: the protected integration test could not be run here because it imports launch infrastructure and Uniswap v4 sources that are not in this repository. Its token-level checks are mirrored by the project's own launch test, which passes.","treeHash":null,"usage":{"cachedInputTokens":621631,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":10407,"runtime":"claude","turns":23,"wallClockMs":167077}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e9049e5b12ba53ba","findings":[],"hash":"4843d5ce8f4ff49727034f8c864e88f9ca3300a0d89918eea466dee909aae8d1","nodeId":"f841c7c2-9a77-4b81-9e5f-80a90aeba6e3","outcome":"completed","summary":"I found no defects in SpectraToken's economics. `.imd-findings.json` has an empty findings list and a coverage row for each of the three entry points, all marked **holds**. The file is valid JSON and I changed no project files.\n\n**What I checked**\n- **Token code:** `src/SpectraToken.sol` is a plain OpenZeppelin v5.1.0 ERC-20 with no changes to its behaviour. Its constructor mints the 10,000,000 × 10¹⁸ supply once to `msg.sender`. Decimals are 18, the name is \"Spectra IMD\" and the symbol is \"SPECTRA\".\n- **The library code itself:** I read the vendored OpenZeppelin `transfer`, `transferFrom`, `approve`, `_update` and `_spendAllowance` to make sure the library hadn't been altered. They match the standard release.\n- **Economic security:**\n  - Nothing can mint or burn after deployment.\n  - There is no owner, pause, blacklist or freeze.\n  - There is no fee, burn or rebase on transfer.\n  - The token makes no outside calls and has no callbacks, so there is no re-entry risk.\n- **Invariants:** the total supply stays fixed and balances always add up to it. An allowance goes down by exactly the amount spent, unless it is set to the maximum, which never runs out.\n- **Flow gaps:** every transfer moves exactly the stated amount. So the launch flows arrive in full: factory to distributor, the pool seed, and trades through the PoolManager.\n- **Tests:** the project's 36 tests, including the invariant runs, all pass. I didn't run the protected launch test because it depends on files that aren't in this tree.\n\n**Static-analysis leads:** Slither reported nothing. Aderyn's one note, a \"large numeric literal\" at line 10, is just the clearly written supply constant (`10_000_000 * 10 ** 18`), so it isn't a defect.\n\n**Notes:**\n- The standard ERC-20 issue where changing an existing allowance can be front-run is how the standard is designed, not a fault in this token, so I didn't report it.\n- The constructor takes no arguments, so the launch file's `constructorArgs` must be an empty list.","treeHash":null,"usage":{"cachedInputTokens":240882,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":2964,"runtime":"claude","turns":7,"wallClockMs":39722}},{"artifacts":[],"attempt":1,"bundleHash":"e375c583c61e5ee7e4a80d198821d33b6cea56c3be39aa58efc6e96dd6a2fd41","device":"7591760a616c6429","findings":[],"hash":"7fc5ed1a2c453b21c9c74de89eee4b8e8e5c4d0d8b61cdfade695526b61841a8","nodeId":"56753eed-0e85-465b-8ab3-01bf0f4b942b","outcome":"completed","summary":"Done. The only new file is launch.json at the repository root; nothing else in the tree changed.\n\n**What the manifest says**\n\n- Kind is custom_token. The token entry names the Solidity contract SpectraToken with name Spectra IMD, symbol SPECTRA, 18 decimals and empty constructorArgs. The compiled ABI confirms the constructor takes no inputs.\n- totalSupply is the constant the constructor mints to msg.sender once, 10,000,000 tokens in minor units.\n- contracts is empty. The accepted tree has no application contracts, so none are described.\n- pool and economics are copied exactly from the launch reference: IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one initialPrice, and the requester's economics object verbatim.\n- notes explain that the token has no owner or privileged functions and that all launch flows move exact amounts.\n\n**Checks run**\n\n- A JSON check confirmed the schema keys, the supply string, the economics and pool objects, the contract name length and the notes length.\n- `forge build --offline` compiled cleanly and `forge test --offline` passed all 36 tests, including the invariant campaign.\n- `git status` shows launch.json as the only change.","treeHash":"ea0d4fe93f59ac040de72e187149e27cdef543f3","usage":{"cachedInputTokens":220712,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":3184,"runtime":"claude","turns":10,"wallClockMs":76170}},{"artifacts":[],"attempt":1,"bundleHash":"8dcd206f89d27c0c5bf06dfc95146f6b66fbab29a816bc00b147b5a5ea255234","device":"1ec9f666356a7ad7","findings":[],"hash":"b8f9b432c0e685f8f8cb63de3c63f1bfad33fffde634e6b5ac552e1366e31785","nodeId":"c1326afb-964f-49b6-8c40-89fda5e5c180","outcome":"completed","summary":"The suite is complete and green. `forge build` and `forge test` both pass with 62 tests, none skipped, and no defects were found in the token, so no findings file was written.\n\n**What I added**, building on the three existing test files rather than rewriting them:\n\n- `test/SpectraTokenProperties.t.sol` holds 25 stateless property and edge tests. They pin the supply literal in minor units, check metadata is identical across deployments and callers, and prove the constructor refuses ETH via a raw CREATE helper. Algebraic properties use snapshots to show two transfers equal one transfer of the sum, transfer order does not matter, a round trip restores both balances, and a delegated transfer equals a direct one. Failure paths cover one wei over balance, the zero address as sender or approver, allowance exceeded across several calls, an allowance above balance, the owner pulling from itself without self-approval, and tokens sent to the token contract being unrecoverable. Two selector fuzzers check that undeclared selectors always revert and that calls on the ERC-20 surface never change supply. The exact boundary of the infinite allowance is tested with max minus one.\n- `test/SpectraTokenOpenInvariant.t.sol` is a second invariant campaign at 256 runs of depth 64, set with inline config. Its handler keeps an open actor set that grows with fuzzer-invented addresses, treats the token contract as a sink, and mixes successful calls with calls that must fail. Each failing call is caught with try/catch, matched against the exact ERC-6093 error, and checked to leave balances and allowances untouched. Ghost variables track the model balances, allowances, cumulative volume and the sink balance. Five invariants assert a fixed supply, tracked balances summing to supply and matching the model, a sink that only grows, allowances matching the model for every pair, and bounded volume.\n\n**Mutation checks** confirmed the tests have teeth. A one wei transfer fee failed 10 property tests and all 5 invariants. An exposed mint function failed all 5 invariants. The source file was restored after each check and git shows only the two new test files.\n\n**Three failures during development** were harness bugs, not token bugs: a seed-plus-one overflow in my sender picker, and two fuzz tests that let the zero address act as sender. I fixed the harness and pinned the zero-address cases as explicit tests.","treeHash":"1e3c0a99b56fb436af7d557df46e7f632174d160","usage":{"cachedInputTokens":1184443,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":31553,"runtime":"claude","turns":26,"wallClockMs":478021}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"373b43d9e5572ce8","findings":[],"hash":"e6fcd0b4c3b3dccb18c986338c33592bee944a0599cd5fb623ca4d8f3e699929","nodeId":"fc9a0c11-ce6a-4398-bf17-a3781f4760f8","outcome":"completed","summary":"I found no defects in Spectra IMD, so `.imd-findings.json` has an empty findings list. Its coverage record marks all three entry points as `holds`, plus two invariant rows. The build succeeds and all 62 existing tests pass. I changed no files apart from the findings file.\n\n**What the code is:** `src/SpectraToken.sol` is a plain ERC-20 built on the bundled OpenZeppelin v5.1.0 code, with nothing overridden. Its constructor takes no arguments and mints `10_000_000 * 10 ** 18` once to whoever deploys it, which is the factory at launch. There is no owner, mint, burn, pause, blacklist, fee or upgrade function. So the swarm's 10% share, the distributor's payouts, the pool seed and trades all move exactly the stated amounts.\n\n**Entry points:**\n- **`approve`:** behaves as intended. It rejects the zero address as spender, sets the allowance and emits `Approval`.\n- **`transfer`:** behaves as intended. It rejects the zero address as sender or receiver, reverts if the balance is too low, and moves exactly the amount with no fee or burn.\n- **`transferFrom`:** behaves as intended. It reverts when the allowance is too low and leaves an unlimited (max) allowance untouched.\n\n**Specialist findings:** the only one was from the flow auditor (rated info). It says anyone can call `transferFrom(holder, to, 0)` without an allowance, which emits a `Transfer` event naming that holder. I traced it and it does happen: a zero amount passes the allowance check and nothing moves. I dropped it anyway. The ERC-20 standard requires zero-value transfers to be treated as normal, no balance or allowance changes, and there is nothing in the code to fix. Since an outstanding finding blocks the launch, keeping it would have blocked it for no reason. The other three specialists and the test writer reported nothing, so there was nothing to merge. The static-analysis \"large numeric literal\" warning is just the supply constant, so I left it out.\n\n**Deployment and manifest:**\n- **Deployable by the factory:** yes. The creation code is 2,641 bytes and the deployed code 1,751, far under the 49,152 and 24,576 byte limits. It needs no constructor arguments, no linked libraries and no special address.\n- **No forbidden instructions:** the deployed code has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **`launch.json`:**\n  - It matches the code: contract `SpectraToken`, name, symbol, 18 decimals, empty constructor arguments, and total supply `10000000000000000000000000`.\n  - It uses only schema fields, with lowercase addresses.\n  - I couldn't check `economics` against the original job because the job's figures weren't among my inputs.\n\nI only read the specialty checklists for the code; I didn't run each of them as a separate pass. A clean result doesn't prove there are no defects, but here the code is unmodified OpenZeppelin plus a one-line mint.","treeHash":null,"usage":{"cachedInputTokens":230134,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":3448,"runtime":"claude","turns":6,"wallClockMs":113132}}],"verification":[{"checks":[{"durationMs":1252,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.16s\nCompiler run successful!\n","passed":true},{"durationMs":2492,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/SpectraTokenLaunch.t.sol:SpectraTokenLaunchTest\n[PASS] test_Create2DeploymentMintsEverythingToFactory() (gas: 51794)\n[PASS] test_DistributionClaimsAndPoolTransfersDeliverFullAmounts() (gas: 413579)\n[PASS] test_MintAndAdministrativeSelectorsRevertForFactoryAndStranger() (gas: 2045221)\n[PASS] test_RuntimeHasNoProhibitedOpcodes() (gas: 2259360)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.83ms (6.02ms CPU time)\n\nRan 31 tests for test/SpectraToken.t.sol:SpectraTokenTest\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256) (runs: 256, μ: 58754, ~: 59097)\nLogs:\n  Bound result 37740553061345313963846297250178020871717462525673606908103939236383678267413\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 119508, ~: 119757)\nLogs:\n  Bound result 2751424469670689478278413\n\n[PASS] testFuzz_TransferFromAboveAllowanceReverts(uint256,uint256) (runs: 256, μ: 123249, ~: 123321)\nLogs:\n  Bound result 2117439070\n  Bound result 5000000000000000000\n\n[PASS] testFuzz_TransferFromAccountsForEveryUnit(uint256,uint256) (runs: 256, μ: 163469, ~: 164839)\nLogs:\n  Bound result 128933355509094161607426\n  Bound result 1155853559086119258926\n\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 105124)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveFunds() (gas: 103787)\n[PASS] test_ApproveReplacesAllowance() (gas: 90131)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 37574)\n[PASS] test_ConstructorEmitsMintTransfer() (gas: 5521)\n[PASS] test_DeployerCannotSpendHolderTokensWithoutApproval() (gas: 94993)\n[PASS] test_ImmediateDeployerReceivesSupply() (gas: 32768)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 133661)\n[PASS] test_MetadataAndInitialSupply() (gas: 107395)\n[PASS] test_NativeCurrencyTransferIsRejected() (gas: 40126)\n[PASS] test_RevokingAllowancePreventsSpending() (gas: 130337)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51433)\n[PASS] test_SelfTransferStillRequiresBalance() (gas: 35929)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91538)\n[PASS] test_TransferDoesNotCallRecipient() (gas: 171798)\n[PASS] test_TransferEntireSupply() (gas: 86023)\n[PASS] test_TransferFromAboveAllowanceRevertsAtomically() (gas: 115784)\n[PASS] test_TransferFromExhaustsExactAllowance() (gas: 161761)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 126195)\n[PASS] test_TransferFromSpendsAllowanceAndEmitsTransfer() (gas: 160038)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 107691)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 114187)\n[PASS] test_TransferFromWithoutApprovalReverts() (gas: 57817)\n[PASS] test_TransferInsufficientBalanceRevertsAtomically() (gas: 120007)\n[PASS] test_TransferToZeroRevertsEvenForZeroAmount() (gas: 72018)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63035)\n[PASS] test_ZeroTransferFromRequiresNoAllowance() (gas: 81446)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 9.42ms (33.02ms CPU time)\n\nRan 1 test for test/SpectraTokenInvariant.t.sol:SpectraTokenInvariantTest\n[PASS]\nSpectraTokenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSpending\n[PASS] invariant_SupplyIsFixedAndEveryBalanceMatchesModel\n SpectraTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2637  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2749  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2806  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1965\n  Bound result 0\n  Bound result 3580\n  Bound result 0\n  Bound result 2499999999999999999999997\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 832522915673784118419119\n  Bound result 0\n  Bound result 1\n  Bound result 859400966793700880657059\n  Bound result 0\n  Bound result 3\n  Bound result 473\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1191312733281415187\n  Bound result 6063\n  Bound result 1754902321647013655606196\n  Bound result 518\n  Bound result 14\n  Bound result 763600050\n  Bound result 0\n  Bound result 20\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 75\n  Bound result 5698\n  Bound result 14\n  Bound result 0\n  Bound result 266\n  Bound result 4690\n  Bound result 1604499836459420506469631\n  Bound result 1871212140822525342\n  Bound result 24\n  Bound result 22\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.41s (2.41s CPU time)\n\nRan 3 test suites in 2.41s (2.43s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":30,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SpectraToken.approve(address,uint256)\",\"SpectraToken.transfer(address,uint256)\",\"SpectraToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":148,\"foundry.toml\":21,\"remappings.txt\":2,\"src/SpectraToken.sol\":17,\"test/SpectraToken.t.sol\":310,\"test/SpectraTokenInvariant.t.sol\":99,\"test/SpectraTokenLaunch.t.sol\":145},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":441,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":199,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SpectraToken.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"38c5973190323b3fc0778098b5835d5ffb6a2c63bc367977b7584c891d701a67","verifiedTreeHash":"ec0467bfd140251ace89f6f02a338468052d046f","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":1165,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.07s\nCompiler run successful!\n","passed":true},{"durationMs":2415,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/SpectraTokenLaunch.t.sol:SpectraTokenLaunchTest\n[PASS] test_Create2DeploymentMintsEverythingToFactory() (gas: 51794)\n[PASS] test_DistributionClaimsAndPoolTransfersDeliverFullAmounts() (gas: 413579)\n[PASS] test_MintAndAdministrativeSelectorsRevertForFactoryAndStranger() (gas: 2045221)\n[PASS] test_RuntimeHasNoProhibitedOpcodes() (gas: 2259360)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 8.46ms (6.37ms CPU time)\n\nRan 31 tests for test/SpectraToken.t.sol:SpectraTokenTest\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256) (runs: 256, μ: 58759, ~: 59097)\nLogs:\n  Bound result 2011670118925102053144204478746\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 119760, ~: 119769)\nLogs:\n  Bound result 17628\n\n[PASS] testFuzz_TransferFromAboveAllowanceReverts(uint256,uint256) (runs: 256, μ: 123127, ~: 123321)\nLogs:\n  Bound result 4\n  Bound result 15217\n\n[PASS] testFuzz_TransferFromAccountsForEveryUnit(uint256,uint256) (runs: 256, μ: 162820, ~: 164803)\nLogs:\n  Bound result 17409\n  Bound result 14\n\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 105124)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveFunds() (gas: 103787)\n[PASS] test_ApproveReplacesAllowance() (gas: 90131)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 37574)\n[PASS] test_ConstructorEmitsMintTransfer() (gas: 5521)\n[PASS] test_DeployerCannotSpendHolderTokensWithoutApproval() (gas: 94993)\n[PASS] test_ImmediateDeployerReceivesSupply() (gas: 32768)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 133661)\n[PASS] test_MetadataAndInitialSupply() (gas: 107395)\n[PASS] test_NativeCurrencyTransferIsRejected() (gas: 40126)\n[PASS] test_RevokingAllowancePreventsSpending() (gas: 130337)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51433)\n[PASS] test_SelfTransferStillRequiresBalance() (gas: 35929)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91538)\n[PASS] test_TransferDoesNotCallRecipient() (gas: 171798)\n[PASS] test_TransferEntireSupply() (gas: 86023)\n[PASS] test_TransferFromAboveAllowanceRevertsAtomically() (gas: 115784)\n[PASS] test_TransferFromExhaustsExactAllowance() (gas: 161761)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 126195)\n[PASS] test_TransferFromSpendsAllowanceAndEmitsTransfer() (gas: 160038)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 107691)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 114187)\n[PASS] test_TransferFromWithoutApprovalReverts() (gas: 57817)\n[PASS] test_TransferInsufficientBalanceRevertsAtomically() (gas: 120007)\n[PASS] test_TransferToZeroRevertsEvenForZeroAmount() (gas: 72018)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63035)\n[PASS] test_ZeroTransferFromRequiresNoAllowance() (gas: 81446)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 8.70ms (33.64ms CPU time)\n\nRan 1 test for test/SpectraTokenInvariant.t.sol:SpectraTokenInvariantTest\n[PASS]\nSpectraTokenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSpending\n[PASS] invariant_SupplyIsFixedAndEveryBalanceMatchesModel\n SpectraTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2665  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2732  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2795  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1313373040\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 155\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 4288775753\n  Bound result 192\n  Bound result 763\n  Bound result 517440284\n  Bound result 274\n  Bound result 2499999999999995193784763\n  Bound result 0\n  Bound result 4500\n  Bound result 2586\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 958355914090977668658260\n  Bound result 318\n  Bound result 185071071020336\n  Bound result 903\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 95\n  Bound result 3742438313309825917695060\n  Bound result 19\n  Bound result 1540\n  Bound result 5897\n  Bound result 23\n  Bound result 2200\n  Bound result 0\n  Bound result 5301\n  Bound result 321000000000000000000\n  Bound result 776631104220691196245873\n  Bound result 131\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.34s (2.34s CPU time)\n\nRan 3 test suites in 2.34s (2.36s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SpectraToken.approve(address,uint256)\",\"SpectraToken.transfer(address,uint256)\",\"SpectraToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":148,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/SpectraToken.sol\":17,\"test/SpectraToken.t.sol\":310,\"test/SpectraTokenInvariant.t.sol\":99,\"test/SpectraTokenLaunch.t.sol\":145},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7fc5ed1a2c453b21c9c74de89eee4b8e8e5c4d0d8b61cdfade695526b61841a8","verifiedTreeHash":"ea0d4fe93f59ac040de72e187149e27cdef543f3","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":1870,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.76s\nCompiler run successful!\n","passed":true},{"durationMs":17048,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/SpectraTokenLaunch.t.sol:SpectraTokenLaunchTest\n[PASS] test_Create2DeploymentMintsEverythingToFactory() (gas: 51794)\n[PASS] test_DistributionClaimsAndPoolTransfersDeliverFullAmounts() (gas: 413579)\n[PASS] test_MintAndAdministrativeSelectorsRevertForFactoryAndStranger() (gas: 2045221)\n[PASS] test_RuntimeHasNoProhibitedOpcodes() (gas: 2259360)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 125.32ms (9.40ms CPU time)\n\nRan 25 tests for test/SpectraTokenProperties.t.sol:SpectraTokenPropertiesTest\n[PASS] testFuzz_AllowanceAboveBalanceDoesNotCreateTokens(address,uint256,uint256) (runs: 1000, μ: 248305, ~: 248985)\nLogs:\n  Bound result 14129\n  Bound result 85477981194361848499032534479733438923149332154941907216288073702\n\n[PASS] testFuzz_AllowanceIsDirectional(address,address,uint256) (runs: 1000, μ: 72409, ~: 72830)\n[PASS] testFuzz_ApproveIsIdempotent(address,uint256) (runs: 1000, μ: 90966, ~: 91203)\n[PASS] testFuzz_ApproveIsLastWriteWinsForAnyOwner(address,address,uint256,uint256) (runs: 1000, μ: 116375, ~: 116591)\n[PASS] testFuzz_DelegatedTransferEqualsDirectTransfer(address,uint256) (runs: 1000, μ: 228468, ~: 229079)\nLogs:\n  Bound result 1137765466268620070751062\n\n[PASS] testFuzz_ExactlyOneWeiOverBalanceReverts(address,uint256) (runs: 1000, μ: 147770, ~: 147903)\nLogs:\n  Bound result 4849499481543581\n\n[PASS] testFuzz_HolderWithoutSupplyCannotSendAnything(address,address,uint256) (runs: 1000, μ: 42270, ~: 42296)\nLogs:\n  Bound result 21309802014270440177719703581451397302169996237764392853324\n\n[PASS] testFuzz_InfiniteAllowanceSurvivesAnySpendSequence(uint256,uint256) (runs: 1000, μ: 191502, ~: 191496)\nLogs:\n  Bound result 14858132\n  Bound result 9351909367735446650349969\n\n[PASS] testFuzz_KnownSelectorsNeverChangeSupply(uint8,bytes,address) (runs: 1000, μ: 38654, ~: 38395)\n[PASS] testFuzz_RoundTripRestoresBothBalances(address,uint256) (runs: 1000, μ: 118159, ~: 117963)\nLogs:\n  Bound result 4849499481543581\n\n[PASS] testFuzz_SpenderCannotExceedAllowanceAcrossSeveralCalls(uint256,uint256) (runs: 1000, μ: 172327, ~: 173652)\nLogs:\n  Bound result 14858132\n  Bound result 1235199\n\n[PASS] testFuzz_TransferOrderDoesNotMatter(address,address,uint256,uint256) (runs: 1000, μ: 279519, ~: 282572)\nLogs:\n  Bound result 2614219241553285591763546\n  Bound result 25209758674210502\n\n[PASS] testFuzz_TransferToAnyNonZeroAddressDeliversExactly(address,uint256) (runs: 1000, μ: 115056, ~: 115133)\nLogs:\n  Bound result 4849499481543581\n\n[PASS] testFuzz_TwoTransfersEqualOneTransferOfTheSum(address,uint256,uint256) (runs: 1000, μ: 203698, ~: 204535)\nLogs:\n  Bound result 14129\n  Bound result 8935934033574012834640262\n\n[PASS] testFuzz_UnknownSelectorsRevertAndChangeNothing(bytes4,bytes) (runs: 2000, μ: 60882, ~: 60665)\n[PASS] test_ConstructorRefusesEther() (gas: 770030)\n[PASS] test_EachDeploymentMintsItsOwnSupplyWithoutSharingState() (gas: 50702)\n[PASS] test_EmptyCalldataIsRejected() (gas: 57240)\n[PASS] test_MaxMinusOneAllowanceIsFiniteAndDecrements() (gas: 124224)\n[PASS] test_MetadataIsIdenticalAcrossDeploymentsAndCallers() (gas: 118490)\n[PASS] test_OwnerCannotSpendOwnBalanceThroughTransferFromWithoutSelfApproval() (gas: 159395)\n[PASS] test_SpendingAllowanceEmitsTransferButNoApprovalEvent() (gas: 129176)\n[PASS] test_SupplyIsExactlyTenMillionTokensInMinorUnits() (gas: 62081)\n[PASS] test_TokensSentToTheTokenContractAreUnrecoverable() (gas: 119070)\n[PASS] test_ZeroAddressCannotActAsSenderOrApprover() (gas: 102878)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 125.27ms (1.74s CPU time)\n\nRan 31 tests for test/SpectraToken.t.sol:SpectraTokenTest\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256) (runs: 256, μ: 58767, ~: 59097)\nLogs:\n  Bound result 733845428304552812837610645591\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 119660, ~: 119757)\nLogs:\n  Bound result 5000000000000000000\n\n[PASS] testFuzz_TransferFromAboveAllowanceReverts(uint256,uint256) (runs: 256, μ: 123103, ~: 123333)\nLogs:\n  Bound result 6390568843984275992168384\n  Bound result 7218862312031448015663676\n\n[PASS] testFuzz_TransferFromAccountsForEveryUnit(uint256,uint256) (runs: 256, μ: 162963, ~: 164803)\nLogs:\n  Bound result 3747177491222415445863881\n  Bound result 2463529933707768024\n\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 105124)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveFunds() (gas: 103787)\n[PASS] test_ApproveReplacesAllowance() (gas: 90131)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 37574)\n[PASS] test_ConstructorEmitsMintTransfer() (gas: 5521)\n[PASS] test_DeployerCannotSpendHolderTokensWithoutApproval() (gas: 94993)\n[PASS] test_ImmediateDeployerReceivesSupply() (gas: 32768)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 133661)\n[PASS] test_MetadataAndInitialSupply() (gas: 107395)\n[PASS] test_NativeCurrencyTransferIsRejected() (gas: 40126)\n[PASS] test_RevokingAllowancePreventsSpending() (gas: 130337)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51433)\n[PASS] test_SelfTransferStillRequiresBalance() (gas: 35929)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91538)\n[PASS] test_TransferDoesNotCallRecipient() (gas: 171798)\n[PASS] test_TransferEntireSupply() (gas: 86023)\n[PASS] test_TransferFromAboveAllowanceRevertsAtomically() (gas: 115784)\n[PASS] test_TransferFromExhaustsExactAllowance() (gas: 161761)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 126195)\n[PASS] test_TransferFromSpendsAllowanceAndEmitsTransfer() (gas: 160038)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 107691)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 114187)\n[PASS] test_TransferFromWithoutApprovalReverts() (gas: 57817)\n[PASS] test_TransferInsufficientBalanceRevertsAtomically() (gas: 120007)\n[PASS] test_TransferToZeroRevertsEvenForZeroAmount() (gas: 72018)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63035)\n[PASS] test_ZeroTransferFromRequiresNoAllowance() (gas: 81446)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 125.34ms (392.06ms CPU time)\n\nRan 1 test for test/SpectraTokenInvariant.t.sol:SpectraTokenInvariantTest\n[PASS]\nSpectraTokenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSpending\n[PASS] invariant_SupplyIsFixedAndEveryBalanceMatchesModel\n SpectraTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2732  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2788  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2672  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 4788\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 20\n  Bound result 1\n  Bound result 415955171\n  Bound result 364\n  Bound result 3688\n  Bound result 0\n  Bound result 728\n  Bound result 0\n  Bound result 127\n  Bound result 1569\n  Bound result 4000000000000000000\n  Bound result 45\n  Bound result 345\n  Bound result 0\n  Bound result 11211906\n  Bound result 20\n  Bound result 2\n  Bound result 545\n  Bound result 1063\n  Bound result 127\n  Bound result 514173667412050780976201\n  Bound result 0\n  Bound result 9\n  Bound result 0\n  Bound result 0\n  Bound result 189\n  Bound result 9\n  Bound result 0\n  Bound result 5000000000000000000\n  Bound result 514177667412050780975054\n  Bound result 0\n  Bound result 6\n  Bound result 2000000000000000000\n  Bound result 10000000000000000000\n  Bound result 3014172667412050376234310\n  Bound result 2957397979\n  Bound result 158\n  Bound result 774\n  Bound result 4342\n  Bound result 1\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.47s (2.46s CPU time)\n\nRan 1 test for test/SpectraTokenOpenInvariant.t.sol:SpectraTokenOpenInvariantTest\n[PASS]\nSpectraTokenOpenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchModelForEveryPair\n[PASS] invariant_NoHolderExceedsSupplyAndVolumeIsBoundedByCalls\n[PASS] invariant_TokenContractBalanceOnlyGrows\n[PASS] invariant_TotalSupplyNeverMoves\n[PASS] invariant_TrackedBalancesSumToSupplyAndMatchModel\n SpectraTokenOpenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+------------------------------+-------+---------+----------╮\n| Contract         | Selector                     | Calls | Reverts | Discards |\n+==============================================================================+\n| OpenTokenHandler | approve                      | 1355  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | approveZeroSpender           | 1382  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | deployerTriesPrivilegedCall  | 1316  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | sendToSink                   | 1386  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | strangerCallsUnknownSelector | 1398  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transfer                     | 1411  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transferAboveBalance         | 1279  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transferFrom                 | 1356  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transferFromAboveAllowance   | 1384  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transferFromAboveBalance     | 1339  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transferToFresh              | 1346  | 0       | 0        |\n|------------------+------------------------------+-------+---------+----------|\n| OpenTokenHandler | transferToZeroAddress        | 1432  | 0       | 0        |\n╰------------------+------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640554039457584007914178104055\n  Bound result 235\n  Bound result 115792089237316195423570985008687907853269984665640554039457584007913129640618\n  Bound result 0\n  Bound result 10000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6736\n  Bound result 0\n  Bound result 17\n  Bound result 8938850\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7915\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 11372\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 19\n  Bound result 0\n  Bound result 22\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639933\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.98s (16.97s CPU time)\n\nRan 5 test suites in 16.98s (19.82s CPU time): 62 tests passed, 0 failed, 0 skipped (62 total tests)\n","passed":true},{"durationMs":33,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SpectraToken.approve(address,uint256)\",\"SpectraToken.transfer(address,uint256)\",\"SpectraToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":148,\"foundry.toml\":21,\"remappings.txt\":2,\"src/SpectraToken.sol\":17,\"test/SpectraToken.t.sol\":310,\"test/SpectraTokenInvariant.t.sol\":99,\"test/SpectraTokenLaunch.t.sol\":145,\"test/SpectraTokenOpenInvariant.t.sol\":355,\"test/SpectraTokenProperties.t.sol\":441},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b8f9b432c0e685f8f8cb63de3c63f1bfad33fffde634e6b5ac552e1366e31785","verifiedTreeHash":"1e3c0a99b56fb436af7d557df46e7f632174d160","verifierVersion":"0.1.0+fb8278c5"}]}