{"assessments":[],"deployments":[{"attestationHash":"bec01139de5f74fdd82dac1e1ad4097c48cd35eb821cd5148357dc785a348955","chainId":1,"contracts":[{"address":"0x73f20c55a0ba171aa428d664689e6061f5e49ed0","blockNumber":26292829,"name":"MerkleDistributor","role":"distributor","txHash":"0xc87ae431b56cb4e47dc23a2016487ec3f14d0f7199acada82425075e13847e2b"},{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26292829,"name":"PoolInitializationGuard","role":"hook","txHash":"0xc87ae431b56cb4e47dc23a2016487ec3f14d0f7199acada82425075e13847e2b"},{"address":"0x261fb436d3b5efed2ec09d6e55faabdd28706214","blockNumber":26292829,"name":"ChangelogToken","role":"token","txHash":"0xc87ae431b56cb4e47dc23a2016487ec3f14d0f7199acada82425075e13847e2b"}],"id":"28bda979-62b6-4315-bb56-e0eac2f061df","manifestHash":"1c4979a7d20c25ec1830a72cb03e11b007bbae76a34b2770eae512d714dd7a83","status":"live"}],"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":"43dad711-86b9-4dee-8759-db966184c82d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"1a9bd509b73a6bbf5f4abd731f93a81b9d5faca3792cf00346154ee3e3265f9b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"65a2678fb24ad725514d3038e22583842efab508bb37996a5acafc8364431f2c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3686aeab8bf3d781e17e4ce5d04ffe011f56dd033b7b60db6d25600138d88e67","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"6348179b519ae6a61fcb3b481566beb3e415e7d7a4b5718bc9ed91cf93cb78e9","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"cf3abc1e790388deb0b3b4e5de25e33c220799cfba1d8d242b9b05ce2407ab47","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3ce79ef11b9ea9c78b0fd0cef89fe507decc445823afb81bea10841a93025f3e","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"33573beb03eb6d48c1e548d7dd1e1e7da2e0188b0ee70b50650b8163e1cd81bb","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b5327a844e08ddf6c886fe232677a6c7565d61f34cf522b18f5c52a688761412","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Changelog.md (CMD).\nToken name: Changelog.md\nToken symbol: CMD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"876fd217a6e5a5388b2945e65477b419a9964fc6e5bd3fb3f372bb12a786f2eb","previousHash":"036210fe08262f85af4215c8e2ccef9271815886afb2eded9fd9e18d5bb530ee","projectId":"43dad711-86b9-4dee-8759-db966184c82d","publication":{"commit":"239411b2d0c77629514eda3b2232197d1285eb7a","deliveredAt":"2026-10-28T17:48:17.892Z","repoUrl":"https://github.com/identity-md-launches/launch-2641-changelog-md"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"de9285ecc61c80236e42b4b62a7a0ea11d0321e51e9bcc43c1454cbe0b083911","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e49531c471ac7158","findings":[],"hash":"1a9bd509b73a6bbf5f4abd731f93a81b9d5faca3792cf00346154ee3e3265f9b","nodeId":"4c452ce4-b86b-4c2f-9fce-b6d9742868b2","outcome":"completed","summary":"I found no defects in the economics area for `ChangelogToken` (Changelog.md / CMD). `.imd-findings.json` is written with an empty findings list and a coverage record, and it parses as valid JSON.\n\nThe token is a plain ERC-20 with a fixed supply, so there is very little for an economics attack to work with:\n- **Supply:** `totalSupply` is a constant `1_000_000_000 * 10**18`, given entirely to `msg.sender` (the factory) in the constructor. Nothing can mint or burn after that, and the internal transfer function keeps the sum of all balances unchanged.\n- **Launch flows:** transfers have no fee, burn, hook or rule that depends on who sends or receives. The swarm's 10% to the distributor, each claim, the pool seed and swaps in both directions all move exactly the stated amount. I traced this against what the floor checks in `Token.protected.t.sol`.\n- **Allowances:** `transferFrom` checks the allowance and lowers it by exactly the amount moved. An unlimited (`uint256.max`) allowance is not reduced, and a failed transfer undoes the allowance change. Sending tokens to yourself leaves your balance unchanged.\n- **Privileged powers:** there is no owner, role, pause, blacklist or external call, so the only way to move someone else's tokens is an allowance they gave.\n\nThe usual risk that a spender can front-run an `approve` change is how standard ERC-20 is meant to work, not a defect, so I left it out. The only static-analysis lead was a low note about the large number literal on line 13. That literal is just the supply constant, so I didn't report it.\n\n**Coverage:** all three entry points (`approve`, `transfer`, `transferFrom`) are marked `holds`. I also added three rows for invariants I checked: fixed supply, exact launch flows, and no privileged control over holders. All three guides were covered, and nothing was left out of reach.\n\n**Checks:** the project's 43 tests pass. I did not run the protected floor tests because they need the launch's environment variables. Since there were no critical or high findings, I wrote no proof tests, and I changed no files besides the findings file.","treeHash":null,"usage":{"cachedInputTokens":114588,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2256,"runtime":"claude","turns":4,"wallClockMs":36626}},{"artifacts":[],"attempt":1,"bundleHash":"801fba4d59bc350947ae171b0a853e12ab35d5efd02a7fb8f22d96bcef1c408c","device":"68d4e81b6fe7b30b","findings":[],"hash":"33573beb03eb6d48c1e548d7dd1e1e7da2e0188b0ee70b50650b8163e1cd81bb","nodeId":"5d952ef1-e82b-4fcc-9106-e9bf75783df7","outcome":"completed","summary":"Created `launch.json` matching `ChangelogToken`, its exact supply, empty constructor arguments, and the required economics and pool settings.\n\nValidation passed: manifest checks, `forge build`, and all 43 tests using the specified fuzz seed. Only `launch.json` is changed outside scratch artifacts.","treeHash":"21f90c8f401e54814f566934e6ddc36e150b5703","usage":{"cachedInputTokens":104448,"inputTokens":65031,"model":"gpt-6-astra","outputTokens":2397,"runtime":"codex","turns":3,"wallClockMs":73772}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5835e48821d8827d","findings":[],"hash":"3686aeab8bf3d781e17e4ce5d04ffe011f56dd033b7b60db6d25600138d88e67","nodeId":"956f4751-bbf5-4157-bc76-7ad9a0202035","outcome":"completed","summary":"The review is complete and the tree is unchanged apart from the findings file.\n\n**Outcome: clean review, no findings.** The four specialists and the independent tester all reported nothing, and I found nothing to add after tracing the code myself. The findings file holds an empty list with a six-row coverage record.\n\n**What I checked**\n\n- All three entry points in `src/ChangelogToken.sol`: approve, transfer and transferFrom. I traced every guard, state write and revert path and confirmed them by execution in a scratch test that was removed afterwards.\n- Edge cases: self-transfer, full-balance transfer, zero receiver, allowance rollback when the inner transfer reverts, unlimited allowance not decremented, transferFrom from the zero address, and pulls by strangers.\n- Deployment: the no-argument constructor mints exactly 1e27 units to the caller, matching the manifest's empty constructorArgs, totalSupply, decimals, name and symbol. Creation and runtime code are far under size limits.\n- Launch floor: no fee or burn, so swarm share, seed and swaps move exactly what they say. No mint, owner, pause, blacklist, receive, fallback or forbidden opcodes exist.\n- The one static-analysis lead, aderyn's large numeric literal, is a style note with no behavioural effect, so it was dropped.\n- The project's own 55 tests, including fuzz and invariant suites, pass.\n\n**Note on the manifest.** launch.json is schema-valid as far as I can check it: lowercase addresses, strings for uint256 fields, numeric fee, tickSpacing and decimals, and a contract name within 32 characters.","treeHash":null,"usage":{"cachedInputTokens":505359,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":9484,"runtime":"claude","turns":20,"wallClockMs":150376}},{"artifacts":[],"attempt":1,"bundleHash":"0527f6ff629ea8da1e2d458180999479ae9ceb1e80cb652389e874292872eeb5","device":"26f033b775c04047","findings":[],"hash":"3ce79ef11b9ea9c78b0fd0cef89fe507decc445823afb81bea10841a93025f3e","nodeId":"6209d5ec-9c4e-498b-b587-8cf567fb6b6d","outcome":"completed","summary":"Implemented CMD: 1 billion tokens, 18 decimals, minted once to the deployer. Added 43 tests and deployment documentation.\n\n`forge fmt --check` passes. Build and test remain unverified: Solidity 0.8.26 is missing, and downloading it fails with “Temporary failure in name resolution.” Details are recorded in `VALIDATION.md`.","treeHash":"040b1d305ad45c9e80a85cf4677bc0268aef715f","usage":{"cachedInputTokens":359552,"inputTokens":37199,"model":"gpt-6-astra","outputTokens":19392,"runtime":"codex","turns":6,"wallClockMs":559872}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"93c37f17670e4d98","findings":[],"hash":"6348179b519ae6a61fcb3b481566beb3e415e7d7a4b5718bc9ed91cf93cb78e9","nodeId":"f8d51a30-46fa-4845-8194-77f081350777","outcome":"completed","summary":"The review is complete. The math audit of the Changelog.md (CMD) token found no defects.\n\n**Result:** zero findings. The findings file at the repository root holds an empty list plus six coverage rows, one for each of the three state-changing entry points and three for the invariants I checked.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides:**\n- **Supply constant.** The literal on line 13 evaluates to exactly 10^27, so the aderyn large-literal lead is not a defect. The launch split of 10% / 80% / 10% divides with no dust and no intermediate overflow.\n- **transfer.** The balance check guards the unchecked debit, and the checked credit is bounded by the conserved supply. Probed with SUPPLY, SUPPLY+1, uint256.max, full-balance self-transfer, zero value from an empty account, and the zero recipient. Every case either succeeds exactly or reverts with the right error fields and no state change.\n- **transferFrom.** The allowance check guards the unchecked allowance debit. The uint256.max sentinel is never reduced, max-1 is reduced exactly, an allowance equal to the value drains to zero, and one more wei reverts. A finite allowance write is rolled back when the balance check fails afterward. Delegated full-balance self-transfer keeps the balance and consumes the allowance.\n- **approve.** A plain overwrite with no arithmetic. Zero, one and uint256.max read back correctly, and the zero spender reverts.\n- **Conservation.** Moving the whole supply back and forth sixteen times never pushes a credit above 10^27.\n\n**Verification.** The existing 43-test suite passes with the pinned fuzz seed, and a ten-test scratch probe I wrote for the edge cases above also passed. I deleted the scratch file afterward, so the working tree is unchanged apart from the findings file.\n\n**Not reached.** The protected Uniswap v4 seed-and-swap harness needs verifier infrastructure and could not run locally. The token has no fee or rounding on any transfer path, so its arithmetic requirements hold by inspection.","treeHash":null,"usage":{"cachedInputTokens":432867,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11557,"runtime":"claude","turns":22,"wallClockMs":154007}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"764cd99b4c628a47","findings":[],"hash":"65a2678fb24ad725514d3038e22583842efab508bb37996a5acafc8364431f2c","nodeId":"0e94fe7a-3268-4319-9d2c-c6d47e34eb69","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds zero findings and eight coverage rows, and the working tree shows no tracked changes (the findings file and `test/scratch/` are both gitignored).\n\n**Outcome: no defects found in the control-flow area.** ChangelogToken is a 75-line fixed-supply ERC-20 with no owner, no external calls, no libraries, and no fee or exemption logic, so each of the Execution Trace, Periphery and First Principles checklists collapsed onto the same three entry points plus the constructor. I traced each one by hand and then confirmed the trace mechanically.\n\nWhat I verified:\n- **Build and tests.** `forge build`, the 43 project tests with the pinned fuzz seed, and `forge fmt --check` all pass on this machine. VALIDATION.md says the previous contributor could not compile; that gap is now closed.\n- **transfer / transferFrom.** Balance is checked before the unchecked debit, credit happens after debit so self-transfers hold, zero addresses are rejected, and the uint256.max allowance sentinel skips only the decrement, never the balance check. Any revert inside the internal transfer rolls the allowance write back.\n- **approve.** Writes only the caller's own allowance row and rejects a zero spender. The usual ERC-20 approve race exists but is documented in the README and is a standard-level property, not a code defect.\n- **Constructor and launch flows.** A scratch CREATE2 factory probe confirmed the whole supply lands on the factory and that factory, distributor, claimant, manager and trader transfers all move exact amounts.\n- **Floor properties.** The reachable-opcode walk from the protected test finds no DELEGATECALL, CALLCODE or SELFDESTRUCT. The ABI has no receive, fallback, mint, burn or admin function. Storage is just the two mappings.\n- **Static-analysis lead.** The aderyn large-literal note is style only. The literal equals exactly 10^27, which the project tests assert.\n\nOne observed behaviour that is not a defect: a zero-value `transferFrom` needs no allowance and emits `Transfer(from, to, 0)` for any nonzero `from`. OpenZeppelin and Solmate behave the same way, and the project's own tests assert it as intended, so it is recorded in the coverage row rather than as a finding.\n\nNot reached: the protected Uniswap v4 seed-and-swap test itself, since v4-core and the LaunchLiquidity helpers are not in this tree. My scratch test models those flows with plain transfers, which is all this token does, so I do not expect a difference there.","treeHash":null,"usage":{"cachedInputTokens":499222,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12425,"runtime":"claude","turns":26,"wallClockMs":171467}},{"artifacts":[],"attempt":1,"bundleHash":"f4c1d29a17419141f754015667e96f381f43eb025ec7fbea732a68562e0a172e","device":"8db4eebdd7bd2744","findings":[],"hash":"b5327a844e08ddf6c886fe232677a6c7565d61f34cf522b18f5c52a688761412","nodeId":"59059903-b57e-4bf6-9413-4cf76dfbf5a2","outcome":"completed","summary":"I added two test files and found no defects in the token. The full suite passes with the verifier's fuzz seed: 55 tests, 0 failures, and `forge build` is clean.\n\n**`test/ChangelogToken.invariant.t.sol`** adds the invariant tests over random call sequences that the criteria ask for. Earlier work had only a fuzzed model test. A handler drives five accounts through `transfer`, `approve`, `transferFrom`, calls involving the zero address, and pulls by an outsider with no allowance. It keeps its own record of every balance and allowance, aims amounts at the edges (0, 1, exactly the balance or allowance, one more than that, the maximum), and checks that each call succeeds or reverts exactly when it should, with the right error. After every call these must hold:\n- The total supply stays at 10^27 base units.\n- The balances add up to the supply and match the handler's record.\n- Every allowance matches the record, and nothing is held by the zero address, the token itself or the handler.\n- An outsider never moves anyone's tokens, and an unlimited allowance never goes down.\n- Name, symbol and decimals never change, and the token never holds ETH.\n\nThat ran 256 sequences of 64 calls each (16,384 calls) with no unexpected reverts. I also checked that these tests can fail: against a broken copy of the token, where `transferFrom` takes only half the amount off the allowance, all five invariants failed. That copy lived in `test/scratch/` and is deleted.\n\n**`test/ChangelogToken.launch.t.sol`** (11 tests) covers the launch flows:\n- **One-call launch:** a stand-in factory deploys the token at a predictable address and splits the supply in the same call. 10% goes to the distributor, a fuzzed pool share up to 90% goes to a stand-in pool that pulls it with `transferFrom`, and the rest goes to the requester. Every amount arrives exactly.\n- **Failure paths:**\n  - Launching twice with the same salt reverts.\n  - A pool share above 90% reverts the whole launch and leaves no token deployed.\n  - The pool can't pay out more than it holds, or pull without approval.\n  - Sending ETH to the constructor fails.\n- **Trades and claims:** fuzzed buys and sells through the pool, and distributor claims, all arrive whole.\n- **Runtime bytecode:** the same scan the launch floor uses finds no `DELEGATECALL`, `CALLCODE` or `SELFDESTRUCT`. The code is within the 24,576-byte limit and the constructor ignores any arguments.\n\nI didn't write `.imd-findings.json`: the token is a plain fixed-supply ERC-20 with no owner or admin functions and no fees, and nothing I tested broke it. I didn't change the existing tests or `test/support/TestBase.sol`. The new files are not committed yet.","treeHash":"2f3b1ef0dd23348b39baba027cebe35089d969fc","usage":{"cachedInputTokens":495043,"inputTokens":25,"model":"claude-opus-5-5","outputTokens":15983,"runtime":"claude","turns":14,"wallClockMs":212165}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea62f3bebece9304","findings":[],"hash":"cf3abc1e790388deb0b3b4e5de25e33c220799cfba1d8d242b9b05ce2407ab47","nodeId":"ab2759c3-450a-4bdc-a731-5e8e14d63481","outcome":"completed","summary":"I found no defects in `ChangelogToken` in the permissions area (Access Control, Trust Gap, Asymmetry). `.imd-findings.json` has an empty findings list and five coverage rows: one for each of the three entry points and two for invariants I checked. All three entry points are marked `holds`.\n\nThe contract is a plain fixed-supply ERC-20 in `src/ChangelogToken.sol`, so most of the checklist's failure modes don't apply:\n\n- **Access control:** there is no owner, no modifier and no admin function. Nobody can mint, burn, pause, blacklist, freeze or seize. `totalSupply` is a constant, and the constructor mints the whole supply once to `msg.sender` (the factory) and takes no arguments.\n- **`approve`:** it only writes the caller's own allowance and rejects a zero spender. You can't overwrite another owner's allowance. The race where a spender uses the old allowance just before a change goes through is standard ERC-20 behaviour, not a defect.\n- **`transferFrom`:** it needs an allowance from `from` to the caller. An unlimited allowance is never reduced, which the code documents. If the transfer itself reverts, the allowance change is rolled back too. A transfer from the zero address can never have an allowance and reverts.\n- **`transfer`:** it only takes from the caller, after a balance check, and rejects sending to the zero address. Sending to yourself leaves your balance unchanged.\n- **Trust gap and asymmetry:** no address gets special treatment, there are no fees or burns on transfer, and the contract calls nothing outside itself. So the launch flows move exact amounts: the swarm's share to the distributor and on to claimants, and the pool seeding and swaps through the PoolManager.\n- **Static-analysis lead:** aderyn's one low item (a large number at line 13) is the supply constant `1_000_000_000 * 10 ** 18`, which is correct. Slither reported nothing.\n\nThe project's own `forge test` suite passed: 43 tests, 0 failed. I didn't run the protected launch-floor tests, because they need the verifier's environment variables. Reading them against the token, nothing in them should fail. No finding needed a proof test, so I wrote nothing under `test/scratch/`.\n\nI covered the whole permissions area; nothing in it was left unreached.","treeHash":null,"usage":{"cachedInputTokens":114196,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2172,"runtime":"claude","turns":4,"wallClockMs":29300}}],"verification":[{"checks":[{"durationMs":469,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 408.90ms\nCompiler run successful!\n","passed":true},{"durationMs":735,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/ChangelogToken.fuzz.t.sol:ChangelogTokenFuzzTest\n[PASS] testFuzz_ApprovalReplacementAndIsolation(address,uint256,uint256) (runs: 512, μ: 111001, ~: 113525)\n[PASS] testFuzz_DelegatedTransferAccounting(uint256,uint256,bool) (runs: 512, μ: 134560, ~: 133496)\n[PASS] testFuzz_FailedTransferToZeroRestoresAllowance(uint256) (runs: 512, μ: 102417, ~: 102800)\n[PASS] testFuzz_SpendingAboveAllowanceAlwaysReverts(uint256) (runs: 512, μ: 99621, ~: 99966)\n[PASS] testFuzz_SpendingAboveBalanceAlwaysReverts(uint256,uint256) (runs: 512, μ: 162012, ~: 162608)\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 79565, ~: 80866)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 25.82ms (139.60ms CPU time)\n\nRan 1 test for test/ChangelogToken.model.t.sol:ChangelogTokenModelTest\n[PASS] testFuzz_StatefulLedgerMatchesEveryOperation(uint256[48]) (runs: 512, μ: 17878853, ~: 17879051)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 638.41ms (638.07ms CPU time)\n\nRan 36 tests for test/ChangelogToken.t.sol:ChangelogTokenTest\n[PASS] testApprovalBelongsOnlyToItsCaller() (gas: 119725)\n[PASS] testApprovalReplacesRatherThanAdds() (gas: 84061)\n[PASS] testApproveEmitsEventAndDoesNotMoveBalances() (gas: 74812)\n[PASS] testApproveZeroApproverReverts() (gas: 30677)\n[PASS] testApproveZeroSpenderReverts() (gas: 54217)\n[PASS] testConstructorEmitsInitialAllocation() (gas: 11684)\n[PASS] testDelegatedSelfTransferConsumesAllowanceOnly() (gas: 98332)\n[PASS] testDeployerCannotMoveOtherHoldersTokensWithoutApproval() (gas: 143618)\n[PASS] testDirectDeploymentMintsToItsCaller() (gas: 12111)\n[PASS] testFactoryDeploymentMintsToFactory() (gas: 268843)\n[PASS] testHolderNeedsAllowanceForTransferFrom() (gas: 133895)\n[PASS] testLaunchAllocationAndClaimTransfersArriveWhole() (gas: 583017)\n[PASS] testMetadataAndInitialSupply() (gas: 60781)\n[PASS] testNoMintBurnAdminOrUpgradeEntryPoints() (gas: 1604345)\n[PASS] testRejectsEtherAndUnknownSelectors() (gas: 89695)\n[PASS] testRevokeApprovalPreventsFurtherSpending() (gas: 111144)\n[PASS] testSelfTransferPreservesBalance() (gas: 40389)\n[PASS] testSelfTransferStillRequiresBalance() (gas: 33205)\n[PASS] testTransferAboveBalanceRevertsWithoutChanges() (gas: 101856)\n[PASS] testTransferEntireSupplyAndReturnIt() (gas: 120473)\n[PASS] testTransferFromAboveAllowanceRevertsAtomically() (gas: 99531)\n[PASS] testTransferFromAboveBalanceRestoresFiniteAllowance() (gas: 157058)\n[PASS] testTransferFromExactAllowanceExhaustsIt() (gas: 146952)\n[PASS] testTransferFromMaximumValueCannotDrainOrOverflow() (gas: 95031)\n[PASS] testTransferFromSpendsAllowanceAndEmitsTransfer() (gas: 140715)\n[PASS] testTransferFromToZeroRestoresAllowance() (gas: 94921)\n[PASS] testTransferFromZeroAddressesRejectsZeroValue() (gas: 60152)\n[PASS] testTransferFromZeroSenderReverts() (gas: 30726)\n[PASS] testTransferFromZeroValueNeedsNoAllowance() (gas: 60685)\n[PASS] testTransferMaximumUintRevertsWithoutOverflow() (gas: 37055)\n[PASS] testTransferReturnsTrueAndEmitsEvent() (gas: 77631)\n[PASS] testTransferToContractRequiresNoCallback() (gas: 283966)\n[PASS] testTransferToZeroRevertsEvenForZeroValue() (gas: 66170)\n[PASS] testUnapprovedSpenderCannotMoveTokens() (gas: 91969)\n[PASS] testUnlimitedAllowanceIsNotReduced() (gas: 182881)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 49925)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 638.48ms (6.90ms CPU time)\n\nRan 3 test suites in 639.20ms (1.30s CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ChangelogToken.approve(address,uint256)\",\"ChangelogToken.transfer(address,uint256)\",\"ChangelogToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\".svm/.global-version\":0,\"LICENSE\":21,\"README.md\":123,\"VALIDATION.md\":55,\"foundry.toml\":16,\"launch.json\":24,\"src/ChangelogToken.sol\":75,\"src/interfaces/IERC20.sol\":18,\"test/ChangelogToken.fuzz.t.sol\":108,\"test/ChangelogToken.model.t.sol\":122,\"test/ChangelogToken.t.sol\":421,\"test/support/TestBase.sol\":38},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"33573beb03eb6d48c1e548d7dd1e1e7da2e0188b0ee70b50650b8163e1cd81bb","verifiedTreeHash":"21f90c8f401e54814f566934e6ddc36e150b5703","verifierVersion":"0.1.0+d372f99e"},{"checks":[{"durationMs":466,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 402.07ms\nCompiler run successful!\n","passed":true},{"durationMs":664,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/ChangelogToken.model.t.sol:ChangelogTokenModelTest\n[PASS] testFuzz_StatefulLedgerMatchesEveryOperation(uint256[48]) (runs: 512, μ: 17878853, ~: 17879051)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 577.19ms (576.60ms CPU time)\n\nRan 6 tests for test/ChangelogToken.fuzz.t.sol:ChangelogTokenFuzzTest\n[PASS] testFuzz_ApprovalReplacementAndIsolation(address,uint256,uint256) (runs: 512, μ: 111001, ~: 113525)\n[PASS] testFuzz_DelegatedTransferAccounting(uint256,uint256,bool) (runs: 512, μ: 134560, ~: 133496)\n[PASS] testFuzz_FailedTransferToZeroRestoresAllowance(uint256) (runs: 512, μ: 102417, ~: 102800)\n[PASS] testFuzz_SpendingAboveAllowanceAlwaysReverts(uint256) (runs: 512, μ: 99621, ~: 99966)\n[PASS] testFuzz_SpendingAboveBalanceAlwaysReverts(uint256,uint256) (runs: 512, μ: 162012, ~: 162608)\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 79565, ~: 80866)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 577.20ms (689.58ms CPU time)\n\nRan 36 tests for test/ChangelogToken.t.sol:ChangelogTokenTest\n[PASS] testApprovalBelongsOnlyToItsCaller() (gas: 119725)\n[PASS] testApprovalReplacesRatherThanAdds() (gas: 84061)\n[PASS] testApproveEmitsEventAndDoesNotMoveBalances() (gas: 74812)\n[PASS] testApproveZeroApproverReverts() (gas: 30677)\n[PASS] testApproveZeroSpenderReverts() (gas: 54217)\n[PASS] testConstructorEmitsInitialAllocation() (gas: 11684)\n[PASS] testDelegatedSelfTransferConsumesAllowanceOnly() (gas: 98332)\n[PASS] testDeployerCannotMoveOtherHoldersTokensWithoutApproval() (gas: 143618)\n[PASS] testDirectDeploymentMintsToItsCaller() (gas: 12111)\n[PASS] testFactoryDeploymentMintsToFactory() (gas: 268843)\n[PASS] testHolderNeedsAllowanceForTransferFrom() (gas: 133895)\n[PASS] testLaunchAllocationAndClaimTransfersArriveWhole() (gas: 583017)\n[PASS] testMetadataAndInitialSupply() (gas: 60781)\n[PASS] testNoMintBurnAdminOrUpgradeEntryPoints() (gas: 1604345)\n[PASS] testRejectsEtherAndUnknownSelectors() (gas: 89695)\n[PASS] testRevokeApprovalPreventsFurtherSpending() (gas: 111144)\n[PASS] testSelfTransferPreservesBalance() (gas: 40389)\n[PASS] testSelfTransferStillRequiresBalance() (gas: 33205)\n[PASS] testTransferAboveBalanceRevertsWithoutChanges() (gas: 101856)\n[PASS] testTransferEntireSupplyAndReturnIt() (gas: 120473)\n[PASS] testTransferFromAboveAllowanceRevertsAtomically() (gas: 99531)\n[PASS] testTransferFromAboveBalanceRestoresFiniteAllowance() (gas: 157058)\n[PASS] testTransferFromExactAllowanceExhaustsIt() (gas: 146952)\n[PASS] testTransferFromMaximumValueCannotDrainOrOverflow() (gas: 95031)\n[PASS] testTransferFromSpendsAllowanceAndEmitsTransfer() (gas: 140715)\n[PASS] testTransferFromToZeroRestoresAllowance() (gas: 94921)\n[PASS] testTransferFromZeroAddressesRejectsZeroValue() (gas: 60152)\n[PASS] testTransferFromZeroSenderReverts() (gas: 30726)\n[PASS] testTransferFromZeroValueNeedsNoAllowance() (gas: 60685)\n[PASS] testTransferMaximumUintRevertsWithoutOverflow() (gas: 37055)\n[PASS] testTransferReturnsTrueAndEmitsEvent() (gas: 77631)\n[PASS] testTransferToContractRequiresNoCallback() (gas: 283966)\n[PASS] testTransferToZeroRevertsEvenForZeroValue() (gas: 66170)\n[PASS] testUnapprovedSpenderCannotMoveTokens() (gas: 91969)\n[PASS] testUnlimitedAllowanceIsNotReduced() (gas: 182881)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 49925)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 580.02ms (17.99ms CPU time)\n\nRan 3 test suites in 580.84ms (1.73s CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ChangelogToken.approve(address,uint256)\",\"ChangelogToken.transfer(address,uint256)\",\"ChangelogToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\".svm/.global-version\":0,\"LICENSE\":21,\"README.md\":123,\"VALIDATION.md\":55,\"foundry.toml\":16,\"src/ChangelogToken.sol\":75,\"src/interfaces/IERC20.sol\":18,\"test/ChangelogToken.fuzz.t.sol\":108,\"test/ChangelogToken.model.t.sol\":122,\"test/ChangelogToken.t.sol\":421,\"test/support/TestBase.sol\":38},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":532,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":433,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ChangelogToken.sol:13: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3ce79ef11b9ea9c78b0fd0cef89fe507decc445823afb81bea10841a93025f3e","verifiedTreeHash":"040b1d305ad45c9e80a85cf4677bc0268aef715f","verifierVersion":"0.1.0+d372f99e"},{"checks":[{"durationMs":680,"exitCode":0,"name":"build","output":"Compiling 8 files with Solc 0.8.26\nSolc 0.8.26 finished in 633.57ms\nCompiler run successful!\n","passed":true},{"durationMs":5425,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 36 tests for test/ChangelogToken.t.sol:ChangelogTokenTest\n[PASS] testApprovalBelongsOnlyToItsCaller() (gas: 119725)\n[PASS] testApprovalReplacesRatherThanAdds() (gas: 84061)\n[PASS] testApproveEmitsEventAndDoesNotMoveBalances() (gas: 74812)\n[PASS] testApproveZeroApproverReverts() (gas: 30677)\n[PASS] testApproveZeroSpenderReverts() (gas: 54217)\n[PASS] testConstructorEmitsInitialAllocation() (gas: 11684)\n[PASS] testDelegatedSelfTransferConsumesAllowanceOnly() (gas: 98332)\n[PASS] testDeployerCannotMoveOtherHoldersTokensWithoutApproval() (gas: 143618)\n[PASS] testDirectDeploymentMintsToItsCaller() (gas: 12111)\n[PASS] testFactoryDeploymentMintsToFactory() (gas: 268843)\n[PASS] testHolderNeedsAllowanceForTransferFrom() (gas: 133895)\n[PASS] testLaunchAllocationAndClaimTransfersArriveWhole() (gas: 583017)\n[PASS] testMetadataAndInitialSupply() (gas: 60781)\n[PASS] testNoMintBurnAdminOrUpgradeEntryPoints() (gas: 1604345)\n[PASS] testRejectsEtherAndUnknownSelectors() (gas: 89695)\n[PASS] testRevokeApprovalPreventsFurtherSpending() (gas: 111144)\n[PASS] testSelfTransferPreservesBalance() (gas: 40389)\n[PASS] testSelfTransferStillRequiresBalance() (gas: 33205)\n[PASS] testTransferAboveBalanceRevertsWithoutChanges() (gas: 101856)\n[PASS] testTransferEntireSupplyAndReturnIt() (gas: 120473)\n[PASS] testTransferFromAboveAllowanceRevertsAtomically() (gas: 99531)\n[PASS] testTransferFromAboveBalanceRestoresFiniteAllowance() (gas: 157058)\n[PASS] testTransferFromExactAllowanceExhaustsIt() (gas: 146952)\n[PASS] testTransferFromMaximumValueCannotDrainOrOverflow() (gas: 95031)\n[PASS] testTransferFromSpendsAllowanceAndEmitsTransfer() (gas: 140715)\n[PASS] testTransferFromToZeroRestoresAllowance() (gas: 94921)\n[PASS] testTransferFromZeroAddressesRejectsZeroValue() (gas: 60152)\n[PASS] testTransferFromZeroSenderReverts() (gas: 30726)\n[PASS] testTransferFromZeroValueNeedsNoAllowance() (gas: 60685)\n[PASS] testTransferMaximumUintRevertsWithoutOverflow() (gas: 37055)\n[PASS] testTransferReturnsTrueAndEmitsEvent() (gas: 77631)\n[PASS] testTransferToContractRequiresNoCallback() (gas: 283966)\n[PASS] testTransferToZeroRevertsEvenForZeroValue() (gas: 66170)\n[PASS] testUnapprovedSpenderCannotMoveTokens() (gas: 91969)\n[PASS] testUnlimitedAllowanceIsNotReduced() (gas: 182881)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 49925)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 42.29ms (4.95ms CPU time)\n\nRan 6 tests for test/ChangelogToken.fuzz.t.sol:ChangelogTokenFuzzTest\n[PASS] testFuzz_ApprovalReplacementAndIsolation(address,uint256,uint256) (runs: 512, μ: 112117, ~: 113519)\n[PASS] testFuzz_DelegatedTransferAccounting(uint256,uint256,bool) (runs: 512, μ: 134743, ~: 133496)\n[PASS] testFuzz_FailedTransferToZeroRestoresAllowance(uint256) (runs: 512, μ: 102325, ~: 102800)\n[PASS] testFuzz_SpendingAboveAllowanceAlwaysReverts(uint256) (runs: 512, μ: 99540, ~: 99966)\n[PASS] testFuzz_SpendingAboveBalanceAlwaysReverts(uint256,uint256) (runs: 512, μ: 162159, ~: 162608)\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 80234, ~: 80860)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 42.39ms (227.62ms CPU time)\n\nRan 11 tests for test/ChangelogToken.launch.t.sol:ChangelogTokenLaunchTest\n[PASS] testConstructorRejectsEther() (gas: 113832)\n[PASS] testCreationCodeTakesNoConstructorArguments() (gas: 430453)\n[PASS] testDistributorClaimsArriveWhole() (gas: 291085)\n[PASS] testFuzz_LaunchSplitIsExactForAnyPoolShare(uint256,bytes32) (runs: 1000, μ: 139212, ~: 139803)\n[PASS] testFuzz_TradesThroughPoolArriveWhole(uint256,uint256) (runs: 1000, μ: 298391, ~: 300177)\n[PASS] testLaunchInOneCallMovesExactAmounts() (gas: 154964)\n[PASS] testLaunchWithMoreThanTheRequesterShareRevertsWhole() (gas: 107178)\n[PASS] testPoolCannotPayMoreThanItHolds() (gas: 155333)\n[PASS] testPoolCannotPullWithoutApproval() (gas: 154975)\n[PASS] testRuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 587459)\n[PASS] testSameSaltCannotLaunchTwice() (gas: 147472)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 42.67ms (80.21ms CPU time)\n\nRan 1 test for test/ChangelogToken.model.t.sol:ChangelogTokenModelTest\n[PASS] testFuzz_StatefulLedgerMatchesEveryOperation(uint256[48]) (runs: 512, μ: 17899634, ~: 17896250)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 566.31ms (566.10ms CPU time)\n\nRan 1 test for test/ChangelogToken.invariant.t.sol:ChangelogTokenInvariantTest\n[PASS]\nChangelogTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchLedger\n[PASS] invariant_balancesSumToSupplyAndMatchLedger\n[PASS] invariant_metadataNeverChanges\n[PASS] invariant_noUnauthorisedMovementOrUnlimitedAllowanceDecay\n[PASS] invariant_totalSupplyIsFixed\n ChangelogTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------------+------------------+-------+---------+----------╮\n| Contract              | Selector         | Calls | Reverts | Discards |\n+=======================================================================+\n| ChangelogTokenHandler | approve          | 3298  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| ChangelogTokenHandler | outsiderPull     | 3313  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| ChangelogTokenHandler | touchZeroAddress | 3158  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| ChangelogTokenHandler | transfer         | 3352  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| ChangelogTokenHandler | transferFrom     | 3263  | 0       | 0        |\n╰-----------------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.36s (5.36s CPU time)\n\nRan 5 test suites in 5.36s (6.05s CPU time): 55 tests passed, 0 failed, 0 skipped (55 total tests)\n","passed":true},{"durationMs":26,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ChangelogToken.approve(address,uint256)\",\"ChangelogToken.transfer(address,uint256)\",\"ChangelogToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\".svm/.global-version\":0,\"LICENSE\":21,\"README.md\":123,\"VALIDATION.md\":55,\"foundry.toml\":16,\"src/ChangelogToken.sol\":75,\"src/interfaces/IERC20.sol\":18,\"test/ChangelogToken.fuzz.t.sol\":108,\"test/ChangelogToken.invariant.t.sol\":270,\"test/ChangelogToken.launch.t.sol\":234,\"test/ChangelogToken.model.t.sol\":122,\"test/ChangelogToken.t.sol\":421,\"test/support/TestBase.sol\":38},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b5327a844e08ddf6c886fe232677a6c7565d61f34cf522b18f5c52a688761412","verifiedTreeHash":"2f3b1ef0dd23348b39baba027cebe35089d969fc","verifierVersion":"0.1.0+d372f99e"}]}