{"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":"f517afbf-674b-439f-84a3-f69c17deb66c","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"bb8b65df4a33f87ec17851ad25910b716ea08927bf39146f49d12a54b45bed9c","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":"2380707ce4453898b374df212ef1ef069370da97d797b93371539dafe972a500","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":"96b28e1e8fa0786352da3da313dd59d20f7c18f0d45cf86fa6207da826667907","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":"b8d576edf3f7854022bd60fa2eb64f908f006034131a4a6a755f0219dd13e9fa","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":"6d58fcdfb028ef589252a4a2f77fb32ac12f96ef2255186e770931a78340a730","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":"022554e8b238971f1110742dba7a5cec5e811246709e163c4dfa7ef6f18edabb","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":"093529fb953ad773062a6e7cbee9024d196f035f7d42189fc71986fea0702073","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"436543093f9855ce30848e404c7901d08ddb6e48431c388f06e0684fc344cc32","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: Polyneum (POLYNEUM).\nToken name: Polyneum\nToken symbol: POLYNEUM\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"9351a15eac0dcfb222576e59da7b9a768da767685b05251f266858b3c0a18c70","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f517afbf-674b-439f-84a3-f69c17deb66c","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1587-polyneum"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52597","feedbackHash":"afee5d7775c4e8f62a5c7f9fb7c30e7d9f2fc88d6d613029ef2fdd879d5edd5b","nodeKey":"audit_economics","submissionHash":"bb8b65df4a33f87ec17851ad25910b716ea08927bf39146f49d12a54b45bed9c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52734","feedbackHash":"e9e2fbfcaf4c7da4f4e91f6629681329065110c28b5e484e26510d73265dd8ad","nodeKey":"audit_flow","submissionHash":"2380707ce4453898b374df212ef1ef069370da97d797b93371539dafe972a500","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52548","feedbackHash":"4f58d7032a5f810ac79f1cee51608c08bc871282d426829a0fa31b974c5cea6d","nodeKey":"audit_judge","submissionHash":"96b28e1e8fa0786352da3da313dd59d20f7c18f0d45cf86fa6207da826667907","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52660","feedbackHash":"475c786f694ae7a24dece9b6ac00047107cac22bf5fe0cfe17c7fafb58fd2172","nodeKey":"audit_math","submissionHash":"b8d576edf3f7854022bd60fa2eb64f908f006034131a4a6a755f0219dd13e9fa","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52591","feedbackHash":"8b6cbaed2f1ca5ac57f4d00ce584c29ab83846541cefae894a38dc90343e28f6","nodeKey":"audit_permissions","submissionHash":"6d58fcdfb028ef589252a4a2f77fb32ac12f96ef2255186e770931a78340a730","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52617","feedbackHash":"b021d6b57a4fa355720eafbbeaaecf105556f9b506c2f8d365a2da1a37f32abb","nodeKey":"build_contract_project","submissionHash":"022554e8b238971f1110742dba7a5cec5e811246709e163c4dfa7ef6f18edabb","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52175","feedbackHash":"fa920ff5ec6cb3a3a1678a4f2aed79a9f09e568d595b0f4c93cf52f4786301f6","nodeKey":"manifest","submissionHash":"093529fb953ad773062a6e7cbee9024d196f035f7d42189fc71986fea0702073","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52171","feedbackHash":"3fc5290d2d7ac3267f848f378a6e706877828ed587d42efffd6fea05a568c750","nodeKey":"write_foundry_tests","submissionHash":"436543093f9855ce30848e404c7901d08ddb6e48431c388f06e0684fc344cc32","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"44574ce648dec334ff4cf9f94bddcf5c4b1c2e56145df74095c6daa5b5c1a207","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"17f10e2c2b8374000a5744eb86e3efd1ffa7fd101a8896c4c5374118eb419dc2","device":"76df9026b98e4277","findings":[],"hash":"022554e8b238971f1110742dba7a5cec5e811246709e163c4dfa7ef6f18edabb","nodeId":"1747ad8f-8cd1-4b56-a682-c6695cfbafb8","outcome":"completed","summary":"Done. The Polyneum token is implemented, tested, documented, and committed on main.\n\n**What was built**\n\n- `src/Polyneum.sol`: contract `Polyneum`, a plain OpenZeppelin v5.1.0 ERC-20. Name `Polyneum`, symbol `POLYNEUM`, 18 decimals. The constructor takes no arguments and mints the full supply of 1,000,000,000 × 10^18 once to `msg.sender`. No owner, no mint, no burn, no pause, no blacklist, no transfer fee, no upgradeability, no external calls.\n- `test/Polyneum.t.sol`: 27 tests covering metadata, the single constructor mint and its events, transfer and transferFrom success and failure paths, a fuzzed supply-conservation check, the launch flows arriving whole, the absence of any mint or admin selector from both a stranger and the deployer, rejection of plain ether, and an opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT.\n- `script/DeployPolyneum.s.sol`: a reviewable deploy script whose `deploy()` function the tests call directly. Its `run()` reads no environment.\n- `foundry.toml` at the repo root pins solc 0.8.26, sets `bytecode_hash = \"none\"`, and keeps ffi off with no filesystem permissions.\n- `lib/`: forge-std v1.9.6 and the OpenZeppelin ERC20 subset vendored as plain files. No submodules, no `.git` directories.\n- `README.md`: design, assumptions, deployment parameters, operational responsibilities, and open items for the launch.\n\n**Verification**\n\n```\nforge build        Compiler run successful\nforge test         27 passed, 0 failed (also passes under an empty environment)\nforge fmt --check  clean\n```\n\nSlither and Mythril were not available here and did not run. No launch.json was written. Nothing was signed or broadcast.","treeHash":"e7c63f14917bd30b1e8a593907b3e5a2b3c7c62d","usage":{"cachedInputTokens":432048,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":16992,"runtime":"claude","turns":21,"wallClockMs":187497}},{"artifacts":[],"attempt":1,"bundleHash":"71565c115b37f526891b130674b87ba3b85fa7d7989b08ace8019d171f48bd53","device":"b4e34f9d3c724992","findings":[],"hash":"093529fb953ad773062a6e7cbee9024d196f035f7d42189fc71986fea0702073","nodeId":"26561976-55cd-46ec-8bfb-3167fd24f297","outcome":"completed","summary":"I wrote launch.json for the Polyneum launch and verified it against the accepted tree.\n\n**What the manifest says**\n\n- Kind is custom_token. The token contract is `Polyneum`, name Polyneum, symbol POLYNEUM, 18 decimals.\n- constructorArgs is empty, matching the accepted constructor, which takes no parameters and mints the whole supply to msg.sender once.\n- totalSupply is 1000000000000000000000000000, the exact constant the constructor mints.\n- contracts is empty. The tree holds only the token, a local forge script the launch does not use, and tests.\n- pool and economics are copied exactly as the launch gives them: IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object verbatim.\n- notes describe the token's fixed supply and absence of privileged behavior, at 1,145 characters.\n\n**Checks run**\n\n- JSON parses with only the schema's six top-level keys, economics matches the job's object, and totalSupply equals 10^9 times 10^18.\n- `forge build` succeeded and `forge test` passed all 27 tests.\n- Git status shows launch.json as the only new file. No other file changed.","treeHash":"189bb225336723239a6818a2188b561d4ff11ead","usage":{"cachedInputTokens":179841,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2460,"runtime":"claude","turns":8,"wallClockMs":40243}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a5d68f89de314cb","findings":[],"hash":"1d46e957a23b0bdfa13f38444e8231d8f732f9ac788b57efdf6c1b03c38def35","nodeId":"a8d47bc0-d1ce-4f92-b8a4-87a834c3c183","outcome":"failed","summary":"wall-clock budget exhausted","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"claude-fable-5-1","outputTokens":0,"runtime":"claude","turns":0,"wallClockMs":5298889}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"2cd7c8e4bd7aedde","findings":[{"citation":"resolved","description":"Polyneum declares a public constant DECIMALS and uses it to compute TOTAL_SUPPLY (line 26), but does not override OpenZeppelin's decimals(), which returns the hard-coded 18 at lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:78. Today both values are 18, so decimals(), DECIMALS, TOTAL_SUPPLY and the manifest's decimals: 18 all agree and no launch check fails. The coupling is latent: the supply is derived from one constant while the decimals the pool, the manifest check (Token.protected.t.sol test_decimalsMatchTheManifest) and every wallet read come from a different, unrelated literal. This is a maintainability note, not an exploitable defect in the code as it stands; no unprivileged input changes either value after deployment.","line":23,"path":"src/Polyneum.sol","reproduction":"Current state: deploy Polyneum from any address; token.decimals() == 18 and token.DECIMALS() == 18, TOTAL_SUPPLY == 1e27. Expected == actual, nothing fails. Latent failure shown by the one-line edit the constant invites: set DECIMALS = 9 and rebuild. TOTAL_SUPPLY becomes 1_000_000_000 * 10**9 = 1e18 and the constructor mints 1e18, but decimals() still returns 18, so the token reports a supply of 1 POLYNEUM while the manifest would say 1e18 minor units at 9 decimals; test_decimalsMatchTheManifest and test_mintsTheManifestSupplyToTheFactory would then disagree with each other. Minimal fix that preserves behaviour: add `function decimals() public pure override returns (uint8) { return DECIMALS; }`, or drop the DECIMALS constant and write TOTAL_SUPPLY as 1_000_000_000 * 1e18.","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant is not wired to decimals(): two sources of truth for the decimal count"}],"hash":"2380707ce4453898b374df212ef1ef069370da97d797b93371539dafe972a500","nodeId":"a8d47bc0-d1ce-4f92-b8a4-87a834c3c183","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written and valid. No tracked files were changed.\n\n**Outcome: no exploitable defect found in Polyneum.** The token is a plain OpenZeppelin v5.1.0 ERC-20 whose constructor mints the full supply once to the deployer. One informational note is recorded.\n\nWhat I checked, against the Execution Trace, Periphery and First Principles guides:\n\n- **Entry points.** Traced `approve`, `transfer` and `transferFrom` through the inherited OpenZeppelin code. Each guard, state write and revert path behaves as intended. Exact amounts move on every transfer, so the factory, distributor, PoolManager and trader flows all arrive whole. Allowance handling, including the infinite-allowance case, is standard.\n- **Constructor and supply.** No arguments and no external calls. It mints exactly 1e27 units to the caller, which is the factory under the launch's CREATE2 deployment. No mint or burn path exists afterwards.\n- **Periphery.** The vendored OpenZeppelin files were diffed byte-for-byte against the upstream v5.1.0 tag and are identical. The deployment script only does a plain `new Polyneum()` and reads no keys or environment.\n- **Runtime bytecode.** Disassembly shows no CALL, DELEGATECALL, CALLCODE, STATICCALL, CREATE or SELFDESTRUCT. There is no receive or fallback, so ether is rejected.\n- **Static analysis lead.** The aderyn large-literal warning on the supply constant is a style note. The value evaluates to exactly 1e27 without overflow.\n- **Tests.** The existing 27-test suite builds and passes on this tree.\n\nThe one recorded finding is informational: the `DECIMALS` constant drives the supply calculation but is not wired into `decimals()`, which returns OpenZeppelin's hard-coded 18. Both are 18 today, so nothing fails and no launch check disagrees. The note explains how a future edit to the constant would desynchronise supply and reported decimals, and gives a one-line override as the fix.\n\nThe coverage record answers all three listed entry points as `holds`, plus rows for the constructor, two invariants, both periphery files and the static-analysis lead.","treeHash":null,"usage":{"cachedInputTokens":611288,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":10147,"runtime":"claude","turns":18,"wallClockMs":153666}},{"artifacts":[],"attempt":1,"bundleHash":"677889ce2e39a21b36cef9db136484d693963575bb5128f8142b7e8289e34dfa","device":"2e0556e0bee1a109","findings":[{"description":"Polyneum inherits OpenZeppelin ERC20 unchanged and adds no rescue function, so a transfer to address(token) succeeds and the balance can never be moved again: the token contract never calls approve or transfer on itself and there is no owner. This is consistent with the README's stated design (no admin powers, holders responsible for recipients) and is not a defect against the brief, which asks for a fixed-supply token with no privileged hand. It is recorded so the requester knows the behaviour is deliberate and tested (test/Polyneum.fuzz.t.sol testFuzz_transferToTheTokenItselfIsAcceptedAndStuck, and the donateToToken handler in test/Polyneum.invariant.t.sol). No other deviation from the brief was found: supply is exactly 1e27 minted once to msg.sender, metadata matches, no mint/burn/admin selector exists, and conservation, allowance accounting and failure-path atomicity held over 256 random sequences of 64 calls.","line":15,"path":"src/Polyneum.sol","reproduction":"vm.prank(deployer); token.transfer(address(token), 1 ether); expected (by design): balanceOf(address(token)) == 1 ether and no call can move it; actual: identical.","severity":"info","title":"Tokens sent to the token contract's own address are permanently stuck"}],"hash":"436543093f9855ce30848e404c7901d08ddb6e48431c388f06e0684fc344cc32","nodeId":"161c931a-c083-44aa-b9e1-fd5e283a1178","outcome":"completed","summary":"The findings file is excluded from git by the harness's own `.git/info/exclude`, which is how it is picked up. Everything is in place.\n\n**Outcome.** Two new test files were added under `test/`, the whole suite passes, and no defect was found in the token. The existing unit suite was kept as is.\n\n| Suite | Tests | Result |\n| --- | --- | --- |\n| `test/Polyneum.t.sol` (existing) | 27 | pass |\n| `test/Polyneum.fuzz.t.sol` (new, 1000 runs each) | 34 | pass |\n| `test/Polyneum.invariant.t.sol` (new, 256 runs × depth 64) | 8 invariants | pass, 0 handler reverts |\n\n**Invariant suite.** A handler drives five actors through transfer, approve and transferFrom in random order. It has clamped entry points that always succeed and unclamped ones with unrestricted receivers, owners and amounts, plus stress variants: whole balance, one wei, self-transfer, balance plus one, allowance plus one, infinite approval, donation to the token's own address, and attempts at mint, burn, pause, blacklist and upgrade selectors. Every revert is caught and must be the exact ERC-6093 error for the inputs, and must leave every balance and allowance unchanged, so the failure paths are exercised inside the random sequences with fail-on-revert enabled. The invariants check that total supply is fixed, that balances across every address ever touched sum to the supply, that a ghost balance and ghost allowance model agree with the contract, that nobody holds more than flowed into them, that the zero address holds nothing, that metadata is constant, and that the campaign actually produced both successes and reverts.\n\n**Fuzz suite.** Stateless properties with the edge cases pinned beside them: any deployer receives the full supply, two deployments are independent, round-trip transfers restore balances, self-transfer is a no-op, split transfers sum exactly, approve overwrites rather than accumulates, finite allowances decrement exactly while the infinite one never does, failed transfers and spends leave allowances and balances intact, allowance is checked before balance, zero-amount transferFrom needs no allowance, zero-address sender, receiver, spender and approver are all rejected, unknown selectors and ether with any calldata are rejected, and transferFrom emits only a Transfer event.\n\n**One harness correction during the work.** My first expectation for a transferFrom from the zero address with amount zero was wrong. OpenZeppelin spends the allowance before checking the sender, and writing the spent allowance back rejects a zero owner, so the error is `ERC20InvalidApprover`, not `ERC20InvalidSender`. I confirmed this in the vendored library source and the tests now pin that exact behaviour.\n\n**Findings.** No defect against the brief. One info-level note is recorded in the findings file: tokens sent to the token's own address are stuck forever, which the README already documents as deliberate for a token with no admin powers. It carries no proof because it is not a defect.","treeHash":"a37d2b0ed28b99cc6aa3658e4a064f75a5214610","usage":{"cachedInputTokens":884359,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":28466,"runtime":"claude","turns":29,"wallClockMs":394290}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5061b3ff85c1f0c1","findings":[],"hash":"6d58fcdfb028ef589252a4a2f77fb32ac12f96ef2255186e770931a78340a730","nodeId":"a54498b2-a44e-4f6d-a312-7477d3b6517a","outcome":"completed","summary":"The review is complete. No defects were found in the Access Control, Trust Gap or Asymmetry areas, and the findings file records an empty list with a full coverage record.\n\n**What the token is.** Polyneum is an unmodified OpenZeppelin v5.1.0 ERC20 whose constructor mints the whole supply once to the deployer. It has no owner, no roles, no pause, no blacklist, no mint or burn, no fee branch, no receive or fallback, and no external calls.\n\n**What I verified.**\n- The five vendored OpenZeppelin files are byte-identical to upstream v5.1.0, so no hidden override of the transfer or sender logic exists.\n- The compiled ABI exposes exactly three state-changing functions: approve, transfer and transferFrom. A fuzz over 2000 random selectors from random callers confirmed every other selector reverts.\n- A stateful invariant fuzz of about 128,000 transfer and approve-then-pull calls kept the sum of balances equal to a total supply of one billion tokens.\n- The deployer, which is the factory at launch, cannot pull a holder's balance without an allowance, and holds no power beyond its own balance.\n- The runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT, matching the project's own opcode scan and the protected floor test.\n- The aderyn large-literal lead on the supply constant was checked and the value is correct.\n\n**Coverage.** All three listed entry points are marked `holds`, plus four invariant rows covering privilege absence, supply, library provenance and the deployer trust assumption. The standard ERC-20 approve race is documented by the author and is not reported as a defect.\n\n**State of the tree.** Only `.imd-findings.json` and the scratch test under `test/scratch/` were written. No tracked files changed.","treeHash":null,"usage":{"cachedInputTokens":724655,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":9324,"runtime":"claude","turns":22,"wallClockMs":142518}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9b657b3675e34ec5","findings":[{"citation":"resolved","description":"Polyneum declares `uint8 public constant DECIMALS = 18` and derives TOTAL_SUPPLY from it (line 26, `1_000_000_000 * 10 ** uint256(DECIMALS)`), but does not override OpenZeppelin ERC20.decimals(), which returns a hard-coded 18 (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:78). In the code as shipped both values are 18, so decimals(), DECIMALS, TOTAL_SUPPLY (1e27), the manifest (decimals 18, totalSupply 1000000000000000000000000000) and the protected floor's test_decimalsMatchTheManifest all agree; nothing is exploitable and no unprivileged input can change either value after deployment. The issue is latent: the constant is documented as 'Number of decimals' but only scales the minted supply, so a future edit of DECIMALS would silently desynchronise supply scale from reported decimals. Two specialists (audit_math, audit_flow) reported the same root cause; merged here at the severity it deserves, info. Minimal behaviour-preserving fix: `function decimals() public pure override returns (uint8) { return DECIMALS; }`, or drop the constant and write TOTAL_SUPPLY as 1_000_000_000 * 1e18. No revision is required for the launch.","line":23,"path":"src/Polyneum.sol","reproduction":"Reproduced on the current tree: deploy Polyneum from any address; token.decimals() == 18, token.DECIMALS() == 18, token.totalSupply() == 1_000_000_000e18 == TOTAL_SUPPLY (test/Polyneum.t.sol test_metadata and test_supplyIsOneBillionWithEighteenDecimals pass; forge test: 62 passed). Expected == actual today. The latent divergence shows only under an edit: set line 23 to `uint8 public constant DECIMALS = 9;` and rebuild; TOTAL_SUPPLY becomes 1e18 and the constructor mints 1e18, while decimals() still returns 18, so the token reports 1 POLYNEUM at 18 decimals while the manifest would state 1e18 minor units at 9 decimals.","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant does not drive decimals(): two sources of truth for the supply scale (merged: audit_math, audit_flow)"},{"citation":"resolved","description":"Polyneum inherits OpenZeppelin ERC20 unchanged, adds no owner and no rescue function, and the contract never calls approve or transfer on itself, so any balance sent to address(token) can never move again. This is consistent with the brief (a fixed-supply token with no privileged hand) and the README's stated holder-custody responsibility, so it is a trust assumption to document, not a defect. Recorded so the requester knows the behaviour is deliberate; the project's own tests pin it (test/Polyneum.fuzz.t.sol testFuzz_transferToTheTokenItselfIsAcceptedAndStuck, and the donateToToken handler in test/Polyneum.invariant.t.sol). Adding a rescue path would require an owner role the brief does not ask for; no change recommended.","line":15,"path":"src/Polyneum.sol","reproduction":"Reproduced: vm.prank(deployer); token.transfer(address(token), 1 ether); then balanceOf(address(token)) == 1 ether; vm.prank(deployer); token.transferFrom(address(token), deployer, 1) reverts with ERC20InsufficientAllowance(deployer, 0, 1); no selector exists that moves the balance (testFuzz_unknownSelectorsAlwaysRevert). Expected (by design) == actual. Also exercised in test/scratch/Create2Launch.t.sol during this review.","severity":"info","snippet":"contract Polyneum is ERC20 {","title":"Tokens transferred to the token contract's own address are permanently stuck (design note, from the independent tester)"}],"hash":"96b28e1e8fa0786352da3da313dd59d20f7c18f0d45cf86fa6207da826667907","nodeId":"189768c2-34b0-4c0e-8682-d53c7df8d5bc","outcome":"completed","summary":"Review complete. The findings file is written and validated.\n\n**Outcome: no defect found that reopens the author's work.** Polyneum is an unmodified OpenZeppelin v5.1.0 ERC20 with a no-argument constructor that mints the manifest's exact supply to the deployer. All three state-changing entry points hold, and the launch deployment model holds end to end.\n\n**Specialist findings settled**\n\n- **DECIMALS not wired to decimals()** was reported twice, by audit_math and audit_flow. Merged into one info finding. Reproduced: both values are 18 today and only an edit to the constant would expose the divergence. Not a defect in the shipped code.\n- **Tokens sent to the token contract are stuck**, from the independent tester. Reproduced and kept as info. It follows from the brief's \"no privileged hand\" design and is already pinned by the project's own fuzz and invariant tests.\n- **README states 88%/2% as this launch's split**, from audit_economics. Dropped. The reference states the example manifest's pool and economics are this launch's own, and launch.json carries those same values, so the README is correct.\n\n**Independent checks that passed**\n\n- Full suite: 62 tests pass, including the 256-run invariant campaign. Formatting check passes.\n- Vendored OpenZeppelin files compared byte for byte with upstream v5.1.0. No differences.\n- Creation code and runtime are far under the factory's size limits. Constructor takes no arguments and makes no external calls, so CREATE2 from the factory deploys it. A scratch test under test/scratch confirmed CREATE2 from a contract mints the whole supply to that contract, and that launch flows move exactly what they say.\n- launch.json uses only schema keys, lowercase addresses, and a valid contract name. The paired currency on chain 1 has code and reports symbol IMD with 18 decimals, checked via the task's chain-1 endpoint.\n- Static analysis leads: slither reported nothing; aderyn's large-literal note is the supply constant and is cosmetic.\n\n**Coverage record:** seven rows, all `holds`, covering the three entry points plus the supply, deployability, privilege, and manifest invariants.","treeHash":null,"usage":{"cachedInputTokens":554326,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11947,"runtime":"claude","turns":17,"wallClockMs":186947}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1ec9f666356a7ad7","findings":[{"citation":"resolved","description":"TOTAL_SUPPLY is computed from DECIMALS (line 26: `1_000_000_000 * 10 ** uint256(DECIMALS)`), but `decimals()` is not overridden, so it returns OpenZeppelin ERC20's hard-coded 18 regardless of DECIMALS. Today both are 18 and the manifest's decimals (18) and totalSupply (1e27) agree with the chain, so nothing is wrong in the deployed code. The defect is latent: the constant is documented as 'Number of decimals' and public, but the only thing it scales is the minted supply. Any later edit of DECIMALS silently desynchronises the supply scale from the reported decimals, and the existing test `test_metadata` would still pass for `decimals()` while the manifest check `decimals disagree with the manifest` or the supply check would fail at admission. Minimal fix that preserves behaviour: add `function decimals() public pure override returns (uint8) { return DECIMALS; }` so the scale has one source. No impact on the current build; reported for the author's awareness only.","line":23,"path":"src/Polyneum.sol","reproduction":"State: change line 23 to `uint8 public constant DECIMALS = 6;` and rebuild. Expected: decimals() == 6 and totalSupply() == 1_000_000_000 * 10**6. Actual: decimals() still returns 18 while TOTAL_SUPPLY and totalSupply() become 1_000_000_000_000_000 (1e15), i.e. a reported supply of 0.001 POLYNEUM at the reported 18 decimals. With the shipped value 18 the two agree (verified: token.decimals() == token.DECIMALS() == 18, totalSupply() == 1e27).","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant does not drive decimals(): two sources of truth for the supply scale"}],"hash":"b8d576edf3f7854022bd60fa2eb64f908f006034131a4a6a755f0219dd13e9fa","nodeId":"dbb1c1b2-007c-46fc-bbb6-7b25f400d679","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome: no exploitable math, boundary or numerical-gap defect found.** The findings file holds one informational note and a full coverage record.\n\nWhat I checked, against the Math Precision, Boundary and Numerical Gap guides:\n\n- **Math.** The only arithmetic is the compile-time supply constant and OpenZeppelin v5.1.0's balance and allowance updates. The supply is exactly 1e27, which fits uint256, uint128 and int128 with wide margin, so Uniswap v4 balance deltas cannot saturate. The unchecked subtractions are guarded by a prior compare, and the unchecked additions are bounded by total supply. There is no division, scaling, fee or accumulator anywhere.\n- **Boundaries.** The token makes no external calls, has no payable, receive or fallback function, decodes no bytes, and its only sentinel branches are the zero-address reverts in the library. The compiled ABI exposes exactly the three state-changing entry points the verifier listed.\n- **Seams.** Every transfer moves exactly the requested amount, so no precision-versus-invariant or boundary-versus-precision seam exists. The 10/88/2 launch split of the supply divides with zero dust.\n\nScratch tests I ran under test/scratch, all passing: whole-balance self-transfer, self transferFrom, zero-amount transferFrom without allowance, max and max-minus-one allowance handling, overwrite approve semantics, transfers of supply+1 and uint256 max reverting, and a fuzzed sum-of-balances equals total-supply invariant. The project's own suite also passes at 27 tests.\n\nThe one note reported, at info severity, is that the public DECIMALS constant scales the minted supply but does not drive decimals(), which still returns the library default. Both are 18 today so the deployed code is consistent with the manifest. It is reported only because a future edit to that constant would silently desynchronise reported decimals from the supply scale. The aderyn large-literal lead is the intended supply value and is not a defect.\n\nCoverage rows: all three entry points hold, plus rows for the constructor and supply constant, the supply-conservation invariant, the external boundary inventory and the numerical seams. Nothing in the assigned area was left unreached. The protected launch test could not be executed locally because it depends on v4-core, which is not vendored here.","treeHash":null,"usage":{"cachedInputTokens":634286,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":10460,"runtime":"claude","turns":23,"wallClockMs":166790}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9f3c23750c16c22c","findings":[{"citation":"resolved","description":"Documentation only; no token code is affected. The job for Polyneum states name, symbol and supply and does not state poolBps, initialMarketCapWei or remainderTo. README lines 36-38 nevertheless assert, as a fact about 'the IMD launch', that 88% seeds the pool and 2% goes to economics.remainderTo, and test/Polyneum.t.sol:16 and :23 hard-code POOL_BPS = 8800 and REMAINDER_TO = 0x49c95a6EE32E9c0dC7A353c078e6158304BbCe9F. Both values are copied from the reference's example manifest (KiteToken), not from this job. The token itself is indifferent to the split (every transfer is exact for any amounts), so the only risk is that the manifest step or a reader treats these numbers as this launch's economics; admission refuses a manifest whose economics are not the job's verbatim, so the failure is caught before deployment. Fix: either remove the specific percentages and address from README and the test (keep the 10% swarm share, which is by construction) or label them explicitly as illustrative example values.","line":37,"path":"README.md","reproduction":"State: README.md:37-38 reads '88% to seed the pool, 2% to the requester's economics.remainderTo'; test/Polyneum.t.sol:23 reads 'address constant REMAINDER_TO = 0x49c95a6EE32E9c0dC7A353c078e6158304BbCe9F;'. Input: the task text for Polyneum, which gives no poolBps and no remainderTo. Expected: README describes only what the job fixes (supply, 10% swarm share by construction) or marks the rest as an example. Actual: the example manifest's split and address are presented as this launch's. No on-chain effect; the launch-flow test passes for any split because transfers are exact.","severity":"info","snippet":"  (10% to the swarm's MerkleDistributor, 88% to seed the pool, 2% to the requester's","title":"README states the example manifest's 88%/2% split and the test pins the example's remainderTo as if they were this launch's economics"}],"hash":"bb8b65df4a33f87ec17851ad25910b716ea08927bf39146f49d12a54b45bed9c","nodeId":"3a3de0b9-0b40-43ae-adac-91291f9c929e","outcome":"completed","summary":"The review is complete. The findings file is written and validated, the cited snippet matches the tree exactly, and the working tree shows no tracked changes.\n\n**Outcome: no defects in the token code.** The Polyneum contract is a 41-line wrapper around OpenZeppelin ERC20 v5.1.0 with a single constructor mint. I found nothing in the Economic Security, Invariant, or Flow Gap areas that fails on a concrete input. The only entry in the findings file is an info-level documentation note.\n\nWhat I checked, against each of the three assigned guides:\n\n- **Economic Security.** No external dependencies, oracles, or callbacks exist. Transfer behavior is exact with no fee, rebase, pause, or blacklist. Sentinel probes (transfer to zero, transferFrom from zero, approve to zero) all revert as the standard requires. The ERC-20 surface in the compiled ABI is complete and has no hidden selectors.\n- **Invariant.** A scratch invariant fuzz over random transfer, approve, and transferFrom sequences confirmed sum of balances equals total supply and total supply stays at 1e27 throughout. No burn path is reachable from any ABI entry point since transfers to the zero address revert.\n- **Flow Gap.** I traced the protected floor test's flows: CREATE2 deployment from the factory mints the whole supply to the factory, the swarm share and claims arrive whole, and plain ERC-20 transfer semantics satisfy the Uniswap v4 PoolManager sync and settle paths for seeding and both swap directions.\n\nI also diffed every vendored OpenZeppelin file against the upstream v5.1.0 tag and all five are byte-identical, so no transfer or allowance logic was altered locally.\n\n**The one info finding** concerns README line 37 and the test file. They present the reference example's 88% pool share, 2% remainder, and the example's remainderTo address as if they were this launch's economics. The job text for Polyneum states only name, symbol, and supply. The token code is indifferent to the split, and admission would refuse a manifest with copied example values, so there is no on-chain effect. The fix is to drop the specific numbers or mark them as illustrative.\n\n**Coverage.** All three listed entry points are marked `holds`, with additional rows for the constructor, the two conservation invariants, the privileged-hand invariant, the vendored dependency check, and the protected-floor flow trace. Nothing was left unreached.\n\nOne trust assumption worth noting for the judge: the standard ERC-20 approve front-running race applies and is documented in the README. It is accepted ERC-20 behavior, not a defect.","treeHash":null,"usage":{"cachedInputTokens":624017,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":14634,"runtime":"claude","turns":26,"wallClockMs":236678}}],"verification":[{"checks":[{"durationMs":954,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 832.34ms\nCompiler run successful!\n","passed":true},{"durationMs":105,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 27 tests for test/Polyneum.t.sol:PolyneumTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100599, ~: 101038)\nLogs:\n  Bound result 321632372033671818296909482\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 63278)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 30826)\n[PASS] test_constructorEmitsMintAndSupplyEvents() (gas: 19773)\n[PASS] test_deployScriptFunctionMintsToTheScript() (gas: 1599542)\n[PASS] test_deployerCannotMoveAHoldersBalance() (gas: 155881)\n[PASS] test_deployerIsWhoeverSendsTheCreation() (gas: 17913)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 393651)\n[PASS] test_metadata() (gas: 58609)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 684073)\n[PASS] test_plainEtherIsRejected() (gas: 37457)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2850994)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 29520)\n[PASS] test_supportsTheIERC20Surface() (gas: 27545)\n[PASS] test_transferFromRevertsWhenAllowanceTooSmall() (gas: 87871)\n[PASS] test_transferFromRevertsWhenOwnerBalanceInsufficient() (gas: 138733)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 50838)\n[PASS] test_transferFromSpendsAllowanceExactly() (gas: 142562)\n[PASS] test_transferFromWithMaxAllowanceDoesNotDecrement() (gas: 116276)\n[PASS] test_transferMovesExactAmount() (gas: 89150)\n[PASS] test_transferOfZeroSucceeds() (gas: 43225)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33165)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 103114)\n[PASS] test_transferToSelfKeepsBalance() (gas: 41274)\n[PASS] test_transferToZeroAddressReverts() (gas: 37776)\n[PASS] test_transferWholeBalance() (gas: 71774)\n[PASS] test_wholeSupplyMintedOnceToDeployer() (gas: 30094)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 8.45ms (15.59ms CPU time)\n\nRan 1 test suite in 9.50ms (8.45ms CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Polyneum.approve(address,uint256)\",\"Polyneum.transfer(address,uint256)\",\"Polyneum.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":108,\"foundry.toml\":26,\"remappings.txt\":2,\"script/DeployPolyneum.s.sol\":28,\"src/Polyneum.sol\":41,\"test/Polyneum.t.sol\":332},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":513,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":310,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Polyneum.sol:26: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"022554e8b238971f1110742dba7a5cec5e811246709e163c4dfa7ef6f18edabb","verifiedTreeHash":"e7c63f14917bd30b1e8a593907b3e5a2b3c7c62d","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":1102,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 974.00ms\nCompiler run successful!\n","passed":true},{"durationMs":113,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 27 tests for test/Polyneum.t.sol:PolyneumTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 101244, ~: 101092)\nLogs:\n  Bound result 544847097038914715406168687\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 63278)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 30826)\n[PASS] test_constructorEmitsMintAndSupplyEvents() (gas: 19773)\n[PASS] test_deployScriptFunctionMintsToTheScript() (gas: 1599542)\n[PASS] test_deployerCannotMoveAHoldersBalance() (gas: 155881)\n[PASS] test_deployerIsWhoeverSendsTheCreation() (gas: 17913)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 393651)\n[PASS] test_metadata() (gas: 58609)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 684073)\n[PASS] test_plainEtherIsRejected() (gas: 37457)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2850994)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 29520)\n[PASS] test_supportsTheIERC20Surface() (gas: 27545)\n[PASS] test_transferFromRevertsWhenAllowanceTooSmall() (gas: 87871)\n[PASS] test_transferFromRevertsWhenOwnerBalanceInsufficient() (gas: 138733)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 50838)\n[PASS] test_transferFromSpendsAllowanceExactly() (gas: 142562)\n[PASS] test_transferFromWithMaxAllowanceDoesNotDecrement() (gas: 116276)\n[PASS] test_transferMovesExactAmount() (gas: 89150)\n[PASS] test_transferOfZeroSucceeds() (gas: 43225)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33165)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 103114)\n[PASS] test_transferToSelfKeepsBalance() (gas: 41274)\n[PASS] test_transferToZeroAddressReverts() (gas: 37776)\n[PASS] test_transferWholeBalance() (gas: 71774)\n[PASS] test_wholeSupplyMintedOnceToDeployer() (gas: 30094)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 7.10ms (19.20ms CPU time)\n\nRan 1 test suite in 7.75ms (7.10ms CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Polyneum.approve(address,uint256)\",\"Polyneum.transfer(address,uint256)\",\"Polyneum.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":108,\"foundry.toml\":26,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployPolyneum.s.sol\":28,\"src/Polyneum.sol\":41,\"test/Polyneum.t.sol\":332},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"093529fb953ad773062a6e7cbee9024d196f035f7d42189fc71986fea0702073","verifiedTreeHash":"189bb225336723239a6818a2188b561d4ff11ead","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":2450,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.27s\nCompiler run successful!\n","passed":true},{"durationMs":15706,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 27 tests for test/Polyneum.t.sol:PolyneumTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 101073, ~: 101092)\nLogs:\n  Bound result 5684197047\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 63278)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 30826)\n[PASS] test_constructorEmitsMintAndSupplyEvents() (gas: 19773)\n[PASS] test_deployScriptFunctionMintsToTheScript() (gas: 1599542)\n[PASS] test_deployerCannotMoveAHoldersBalance() (gas: 155881)\n[PASS] test_deployerIsWhoeverSendsTheCreation() (gas: 17913)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 393651)\n[PASS] test_metadata() (gas: 58609)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 684073)\n[PASS] test_plainEtherIsRejected() (gas: 37457)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2850994)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 29520)\n[PASS] test_supportsTheIERC20Surface() (gas: 27545)\n[PASS] test_transferFromRevertsWhenAllowanceTooSmall() (gas: 87871)\n[PASS] test_transferFromRevertsWhenOwnerBalanceInsufficient() (gas: 138733)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 50838)\n[PASS] test_transferFromSpendsAllowanceExactly() (gas: 142562)\n[PASS] test_transferFromWithMaxAllowanceDoesNotDecrement() (gas: 116276)\n[PASS] test_transferMovesExactAmount() (gas: 89150)\n[PASS] test_transferOfZeroSucceeds() (gas: 43225)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33165)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 103114)\n[PASS] test_transferToSelfKeepsBalance() (gas: 41274)\n[PASS] test_transferToZeroAddressReverts() (gas: 37776)\n[PASS] test_transferWholeBalance() (gas: 71774)\n[PASS] test_wholeSupplyMintedOnceToDeployer() (gas: 30094)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 207.94ms (220.47ms CPU time)\n\nRan 34 tests for test/Polyneum.fuzz.t.sol:PolyneumFuzzTest\n[PASS] testFuzz_allowanceCheckedBeforeBalance(uint256,uint256) (runs: 1000, μ: 164026, ~: 164414)\nLogs:\n  Bound result 899307740119267087433694648\n  Bound result 968198696284999802573053602\n\n[PASS] testFuzz_anyDeployerReceivesTheWholeSupply(address) (runs: 1000, μ: 27362, ~: 27358)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_approveDoesNotRequireBalance(address,uint256) (runs: 1000, μ: 64388, ~: 64645)\nLogs:\n  Bound result 421246653893815926092215114510265543668767903391\n\n[PASS] testFuzz_approveOverwritesNotAccumulates(uint256,uint256) (runs: 1000, μ: 123811, ~: 123883)\n[PASS] testFuzz_approveZeroSpenderAlwaysRejected(uint256) (runs: 1000, μ: 38167, ~: 38108)\n[PASS] testFuzz_etherWithAnyCalldataIsRejected(bytes,uint96) (runs: 1000, μ: 41997, ~: 41817)\nLogs:\n  Bound result 5671409541373870822235071\n\n[PASS] testFuzz_infiniteAllowanceNeverDecrements(uint256,uint8) (runs: 1000, μ: 234210, ~: 211006)\nLogs:\n  Bound result 2\n  Bound result 149777371162473168216792399\n\n[PASS] testFuzz_revokeThenSpendReverts(uint256,uint256) (runs: 1000, μ: 120208, ~: 120184)\nLogs:\n  Bound result 12897\n  Bound result 7921\n\n[PASS] testFuzz_splitTransfersSumExactly(uint256,uint256,uint256) (runs: 1000, μ: 209017, ~: 210815)\nLogs:\n  Bound result 262442128021911264889595987\n  Bound result 2098183\n  Bound result 297608131335700217265475965\n\n[PASS] testFuzz_transferAboveBalanceRevertsAndChangesNothing(uint256,uint256) (runs: 1000, μ: 120371, ~: 120547)\nLogs:\n  Bound result 12621052\n  Bound result 2907829\n\n[PASS] testFuzz_transferEmitsExactEvent(address,uint256) (runs: 1000, μ: 68607, ~: 69078)\nLogs:\n  Bound result 439741681072711305172837549734541487688030309637\n  Bound result 945826734698562727312478427\n\n[PASS] testFuzz_transferFromAboveAllowanceRevertsAndChangesNothing(uint256,uint256) (runs: 1000, μ: 116236, ~: 116445)\nLogs:\n  Bound result 145902461484990041469902829286083689858870182322995386450920453\n  Bound result 37147168703078352178528028448970858884\n\n[PASS] testFuzz_transferFromDecrementsFiniteAllowanceExactly(uint256,uint256) (runs: 1000, μ: 146436, ~: 147893)\nLogs:\n  Bound result 12621052\n  Bound result 2907829\n\n[PASS] testFuzz_transferFromDoesNotEmitApprovalOnSpend(uint256,uint256) (runs: 1000, μ: 123796, ~: 123997)\nLogs:\n  Bound result 339100351608706536085823449\n  Bound result 20755261273331106169852\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256) (runs: 1000, μ: 110076, ~: 109999)\nLogs:\n  Bound result 7557395565527310419816812\n\n[PASS] testFuzz_transferToSelfIsANoOp(uint256) (runs: 1000, μ: 57590, ~: 57329)\nLogs:\n  Bound result 59666750672695674176235104\n\n[PASS] testFuzz_transferToTheTokenItselfIsAcceptedAndStuck(uint256) (runs: 1000, μ: 118978, ~: 118785)\nLogs:\n  Bound result 59666770012480901521046659\n\n[PASS] testFuzz_unknownSelectorsAlwaysRevert(bytes4,bytes) (runs: 1000, μ: 48679, ~: 48503)\n[PASS] testFuzz_zeroAddressReceiverAlwaysRejected(uint256) (runs: 1000, μ: 48296, ~: 48237)\n[PASS] test_approveIsIdempotent() (gas: 87987)\n[PASS] test_selfApprovedTransferFromSpendsAllowance() (gas: 129841)\n[PASS] test_supplyFitsTheWidestLaunchArithmetic() (gas: 4923)\n[PASS] test_transferFromOfZeroNeedsNoAllowance() (gas: 59278)\n[PASS] test_transferFromSpendingTheWholeSupply() (gas: 161534)\n[PASS] test_transferFromToZeroAddressRevertsEvenWithAllowance() (gas: 101492)\n[PASS] test_transferFromZeroAddressOwnerReverts() (gas: 40240)\n[PASS] test_transferFromZeroAddressOwnerWithAmountFailsOnAllowance() (gas: 33580)\n[PASS] test_transferOfMaxUintReverts() (gas: 40593)\n[PASS] test_transferOfOneWeiMovesOneWei() (gas: 175930)\n[PASS] test_transferOfSupplyPlusOneReverts() (gas: 33561)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 104296)\n[PASS] test_zeroAddressCannotApprove() (gas: 30804)\n[PASS] test_zeroAddressReceiverCheckedBeforeBalance() (gas: 30775)\n[PASS] test_zeroAddressSenderRejectedEvenForZeroAmount() (gas: 30718)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 208.13ms (3.63s CPU time)\n\nRan 1 test for test/Polyneum.invariant.t.sol:PolyneumInvariantTest\n[PASS]\nPolyneumInvariantTest invariants:\n[PASS] invariant_allowancesMatchGhost\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_campaignIsNotVacuous\n[PASS] invariant_ghostBalancesMatch\n[PASS] invariant_metadataIsConstant\n[PASS] invariant_noBalanceExceedsSupplyOrInflow\n[PASS] invariant_totalSupplyIsFixed\n[PASS] invariant_zeroAddressHoldsNothing\n PolyneumInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+---------------------------+-------+---------+----------╮\n| Contract        | Selector                  | Calls | Reverts | Discards |\n+==========================================================================+\n| PolyneumHandler | approve                   | 1001  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | approveMax                | 988   | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | approveZero               | 1051  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | approve_unclamped         | 978   | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | callForeignSelector       | 980   | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | donateToToken             | 1041  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transfer                  | 1000  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferAll               | 1116  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferDust              | 1038  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferFrom              | 1042  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferFromAll           | 1036  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferFromOverAllowance | 1031  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferFrom_unclamped    | 979   | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferSelf              | 1002  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transferTooMuch           | 1037  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| PolyneumHandler | transfer_unclamped        | 1064  | 0       | 0        |\n╰-----------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 28882930327992174110996424\n  Bound result 438069577\n  Bound result 36876\n  Bound result 0\n  Bound result 11045\n  Bound result 1000000000000000000000\n  Bound result 0\n  Bound result 2426\n  Bound result 7000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 77597531420854298625165543\n  Bound result 0\n  Bound result 0\n  Bound result 18\n  Bound result 458920305537850454778640\n  Bound result 0\n  Bound result 641339355833448505402906197\n  Bound result 18\n  Bound result 0\n  Bound result 999999999999998000003\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.57s (15.56s CPU time)\n\nRan 3 test suites in 15.57s (15.98s CPU time): 62 tests passed, 0 failed, 0 skipped (62 total tests)\n","passed":true},{"durationMs":77,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Polyneum.approve(address,uint256)\",\"Polyneum.transfer(address,uint256)\",\"Polyneum.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":108,\"foundry.toml\":26,\"remappings.txt\":2,\"script/DeployPolyneum.s.sol\":28,\"src/Polyneum.sol\":41,\"test/Polyneum.fuzz.t.sol\":399,\"test/Polyneum.invariant.t.sol\":497,\"test/Polyneum.t.sol\":332},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"436543093f9855ce30848e404c7901d08ddb6e48431c388f06e0684fc344cc32","verifiedTreeHash":"a37d2b0ed28b99cc6aa3658e4a064f75a5214610","verifierVersion":"0.1.0+327e1e9f"}]}