{"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":"41090e54-1271-444a-8469-a6d84c6150ba","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"a5db472f2d9fccca1bb0a24e64d53ba01612082202512528f36887cc34fa391e","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":"d27410695aa3e36e48c490ca6f18cc0c8f2a5ccd0fc5b066ba5e4428ae47d898","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":"4c439beb6fe4ec15244b3d719544328ff1dda7d49869a4ff86ed5000335bbe36","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":"2b2e400e45f0d9e4285737c8dc17db3112e2232689b849e079c324e2dfab9ed9","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":"575b2f48dba3235510f22c95e21f6e1cbc0a6610874756a4d195f83f87cd0cdd","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":"4b6ff9e8afd548dca62cc5a76f44a35f4863c9bea4f410e07ad36a68a9155fc6","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":"fbc96c6369e9b26c9f6203b09976388a7c19c6ab34189c1f35b00a78c3c6d555","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"7588d54a76e4d5fb211cbba8487affffc3e8f44e505dce45797134d9c399c932","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: Prediction Markets Run by AI Agents (VERDICT).\nToken name: Prediction Markets Run by AI Agents\nToken symbol: VERDICT\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"86611eea2ce74ae0b5fe5d663200ff3b0fd3583c87c8c5cca537f8504d125c9f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"41090e54-1271-444a-8469-a6d84c6150ba","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1332-prediction-markets-run-by-ai-agents"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50988","feedbackHash":"709b5f5d3c1c3441468b9e7a6d5afffeff21c04510d1616f56887a6bbe13c9e3","nodeKey":"audit_economics","submissionHash":"a5db472f2d9fccca1bb0a24e64d53ba01612082202512528f36887cc34fa391e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50974","feedbackHash":"05b6e7a6265b2ab58b658000ba780083f078493631262b1db7dc99b74e12250d","nodeKey":"audit_flow","submissionHash":"d27410695aa3e36e48c490ca6f18cc0c8f2a5ccd0fc5b066ba5e4428ae47d898","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51024","feedbackHash":"795cba5524d7f03a9204bc39d26802a5b8c7f22d8b73883a2c44a6752cfa588e","nodeKey":"audit_judge","submissionHash":"4c439beb6fe4ec15244b3d719544328ff1dda7d49869a4ff86ed5000335bbe36","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50907","feedbackHash":"651919ece6eb5a0c2028b6bcc04ce73368eb56e674bb48065063c399427ff1f9","nodeKey":"audit_math","submissionHash":"2b2e400e45f0d9e4285737c8dc17db3112e2232689b849e079c324e2dfab9ed9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52265","feedbackHash":"32515abc221b07d0ab58ba9cf4882502f6808a32d259d0debfa6a9f04e1b7d7b","nodeKey":"audit_permissions","submissionHash":"575b2f48dba3235510f22c95e21f6e1cbc0a6610874756a4d195f83f87cd0cdd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52598","feedbackHash":"6cd838038f99742afde57976890dafca8156791ccc4c3809b39e6045186a75af","nodeKey":"build_contract_project","submissionHash":"4b6ff9e8afd548dca62cc5a76f44a35f4863c9bea4f410e07ad36a68a9155fc6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51983","feedbackHash":"b58c872f8372d33095ee35e0495810640d132de184a88abe628ee0896239fecd","nodeKey":"manifest","submissionHash":"fbc96c6369e9b26c9f6203b09976388a7c19c6ab34189c1f35b00a78c3c6d555","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52119","feedbackHash":"e1cd9fc5f317408e2ea1d92471b49649899d384f0129a4d801c0c2f88b3053c6","nodeKey":"write_foundry_tests","submissionHash":"7588d54a76e4d5fb211cbba8487affffc3e8f44e505dce45797134d9c399c932","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"ad935f018080860e1d5a0ea7ce20c7e0292e37a748d30370ac10330a7778ca97","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5fd2de06561c50a4","findings":[{"citation":"resolved","description":"Boundary (sentinel-address branch): _transfer rejects only address(0) as a recipient. A transfer or transferFrom to address(token) succeeds and credits balanceOf[address(token)]. The contract never calls transfer on itself, has no owner and no rescue function, so anything sent there is unrecoverable by design. The README states 'tokens sent to a wrong address cannot be recovered', but the token's own address is the one wrong address the contract can cheaply detect. This is a common user error (pasting the contract address as the recipient) and the fix preserves every intended behaviour: add `if (to == address(this)) revert ZeroAddress();` (or a dedicated error) next to the zero check. No launch flow sends tokens to the token itself, so the check cannot affect the factory, distributor or pool manager.","line":145,"path":"src/VerdictToken.sol","reproduction":"State: fresh VerdictToken, deployer holds 1e27. Call token.transfer(address(token), 5 ether) from the deployer. Expected (safer): revert. Actual: returns true, balanceOf(address(token)) == 5e18, totalSupply unchanged, and no function in the contract can ever move that balance (confirmed with a scratch test: there is no code path where msg.sender == address(token)).","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"Transfers to the token's own address are accepted and permanently locked"},{"citation":"resolved","description":"Boundary (zero input): _spendAllowance only reverts when current < amount, so amount == 0 passes with a zero allowance, and it then emits Approval(owner, spender, 0) for a pair that never approved anything. _transfer and _burn accept amount == 0 from any `from`, and only `to` is checked against address(0). Consequences: (a) anyone can emit Transfer(victim, attacker, 0) plus Approval(victim, attacker, 0) for any victim (address-poisoning pattern; the Approval emission on spend is a divergence from OpenZeppelin v5, which does not emit on spend); (b) transferFrom(address(0), to, 0) emits a mint-shaped Transfer(address(0), to, 0) and burnFrom(address(0), 0) emits Transfer(address(0), address(0), 0). No balance or supply changes in any case; balanceOf(address(0)) stays 0 and non-zero amounts from address(0) always revert because allowance[address(0)][x] can never be set. Zero-value transfers are permitted by ERC-20, so this is informational: indexers and wallets that trust event logs may show phantom approvals or zero-value mints. If the author wants to close it: skip the Approval emit in _spendAllowance when nothing was deducted, and/or revert on from == address(0) in transferFrom/burnFrom.","line":170,"path":"src/VerdictToken.sol","reproduction":"State: fresh token, alice holds 1e18, bob has no allowance. (1) vm.prank(bob); token.transferFrom(alice, bob, 0) -> returns true and emits Approval(alice, bob, 0) then Transfer(alice, bob, 0); balances unchanged. (2) vm.prank(bob); token.transferFrom(address(0), bob, 0) -> returns true and emits Transfer(address(0), bob, 0); totalSupply still 1e27, balanceOf(address(0)) == 0. (3) vm.prank(bob); token.burnFrom(address(0), 0) -> emits Transfer(address(0), address(0), 0). (4) vm.prank(bob); token.transferFrom(address(0), bob, 1) -> reverts InsufficientAllowance(bob, address(0), 0, 1), so the non-zero path is closed. Expected (stricter): no events for a pair with no allowance and no mint-shaped events; actual: as listed.","severity":"info","snippet":"        emit Approval(owner, spender, current - amount);","title":"Zero-amount transferFrom/burnFrom from any account (including address(0)) emit spoofable Transfer and Approval events"}],"hash":"2b2e400e45f0d9e4285737c8dc17db3112e2232689b849e079c324e2dfab9ed9","nodeId":"a2a81d1e-e915-4669-a064-f861221e81de","outcome":"completed","summary":"Taylor, the review is done. `.imd-findings.json` is written at the repo root, the scratch tests are removed, and the tree is otherwise untouched.\n\n**Result: no defect at medium or above.** The token is a 180-line, dependency-free ERC-20 with fixed 1e27 supply, no fee, no owner and no external calls. Every unchecked block is justified by the conservation invariant, which I fuzzed with a stateful invariant test across transfer, transferFrom, burn and burnFrom. It never broke.\n\nTwo low/info findings, each with a concrete reproduction:\n\n- **Low, transfers to the token's own address lock tokens.** The recipient check at `src/VerdictToken.sol:145` rejects only address(0). A call to `transfer(address(token), 5 ether)` succeeds and nothing can ever move that balance. Fix is one extra check and touches no launch flow.\n- **Info, zero-amount spoofable events.** `transferFrom(victim, attacker, 0)` with no allowance emits both an Approval and a Transfer event for that pair, and `transferFrom(address(0), to, 0)` emits a mint-shaped Transfer. No state changes and the non-zero path from address(0) always reverts. The Approval emission on spend at line 170 is where this diverges from OpenZeppelin v5.\n\n**Coverage:** all 7 listed entry points have rows. Five hold, transfer and transferFrom point to the findings above. Three extra rows record the invariants checked: balance conservation, the 1e27 constant and decimals (the aderyn large-literal lead is cosmetic), and exact-amount launch flows.\n\n**Not reached:** nothing in the assigned area. The protected floor test depends on v4-core and env variables that are absent here, so I did not run it. The existing suite passed 43 of 43.","treeHash":null,"usage":{"cachedInputTokens":758830,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14760,"runtime":"claude","turns":18,"wallClockMs":218612}},{"artifacts":[],"attempt":1,"bundleHash":"373739bb481ea51a5e0404227fb08c58ff33e1834a8a33ae0232aa89288008d0","device":"2b170a76e3d9adca","findings":[],"hash":"4b6ff9e8afd548dca62cc5a76f44a35f4863c9bea4f410e07ad36a68a9155fc6","nodeId":"18bca191-6124-41c2-96c0-455a5e7e227c","outcome":"completed","summary":"The VERDICT token project is complete, verified, and committed on `main`.\n\n**What was delivered**\n\n- `src/VerdictToken.sol`: a dependency-free, fixed-supply ERC-20. The contract identifier is `VerdictToken` (12 characters, fits the manifest's 32-byte limit). It returns the long name \"Prediction Markets Run by AI Agents\", symbol VERDICT, 18 decimals. The constructor takes no arguments, calls no other contract, and mints the full 1,000,000,000 tokens once to the deployer, which is the factory at launch. There is no owner, mint, pause, blacklist, fee, fallback or receive. Holders can burn their own tokens, and `burnFrom` requires the holder's allowance, so supply can only shrink.\n- `script/DeployVerdictToken.s.sol`: a reviewable manual deploy path whose `deploy()` function is called directly by tests. The launch itself does not use it.\n- `test/VerdictToken.t.sol` and `test/LaunchFlows.t.sol`: 43 tests covering metadata, the one-time mint, transfer and allowance success and failure paths, burns, the launch's 10/70/20 split arriving whole, CREATE2 deployment from a factory stand-in, and mirrors of the protected floor's checks (no admin selector grows supply, no privileged call moves or freezes a holder, no DELEGATECALL/CALLCODE/SELFDESTRUCT in the runtime). Four fuzz tests run at 256 iterations.\n- `foundry.toml` pins solc 0.8.26, sets `bytecode_hash = \"none\"`, and disables ffi and filesystem access. forge-std v1.9.6 is vendored under `lib/` as plain files from the release tarball, with no nested `.git` or submodule.\n- `README.md` documents assumptions, deployment parameters as decided by the launch, the empty \"After launch\" section, operational responsibilities, and which security tools ran.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| `forge build` (clean, solc 0.8.26) | pass |\n| `forge test` with an empty environment | 43 passed, 0 failed |\n| `forge fmt --check` | pass |\n\n**Notes for the reviewer**\n\n- The pinned protected test imports Uniswap v4-core and the harness's own `LaunchLiquidity`, so it runs in the verifier's harness rather than here. I mirrored its token-facing assertions in the local suite instead of vendoring v4-core.\n- Slither and Mythril were not available offline and did not run. The README says so.\n- No `launch.json` was written, and no `.imd-blocked.json` was needed since the brief gives every value the token requires.","treeHash":"4763eeda6c1da282c9bab31f101405495ee55cfc","usage":{"cachedInputTokens":692273,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":24683,"runtime":"claude","turns":27,"wallClockMs":293806}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e6de8d4c6cf97551","findings":[{"citation":"resolved","description":"Merged from audit_economics (info), audit_permissions (low) and audit_math (info): one root cause. `_transfer` (line 145) and `_approve` (line 158) reject address(0) as recipient and spender, but neither `_transfer` nor `_burn` (line 173) rejects address(0) as `from`, and `_spendAllowance` (line 166) only reverts when `current < amount`, so an allowance of 0 covers an amount of 0 and then still emits `Approval(owner, spender, current - amount)` at line 170. Any unprivileged caller can therefore make the token emit `Approval(address(0), caller, 0)` and `Transfer(address(0), to, 0)` through `transferFrom(address(0), to, 0)`, the exact shape of a mint, and `Transfer(address(0), address(0), 0)` through `burnFrom(address(0), 0)`. The same zero-amount path also emits `Approval(victim, caller, 0)` and `Transfer(victim, caller, 0)` for any `victim` that never approved anything (address-poisoning pattern). Reproduced: the specialist proof `Proof_fae39b4e6a59.t.sol` fails on this code with 'next call did not revert as expected' for both calls, and a scratch test confirmed the exact event sequence with vm.expectEmit. No balance, totalSupply or allowance changes in any case: balanceOf[address(0)] is always 0 (every credit path rejects a zero recipient), so a non-zero amount from address(0) reverts with InsufficientAllowance(caller, address(0), 0, amount). Impact is confined to event consumers: explorers, indexers and launch monitoring that treat Transfer-from-zero as a mint will record post-launch 'mints' by arbitrary accounts, contradicting the contract's own documentation (line 19 'Mints come from ... address(0)', line 72 'There is no other way to create tokens'). OpenZeppelin ERC20 reverts with ERC20InvalidSender here. Minimal fix that preserves the design and every launch flow: add `if (from == address(0)) revert ZeroAddress();` at the top of `_transfer` and `_burn` (no launch flow sends from address(0)); optionally skip the Approval emit in `_spendAllowance` when `amount == 0`. Severity low, not medium: no funds move and nothing is frozen.","line":145,"path":"src/VerdictToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {VerdictToken} from \"src/VerdictToken.sol\";\n\n/// @notice `_transfer` and `_burn` validate the recipient but never the sender, so any unprivileged caller can\n///         make the token emit `Transfer(address(0), to, 0)` (a mint-shaped event) and `Transfer(address(0),\n///         address(0), 0)` through `transferFrom` / `burnFrom` with `from == address(0)` and `amount == 0`.\n///         Fails on the current code (the calls succeed and emit); passes once a zero `from` reverts.\ncontract ZeroSenderTest is Test {\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    VerdictToken token;\n    address attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        token = new VerdictToken();\n    }\n\n    function test_transferFromZeroSenderMustRevert() public {\n        vm.prank(attacker);\n        vm.expectRevert();\n        token.transferFrom(address(0), attacker, 0);\n    }\n\n    function test_burnFromZeroSenderMustRevert() public {\n        vm.prank(attacker);\n        vm.expectRevert();\n        token.burnFrom(address(0), 0);\n    }\n}","reproduction":"State: fresh VerdictToken (deployer holds 1e27); attacker = any EOA with no balance and no allowance; victim = any address. (1) vm.prank(attacker); token.transferFrom(address(0), attacker, 0). Expected: revert ZeroAddress (symmetric with the `to == address(0)` check). Actual: returns true, emits Approval(0x0, attacker, 0) then Transfer(0x0, attacker, 0); totalSupply still 1000000000000000000000000000, balanceOf(attacker) == 0. (2) vm.prank(attacker); token.burnFrom(address(0), 0). Expected: revert. Actual: succeeds, emits Transfer(0x0, 0x0, 0). (3) vm.prank(attacker); token.transferFrom(victim, attacker, 0). Expected (stricter): revert or at least no Approval event for a pair with no allowance. Actual: emits Approval(victim, attacker, 0) then Transfer(victim, attacker, 0). (4) vm.prank(attacker); token.transferFrom(address(0), attacker, 1) reverts InsufficientAllowance(attacker, 0x0, 0, 1), so the non-zero path is closed. Run: forge test --match-path test/scratch/Proof_fae39b4e6a59.t.sol -> 2 tests FAIL with 'next call did not revert as expected' on the current code; both pass once `_transfer` and `_burn` revert on from == address(0).","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();\n        uint256 fromBalance = balanceOf[from];\n        if (fromBalance < amount) revert InsufficientBalance(from, fromBalance, amount);","title":"Zero-address sender is never rejected: transferFrom/burnFrom with from == address(0) and amount == 0 emit mint-shaped Transfer and phantom Approval events"},{"citation":"resolved","description":"From audit_math, reproduced and kept at info. `_transfer` rejects only address(0) as recipient, so `transfer(address(token), x)` and `transferFrom(.., address(token), x)` succeed and credit balanceOf[address(token)]. The contract never calls itself, has no owner and no rescue function, so that balance can never move again. This is standard ERC-20 behaviour (OpenZeppelin allows it too) and the author's own test `test_tokenItselfCanReceiveTheWholeSupplyWithoutTaxOrBurn` in test/VerdictTokenAdversarial.t.sol treats it as intended, so it is a design note rather than a defect: it does not affect launch flows, supply or any other holder. If the author wants to guard the one wrong address the contract can cheaply detect, `if (to == address(this)) revert ZeroAddress();` beside the zero check preserves every launch flow (none sends tokens to the token itself). No revision is required on this item.","line":145,"path":"src/VerdictToken.sol","reproduction":"State: fresh VerdictToken, deployer holds 1e27. Call token.transfer(address(token), 5 ether) from the deployer. Expected (if guarded): revert. Actual: returns true, balanceOf(address(token)) == 5000000000000000000, totalSupply unchanged at 1e27, and no code path exists where msg.sender == address(token), so the 5e18 can never be moved or burned. Confirmed with a scratch Foundry test (test_tokenAddressLock).","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"Transfers to the token's own address are accepted and the tokens are unrecoverable"}],"hash":"4c439beb6fe4ec15244b3d719544328ff1dda7d49869a4ff86ed5000335bbe36","nodeId":"fcfd6110-f5bd-42a0-97d3-64a10730b9a2","outcome":"completed","summary":"The review is complete. Findings are in `.imd-findings.json`, no source file was changed, and the scratch directory is removed.\n\n**Outcome.** The token is a clean fixed-supply ERC-20 with no privileged paths. Nothing blocks the launch. I kept two items, neither at medium or above.\n\n- **Low, merged from three specialists:** `_transfer` and `_burn` never reject a zero-address sender, and `_spendAllowance` lets an allowance of zero cover an amount of zero while still emitting Approval. So any caller can emit a mint-shaped `Transfer(address(0), to, 0)` plus phantom Approval events, and a zero-value Transfer and Approval for any victim. Balances, supply and allowances never change, and a non-zero amount from address zero reverts. The specialist proof fails on this code for exactly that reason, so I attached it to the finding. Fix: revert on `from == address(0)` in `_transfer` and `_burn`.\n- **Info:** transfers to the token's own address succeed and are unrecoverable. It reproduces, but it is standard ERC-20 behaviour and the author's own adversarial test treats it as intended. Recorded as a design note, no revision required.\n\n**Dropped or demoted.** The economics and math specialists' zero-amount event findings were the same root cause as the permissions one and are merged into finding 1 at low. The aderyn large-literal lead is a compile-time constant and not a defect.\n\n**Coverage.** All seven entry points answered: five hold, transferFrom and burnFrom point at finding 1. Two invariant rows added: the supply is minted once to msg.sender with no mint path, and the contract has no owner, no fee, no delegatecall or selfdestruct, with the manifest's empty constructor args, decimals and totalSupply matching the code. The existing suite of 69 tests plus invariants passes. The protected test could not be run locally because it depends on the verifier's v4-core harness, so I checked its assertions by reading them against the code instead.","treeHash":null,"usage":{"cachedInputTokens":763240,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":9132,"runtime":"claude","turns":11,"wallClockMs":208597}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8db4eebdd7bd2744","findings":[{"citation":"resolved","description":"Asymmetry between the recipient and sender checks. `_transfer` (line 145) and `_approve` (line 158) reject address(0) as recipient and spender, but neither `_transfer` nor `_burn` (line 173) rejects address(0) as the sender `from`, and `_spendAllowance` (lines 164-166) only compares allowance against amount, so an allowance of 0 covers an amount of 0. Because balanceOf[address(0)] is always 0, a zero-amount call slips every guard: any unprivileged caller can execute `transferFrom(address(0), X, 0)` and the token emits `Approval(address(0), caller, 0)` followed by `Transfer(address(0), X, 0)`, the exact shape of a mint event, and `burnFrom(address(0), 0)` emits `Transfer(address(0), address(0), 0)`. Balances and totalSupply are unchanged, so there is no loss of funds, but the contract's documented guarantee (line 72: 'There is no other way to create tokens'; line 19: 'Mints come from ... address(0)') is contradicted at the event level: explorers, indexers and the launch's own monitoring that treat Transfer-from-zero as a mint will record mints after launch, by arbitrary accounts, to arbitrary recipients, and the zero-value events can be used for address-poisoning of any wallet's token history under a 'minted to you' label. OpenZeppelin ERC20 rejects this with ERC20InvalidSender(address(0)); this implementation does not. Minimal fix that preserves the design: add `if (from == address(0)) revert ZeroAddress();` at the top of `_transfer` and `_burn` (or in `_spendAllowance`, `if (owner == address(0)) revert ZeroAddress();`). No launch flow sends from address(0), so the protected tests are unaffected.","line":145,"path":"src/VerdictToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {VerdictToken} from \"src/VerdictToken.sol\";\n\n/// @notice `_transfer` and `_burn` validate the recipient but never the sender, so any unprivileged caller can\n///         make the token emit `Transfer(address(0), to, 0)` (a mint-shaped event) and `Transfer(address(0),\n///         address(0), 0)` through `transferFrom` / `burnFrom` with `from == address(0)` and `amount == 0`.\n///         Fails on the current code (the calls succeed and emit); passes once a zero `from` reverts.\ncontract ZeroSenderTest is Test {\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    VerdictToken token;\n    address attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        token = new VerdictToken();\n    }\n\n    function test_transferFromZeroSenderMustRevert() public {\n        vm.prank(attacker);\n        vm.expectRevert();\n        token.transferFrom(address(0), attacker, 0);\n    }\n\n    function test_burnFromZeroSenderMustRevert() public {\n        vm.prank(attacker);\n        vm.expectRevert();\n        token.burnFrom(address(0), 0);\n    }\n}","reproduction":"State: fresh VerdictToken, attacker = any EOA with no balance and no allowance. Call 1: vm.prank(attacker); token.transferFrom(address(0), attacker, 0). Expected: revert (ZeroAddress), as the recipient-side check does for `to == address(0)`. Actual: returns true and emits Approval(owner=0x0, spender=attacker, 0) then Transfer(from=0x0, to=attacker, 0) (confirmed by forge trace). Call 2: vm.prank(attacker); token.burnFrom(address(0), 0). Expected: revert. Actual: returns and emits Transfer(0x0, 0x0, 0). Run: forge test --match-path test/scratch/ZeroSender.t.sol -> both tests FAIL with 'next call did not revert as expected' on the current code.","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"Zero-address sender is never rejected: anyone can emit mint-shaped Transfer(address(0), to, 0) and Approval(address(0), spender, 0) events via transferFrom/burnFrom"}],"hash":"575b2f48dba3235510f22c95e21f6e1cbc0a6610874756a4d195f83f87cd0cdd","nodeId":"3c3d66fb-e9c4-4774-b734-84d20176674c","outcome":"completed","summary":"The review is complete and the findings file is written at the repository root. No source file was changed.\n\n**Result: one low-severity finding, no critical, high or medium defects in the Access Control, Trust Gap or Asymmetry areas.**\n\n**What I checked.** The token has no owner, no roles, no initializer, no modifiers and no external calls, so the permission model reduces to msg.sender identity plus explicit allowances. I mapped every writer of the three storage variables and traced all seven entry points through their guards, state changes and revert paths. The allowance guard is identical on transferFrom and burnFrom, the factory cannot pull or burn without an allowance, infinite allowances are not decremented, a reverted transfer does not consume allowance, and the unchecked arithmetic cannot wrap because the sum of balances always equals a supply that only shrinks. The constructor mints the full supply once to msg.sender with no arguments, matching the manifest. The existing 43 tests pass.\n\n**Finding 1, low.** The recipient and spender are checked against address zero, but the sender never is. Since balanceOf of address zero is always zero and a zero allowance covers a zero amount, any account can call transferFrom with address zero as sender and amount zero. The token then emits a mint-shaped Transfer from address zero plus a spurious Approval from address zero. burnFrom behaves the same way. No balance or supply changes, so no funds are at risk, but the \"nothing can mint after launch\" guarantee is contradicted at the event level, which affects explorers, indexers and monitoring, and enables zero-value address poisoning labelled as a mint. OpenZeppelin rejects this case. The suggested fix is one zero-sender check in the two internal helpers.\n\n**Proof.** The scratch test under test/scratch fails on the current code and passes in a copy with the fix applied, where the full suite also still passes with 45 tests green. The test source is embedded in the finding.\n\n**Coverage.** All seven entry points have rows: five hold, transferFrom and burnFrom carry finding 1. Four additional invariant rows record the no-privilege, single-mint, conservation and opcode checks. Nothing in my area was left unreached.\n\n**Trust assumption, not a finding.** The factory holds the entire supply at deployment and distributes it; that is the launch design, and no path lets it reclaim tokens afterwards.","treeHash":null,"usage":{"cachedInputTokens":783438,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14422,"runtime":"claude","turns":21,"wallClockMs":211932}},{"artifacts":[],"attempt":1,"bundleHash":"8947f61052e60cca237525691bddf629a6a52402cc4c257e0741da66497ed798","device":"1369de7c9398881a","findings":[],"hash":"7588d54a76e4d5fb211cbba8487affffc3e8f44e505dce45797134d9c399c932","nodeId":"f7e38686-fb51-47ae-8e1c-79bc45c8b782","outcome":"completed","summary":"Added 24 adversarial/fuzz tests and two multi-actor invariant campaigns under `test/`, covering failure paths, rollback, allowances, burns, and conservation.\n\nVerified offline: `forge build` and `forge test` pass—70 tests, zero failures. Token coverage is 100% across lines, statements, branches, and functions.\n\nNo contract defects found. Only test files changed.","treeHash":"9f101ad777b2e3513a004e2b81c55ba5d5c0b4c2","usage":{"cachedInputTokens":901888,"inputTokens":73372,"model":"gpt-6-astra","outputTokens":18765,"runtime":"codex","turns":6,"wallClockMs":505723}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa2b0b9c7ebc1547","findings":[{"citation":"resolved","description":"_transfer rejects a zero recipient but never rejects a zero sender. transferFrom(address(0), to, 0) passes _spendAllowance (allowance[0][caller] is 0 and 0 < 0 is false) and _transfer (balanceOf[0] is 0 and 0 < 0 is false), so any caller can emit Approval(address(0), caller, 0) and Transfer(address(0), to, 0). Nothing moves: balances, totalSupply and allowances are unchanged, and because the amount must be 0 (address(0) can never hold a balance since every credit path rejects a zero recipient) there is no economic effect. It is only an event-shape deviation from OpenZeppelin's ERC20, which reverts with ERC20InvalidSender, and could confuse an indexer that treats Transfer-from-zero as a mint. Minimal fix that preserves intended behaviour: add `if (from == address(0)) revert ZeroAddress();` at the top of _transfer (and optionally _burn). Reported for completeness; no revision is needed on economic grounds.","line":145,"path":"src/VerdictToken.sol","reproduction":"Deploy VerdictToken. From any account `alice` call token.transferFrom(address(0), alice, 0). Expected (OpenZeppelin semantics): revert. Actual: returns true and emits Approval(address(0), alice, 0) then Transfer(address(0), alice, 0); totalSupply stays 1000000000000000000000000000 and balanceOf(alice) stays 0. Verified with a Foundry test using vm.expectEmit for both events; conservation invariants hold before and after.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"transferFrom accepts from == address(0) for zero value and emits a mint-shaped Transfer event"}],"hash":"a5db472f2d9fccca1bb0a24e64d53ba01612082202512528f36887cc34fa391e","nodeId":"ee2337ff-554e-46a1-9cf3-1d5fa109c641","outcome":"completed","summary":"The review is complete and the findings file is in place. Nothing else is pending.\n\n**Outcome: the VERDICT token is economically sound.** I found no defect in the Economic Security, Invariant or Flow Gap areas that costs anyone value. The report in `.imd-findings.json` holds one info-level note and eleven coverage rows, all seven listed entry points answered.\n\n**What I checked, against the three assigned guides:**\n- **Economic Security.** The token has no external dependency, oracle, callback, fee, tax, reflection, pause or blacklist. Every launch flow (factory to distributor, pool seed through the PoolManager, claims, swaps both ways) moves exactly the stated amount. Burns only shrink the caller's own balance or one the holder approved.\n- **Invariants.** A handler-based invariant fuzz over all seven entry points ran 128,000 calls without breaking sum of balances equals total supply, total supply equals initial minus burned, or supply never grows. The constructor is the only writer that raises supply, minting exactly 1e27 to the factory under CREATE2 with no arguments.\n- **Flow Gap.** No cached-then-mutated value, no callback mid-flow, no path where a clean trace ends in a state that contradicts the fixed-supply promise. The unchecked arithmetic is guarded by the balance and allowance checks that precede it.\n\n**The one finding (info).** `transferFrom(address(0), to, 0)` succeeds and emits a mint-shaped Transfer event plus an Approval from the zero address. Nothing moves and the amount can only ever be zero. It is an event-shape deviation from OpenZeppelin's ERC20 and needs no economic revision. The fix is a one-line sender check in the internal transfer.\n\n**Static-analysis leads.** Slither reported nothing. Aderyn's large-literal note on line 52 is the compile-time supply constant, which the tests confirm equals one billion whole tokens, so it is not a defect.\n\n**Not covered.** No launch.json exists in the tree yet, which the rules say is expected at this stage. Forge was the only tool run. The scratch probe directory was removed, leaving the tree unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":654388,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14056,"runtime":"claude","turns":20,"wallClockMs":227592}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"98b4506bef931d13","findings":[],"hash":"d27410695aa3e36e48c490ca6f18cc0c8f2a5ccd0fc5b066ba5e4428ae47d898","nodeId":"ef044eea-8fb4-41eb-aca4-e71f77e20395","outcome":"completed","summary":"The review is complete. The findings file is written, the scratch tests are removed, and the tree is clean. The findings file shows as ignored because the repository's own gitignore excludes it, which is the expected place for a review artifact; `out/` and `cache/` are also ignored build output.\n\n**Result: no defects found in the Execution Trace, Periphery and First Principles area.** `.imd-findings.json` holds an empty findings list and 11 coverage rows, all `holds`.\n\n**What was covered**\n\n- All seven state-changing entry points were traced from call to final state, including every revert path and the unchecked arithmetic blocks. Each unchecked subtraction is guarded by an explicit comparison on the line before it. The unchecked addition in the recipient balance cannot overflow because the sum of balances never exceeds the initial 1e27 supply.\n- A handler-driven invariant run (six actors, all seven mutators, 256 runs) confirmed sum of balances equals totalSupply and totalSupply equals the initial supply minus what was burned.\n- Edge cases probed and found sound: self-transfer and self-transferFrom, zero amounts, burnFrom and transferFrom against the zero address, decreasing an unlimited allowance, increasing to exactly the max sentinel, burning the entire supply, calls carrying ETH value, and the 32-byte return shape that Uniswap v4's currency library checks.\n- Periphery is minimal: there are no libraries or helpers. The deploy script only constructs the token inside a broadcast and is not part of the launch path. The ABI has no fallback, receive, payable or privileged function, and the runtime bytecode has no delegatecall, callcode or selfdestruct.\n- The one static-analysis lead (large numeric literal at line 52) is a compile-time constant that evaluates to exactly 10^27. It is style only, recorded as a lead that did not promote.\n\n**Trust assumptions to note for the judge, not defects:** the token is privilege-free, so the approve-overwrite race is the only known ERC-20 behavioural caveat, and it is mitigated by the increase/decrease helpers and documented in the README. Unlimited allowances are never decremented, which matches the convention routers rely on.\n\n**Not reached:** nothing in the assigned area was left unexamined. Launch-time behaviour against a live PoolManager was not run here because the protected harness needs the verifier's environment variables, but the token's transfer semantics are plain enough that the existing launch-flow tests exercise the same paths.","treeHash":null,"usage":{"cachedInputTokens":589538,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":14458,"runtime":"claude","turns":21,"wallClockMs":227911}},{"artifacts":[],"attempt":1,"bundleHash":"5f2ef28d7f17ff0e981a2c45fda9e25c3f85e33851952079b8a688789fc42ec2","device":"90675b3128fe9096","findings":[],"hash":"fbc96c6369e9b26c9f6203b09976388a7c19c6ab34189c1f35b00a78c3c6d555","nodeId":"4b4d10dd-8166-4807-9a5a-ca917ff82c84","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/41090e54-1271-444a-8469-a6d84c6150ba/4b4d10dd-8166-4807-9a5a-ca917ff82c84/launch.json) matching `VerdictToken`, its supply and constructor, and the exact pool and economics values.\n\nManifest and ABI checks passed. `forge build` succeeded; `forge test` passed all 43 tests. Only `launch.json` changed.","treeHash":"39970d550ef4a466e30d7f8e51f19c3dc338ba33","usage":{"cachedInputTokens":177920,"inputTokens":24841,"model":"gpt-6-astra","outputTokens":2606,"runtime":"codex","turns":3,"wallClockMs":68589}}],"verification":[{"checks":[{"durationMs":1032,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 942.90ms\nCompiler run successful!\n","passed":true},{"durationMs":85,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/LaunchFlows.t.sol:LaunchFlowsTest\n[PASS] test_contractIdentifierFitsTheManifest() (gas: 3177)\n[PASS] test_create2DeploymentMintsWholeSupplyToTheFactory() (gas: 23062)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 632417)\n[PASS] test_deployScriptFunctionMintsToItsCaller() (gas: 1401682)\n[PASS] test_factoryCannotPullBackWhatItHandedOut() (gas: 94565)\n[PASS] test_fullLaunchSplitArrivesExactly() (gas: 230653)\n[PASS] test_poolCounterpartyCanPullViaAllowanceAndPayOut() (gas: 261035)\n[PASS] test_swarmShareArrivesWholeAndIsClaimableWhole() (gas: 159492)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 7.29ms (1.29ms CPU time)\n\nRan 35 tests for test/VerdictToken.t.sol:VerdictTokenTest\n[PASS] testFuzz_burnOnlyEverShrinksSupply(uint256,uint256) (runs: 256, μ: 98444, ~: 99139)\nLogs:\n  Bound result 449400696826679755116187639\n  Bound result 3\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 41316, ~: 41051)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129649883\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 101849, ~: 102356)\nLogs:\n  Bound result 117920902092453096925\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 147936, ~: 149237)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 999999999999999996\n\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 91830)\n[PASS] test_approveRevertsForZeroSpender() (gas: 30032)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 67515)\n[PASS] test_burnFromRevertsOnInsufficientAllowance() (gas: 137526)\n[PASS] test_burnFromRevertsWithoutAllowanceEvenForDeployer() (gas: 105981)\n[PASS] test_burnFromSpendsAllowance() (gas: 179984)\n[PASS] test_burnRevertsOnInsufficientBalance() (gas: 92950)\n[PASS] test_burnShrinksSupplyAndBalance() (gas: 114752)\n[PASS] test_constructorMintsWholeSupplyToDeployerOnce() (gas: 39407)\n[PASS] test_decreaseAllowanceRevertsBelowZero() (gas: 84373)\n[PASS] test_increaseAllowanceRevertsOnOverflow() (gas: 81851)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 156146)\n[PASS] test_metadata() (gas: 26727)\n[PASS] test_noCommonAdminCallIncreasesSupply() (gas: 714432)\n[PASS] test_noPrivilegedHandMovesOrFreezesAHolder() (gas: 466538)\n[PASS] test_rejectsEtherAndUnknownCalls() (gas: 58563)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2891872)\n[PASS] test_supplyIsExactlyOneBillionWholeTokens() (gas: 40933)\n[PASS] test_transferFromRevertsOnInsufficientAllowance() (gas: 140064)\n[PASS] test_transferFromRevertsOnInsufficientBalanceEvenWithAllowance() (gas: 154948)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 89302)\n[PASS] test_transferFromRevertsWithoutAnyAllowance() (gas: 92716)\n[PASS] test_transferFromSpendsAllowanceAndEmits() (gas: 225078)\n[PASS] test_transferFromWithUnlimitedAllowanceDoesNotDecrement() (gas: 187666)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 95681)\n[PASS] test_transferOfZeroSucceeds() (gas: 45080)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37682)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 89977)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30008)\n[PASS] test_transferToSelfIsANoOp() (gas: 95697)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 129809)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 9.66ms (37.17ms CPU time)\n\nRan 2 test suites in 10.62ms (16.94ms CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictToken.approve(address,uint256)\",\"VerdictToken.burn(uint256)\",\"VerdictToken.burnFrom(address,uint256)\",\"VerdictToken.decreaseAllowance(address,uint256)\",\"VerdictToken.increaseAllowance(address,uint256)\",\"VerdictToken.transfer(address,uint256)\",\"VerdictToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":7,\"README.md\":139,\"foundry.toml\":21,\"remappings.txt\":1,\"script/DeployVerdictToken.s.sol\":26,\"src/VerdictToken.sol\":182,\"test/LaunchFlows.t.sol\":125,\"test/VerdictToken.t.sol\":395},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":367,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":222,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/VerdictToken.sol:52: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4b6ff9e8afd548dca62cc5a76f44a35f4863c9bea4f410e07ad36a68a9155fc6","verifiedTreeHash":"4763eeda6c1da282c9bab31f101405495ee55cfc","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":1816,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.69s\nCompiler run successful!\n","passed":true},{"durationMs":8955,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/LaunchFlows.t.sol:LaunchFlowsTest\n[PASS] test_contractIdentifierFitsTheManifest() (gas: 3177)\n[PASS] test_create2DeploymentMintsWholeSupplyToTheFactory() (gas: 23062)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 632417)\n[PASS] test_deployScriptFunctionMintsToItsCaller() (gas: 1401682)\n[PASS] test_factoryCannotPullBackWhatItHandedOut() (gas: 94565)\n[PASS] test_fullLaunchSplitArrivesExactly() (gas: 230653)\n[PASS] test_poolCounterpartyCanPullViaAllowanceAndPayOut() (gas: 261035)\n[PASS] test_swarmShareArrivesWholeAndIsClaimableWhole() (gas: 159492)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.47ms (930.31µs CPU time)\n\nRan 35 tests for test/VerdictToken.t.sol:VerdictTokenTest\n[PASS] testFuzz_burnOnlyEverShrinksSupply(uint256,uint256) (runs: 256, μ: 98359, ~: 98485)\nLogs:\n  Bound result 42\n  Bound result 1173\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 41358, ~: 41693)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639953\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 101823, ~: 101846)\nLogs:\n  Bound result 75462028905461895672045523\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 147614, ~: 149195)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 183601732170011446\n\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 91830)\n[PASS] test_approveRevertsForZeroSpender() (gas: 30032)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 67515)\n[PASS] test_burnFromRevertsOnInsufficientAllowance() (gas: 137526)\n[PASS] test_burnFromRevertsWithoutAllowanceEvenForDeployer() (gas: 105981)\n[PASS] test_burnFromSpendsAllowance() (gas: 179984)\n[PASS] test_burnRevertsOnInsufficientBalance() (gas: 92950)\n[PASS] test_burnShrinksSupplyAndBalance() (gas: 114752)\n[PASS] test_constructorMintsWholeSupplyToDeployerOnce() (gas: 39407)\n[PASS] test_decreaseAllowanceRevertsBelowZero() (gas: 84373)\n[PASS] test_increaseAllowanceRevertsOnOverflow() (gas: 81851)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 156146)\n[PASS] test_metadata() (gas: 26727)\n[PASS] test_noCommonAdminCallIncreasesSupply() (gas: 714432)\n[PASS] test_noPrivilegedHandMovesOrFreezesAHolder() (gas: 466538)\n[PASS] test_rejectsEtherAndUnknownCalls() (gas: 58563)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2891872)\n[PASS] test_supplyIsExactlyOneBillionWholeTokens() (gas: 40933)\n[PASS] test_transferFromRevertsOnInsufficientAllowance() (gas: 140064)\n[PASS] test_transferFromRevertsOnInsufficientBalanceEvenWithAllowance() (gas: 154948)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 89302)\n[PASS] test_transferFromRevertsWithoutAnyAllowance() (gas: 92716)\n[PASS] test_transferFromSpendsAllowanceAndEmits() (gas: 225078)\n[PASS] test_transferFromWithUnlimitedAllowanceDoesNotDecrement() (gas: 187666)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 95681)\n[PASS] test_transferOfZeroSucceeds() (gas: 45080)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37682)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 89977)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30008)\n[PASS] test_transferToSelfIsANoOp() (gas: 95697)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 129809)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 456.10ms (1.43s CPU time)\n\nRan 24 tests for test/VerdictTokenAdversarial.t.sol:VerdictTokenAdversarialTest\n[PASS] testFuzz_allowanceArithmeticFailureIsAtomic(uint256,uint256,bool) (runs: 1000, μ: 618091, ~: 618306)\nLogs:\n  Bound result 5923216529719751884558963462716122071052879508781677928843924\n  Bound result 115792089237316195295643798498716533244294669651027338279681327548245838774151\n\n[PASS] testFuzz_allowanceIncreaseDecreaseRoundTrip(uint256,uint256) (runs: 1000, μ: 647941, ~: 648083)\nLogs:\n  Bound result 13512\n\n[PASS] testFuzz_approvalOverwritesAndIsIdempotent(uint256,uint256) (runs: 1000, μ: 752605, ~: 752624)\n[PASS] testFuzz_burningInPiecesMatchesOneBurn(uint256,uint256) (runs: 1000, μ: 656809, ~: 657158)\nLogs:\n  Bound result 938463463374607091485844535\n  Bound result 32\n\n[PASS] testFuzz_delegatedBalanceFailureRollsBackPermission(uint256,uint256,uint256,bool) (runs: 1000, μ: 682625, ~: 682836)\nLogs:\n  Bound result 12\n  Bound result 1206193359\n  Bound result 1206193358\n\n[PASS] testFuzz_delegatedTransfersHandleEveryActorAlias(uint8,uint8,uint8,uint256,bool) (runs: 1000, μ: 327596, ~: 329519)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_insufficientPermissionRevertsDespiteSufficientBalance(uint256,uint256,uint256,bool) (runs: 1000, μ: 674173, ~: 675581)\nLogs:\n  Bound result 472153750329749553307868915\n  Bound result 3\n  Bound result 355933497225532251663570653\n\n[PASS] testFuzz_transferAndBurnCannotReuseSpentPermission(uint256,uint256) (runs: 1000, μ: 790404, ~: 791966)\nLogs:\n  Bound result 1428\n  Bound result 651\n\n[PASS] testFuzz_transferRoundTripRestoresAllState(uint256,uint256) (runs: 1000, μ: 715013, ~: 715757)\nLogs:\n  Bound result 1428\n  Bound result 651\n\n[PASS] testFuzz_zeroRecipientRevertsWithoutConsumingPermission(uint256,uint256) (runs: 1000, μ: 622989, ~: 623326)\nLogs:\n  Bound result 72420483731924953837588977\n  Bound result 115792089237316195423570985008687907853269984665640491618973852082959292051000\n\n[PASS] test_burningWholeSupplyLeavesZeroAndCannotBeRepeated() (gas: 707277)\n[PASS] test_constructorCreditsCallerRatherThanTransactionOrigin() (gas: 40871)\n[PASS] test_delegatedBurnCanConsumeExactlyTheEntireSupplyAndPermission() (gas: 723281)\n[PASS] test_delegatedFullSupplySelfTransferStillConsumesFinitePermission() (gas: 693372)\n[PASS] test_emptyHolderCanGrantAndRevokeMaxPermissionWithoutCreatingTokens() (gas: 701041)\n[PASS] test_holderNeedsSelfApprovalForDelegatedEntryPoints() (gas: 835644)\n[PASS] test_maxUintBalanceOperationsRevertWithoutOverflowOrStateChanges() (gas: 1226931)\n[PASS] test_oneMinorUnitTransferAndBurnShareOneAllowance() (gas: 865962)\n[PASS] test_onlyExactMaxUintAllowanceIsUnlimited() (gas: 409191)\n[PASS] test_permissionIsSpecificToBothOwnerAndSpender() (gas: 1961991)\n[PASS] test_revocationStopsTransfersAndBurnsAfterUnlimitedApprovalWasUsed() (gas: 1538749)\n[PASS] test_tokenItselfCanReceiveTheWholeSupplyWithoutTaxOrBurn() (gas: 92177)\n[PASS] test_zeroRecipientAndSpenderAreRejectedEvenForZeroAmounts() (gas: 665834)\n[PASS] test_zeroValueOperationsFromEmptyHoldersEmitAndPreserveState() (gas: 678190)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 456.16ms (4.18s CPU time)\n\nRan 2 tests for test/VerdictTokenInvariant.t.sol:VerdictTokenInvariantTest\n[PASS]\nVerdictTokenInvariantTest invariants:\n[PASS] invariant_balancesAndPermissionsMatchTheLedger\n[PASS] invariant_onlyAuthorizedBurnsChangeTheOriginalSupply\n VerdictTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭---------------------+---------------------------+-------+---------+----------╮\n| Contract            | Selector                  | Calls | Reverts | Discards |\n+==============================================================================+\n| VerdictTokenHandler | approve                   | 2986  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | burn                      | 2973  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | burnFrom                  | 2976  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | decreaseAllowance         | 3057  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | increaseAllowance         | 2936  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectAllowanceArithmetic | 3049  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectAllowanceOverspend  | 2953  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectBalanceOverspend    | 2989  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectZeroAddress         | 2914  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | transfer                  | 3033  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | transferFrom              | 2902  | 0       | 0        |\n╰---------------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129640935\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129645724\n  Bound result 482369705662332135881087946\n  Bound result 192784245388065139364519687\n  Bound result 775716547377565447963680968\n  Bound result 10000\n  Bound result 10901\n  Bound result 18\n  Bound result 3712\n  Bound result 5608\n  Bound result 17\n  Bound result 9\n  Bound result 3213\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2134\n  Bound result 188463463377487581721828683\n  Bound result 249999999999999999999996271\n  Bound result 2083\n  Bound result 8\n  Bound result 115792089237316195423570985008687907853269984665640314040457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913130541266\n  Bound result 8730324263529189993444093\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1000000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640252503920961495494851473341\n  Bound result 115792089237316195423570985008687907853269984665640252503920961495494852319265\n  Bound result 249999999999999999999999999\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 311535536622512418278169197\n  Bound result 35978648412309401323350333\n  Bound result 115792089237316195423570985008687907853269984665640541820571527793284194267948\n  Bound result 115792089237316195423570985008687907853269984665640252503920961495494851473971\n  Bound result 29105498800839753054781819135612462988\n  Bound result 17\n  Bound result 17\n  Bound result 115792089237316195423570985008687907853269984665640252503920961495494851472654\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639929\n  Bound result 4000000000000000000\n  Bound result 1000000000\n  Bound result 11\n  Bound result 700000000000000000000000000\n  Bound result 4000000000000000000\n  Bound result 7000000000000000000\n  Bound result 9503\n  Bound result 4000000000000000000\n  Bound result 999999999999999999999999998\n  Bound result 115792089237316195423570985008687907853269984665640564038531524700816350204360\n  Bound result 1567654990962686636059\n  Bound result 115792089237316195423570985008687907853269984665640563434716502744232787316310\n  Bound result 18781476236904423435784489853514766109128348290082238887275094998603307\n  Bound result 255\n  Bound result 7072\n  Bound result 4000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640252503924961495494851478143\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640252503943408239568561022624\n  Bound result 13240\n  Bound result 3906580467692568379\n  Bound result 297\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 2789\n  Bound result 4660879611611800888\n  Bound result 2\n  Bound result 0\n  Bound result 42\n  Bound result 8739\n  Bound result 1\n  Bound result 100000000000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640464039457584007913129639935\n  Bound result 1000000000000000000\n  Bound result 9\n  Bound result 748\n  Bound result 249999999999999999999096239\n  Bound result 1000000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640252503930961495494851492494\n  Bound result 42194040543576728588984177\n  Bound result 32\n  Bound result 1000000000\n  Bound result 9999999999999999999\n\n[PASS] test_handlerExercisesStateChangesAndExpectedReverts() (gas: 1195955)\nLogs:\n  Bound result 249999999999999999999999999\n  Bound result 249999999999999999999999999\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129639936\n  Bound result 250000000000000000000000001\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.48s (8.48s CPU time)\n\nRan 1 test for test/VerdictTokenInvariant.t.sol:VerdictTokenTransferInvariantTest\n[PASS]\nVerdictTokenTransferInvariantTest invariants:\n[PASS] invariant_balancesAndPermissionsMatchTheLedger\n[PASS] invariant_onlyAuthorizedBurnsChangeTheOriginalSupply\n[PASS] invariant_transfersAndApprovalsKeepTheFullBillionTokens\n VerdictTokenTransferInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭---------------------+---------------------------+-------+---------+----------╮\n| Contract            | Selector                  | Calls | Reverts | Discards |\n+==============================================================================+\n| VerdictTokenHandler | approve                   | 3640  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | decreaseAllowance         | 3674  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | increaseAllowance         | 3636  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectAllowanceArithmetic | 3588  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectAllowanceOverspend  | 3623  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectBalanceOverspend    | 3584  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | rejectZeroAddress         | 3625  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | transfer                  | 3655  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| VerdictTokenHandler | transferFrom              | 3743  | 0       | 0        |\n╰---------------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171121034423529336946697753388002916031201\n  Bound result 199416081117820604261186218\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 970400883602786704046438245\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1000000000000000001\n  Bound result 3407843315450859626831650124244312339021663702205602377247803388333158130\n  Bound result 6000000000000000000\n  Bound result 11\n  Bound result 236211893401410844149984461\n  Bound result 7000\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129646982\n  Bound result 1000\n  Bound result 115792089237316195423570985008687907853269984665640314039457586204873373966307\n  Bound result 115792089237316195423570985008687907853269984665640314039457706792103266965425\n  Bound result 1000\n  Bound result 158777384041879762970430200934674096499\n  Bound result 115792089237316195423570985008687907853269984665640314039467584007913129639936\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 7245863177105947083221899311728072544420610439386041173273741916667184\n  Bound result 1000000000000000000\n  Bound result 11091\n  Bound result 17\n  Bound result 6690\n  Bound result 10\n  Bound result 115792089237316195423570985008687907853269984665640314039462584007913129638935\n  Bound result 887\n  Bound result 7715\n  Bound result 230\n  Bound result 249999999000000000000001003\n  Bound result 9\n  Bound result 218\n  Bound result 1786\n  Bound result 127\n  Bound result 3970\n  Bound result 115792089237316195423570985008687907853269984665640369241089429745482600426665\n  Bound result 20000000000000019020\n  Bound result 9\n  Bound result 1\n  Bound result 3000000000000000000\n  Bound result 7\n  Bound result 6557\n  Bound result 3395723175\n  Bound result 13892\n  Bound result 6\n  Bound result 10000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640314039458584007913129650340\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 0\n  Bound result 108545589724009262212414426342868402543639268607020876517132313424315521529493\n  Bound result 196462545889663981698716337358818708535101617076008651033390238137\n  Bound result 250000000000000000000001001\n  Bound result 113485704418446542590903014\n  Bound result 12196\n  Bound result 2\n  Bound result 10\n  Bound result 2025531\n  Bound result 115792089237316195423570985008687907853269984665639814039456584007913127622199\n  Bound result 306274900321933834624632642888220791962102912\n  Bound result 2757214936\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.88s (8.88s CPU time)\n\nRan 5 test suites in 8.88s (18.28s CPU time): 70 tests passed, 0 failed, 0 skipped (70 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictToken.approve(address,uint256)\",\"VerdictToken.burn(uint256)\",\"VerdictToken.burnFrom(address,uint256)\",\"VerdictToken.decreaseAllowance(address,uint256)\",\"VerdictToken.increaseAllowance(address,uint256)\",\"VerdictToken.transfer(address,uint256)\",\"VerdictToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":7,\"README.md\":139,\"foundry.toml\":21,\"remappings.txt\":1,\"script/DeployVerdictToken.s.sol\":26,\"src/VerdictToken.sol\":182,\"test/LaunchFlows.t.sol\":125,\"test/VerdictToken.t.sol\":395,\"test/VerdictTokenAdversarial.t.sol\":456,\"test/VerdictTokenInvariant.t.sol\":105,\"test/handlers/VerdictTokenHandler.sol\":312},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7588d54a76e4d5fb211cbba8487affffc3e8f44e505dce45797134d9c399c932","verifiedTreeHash":"9f101ad777b2e3513a004e2b81c55ba5d5c0b4c2","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":1060,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 963.61ms\nCompiler run successful!\n","passed":true},{"durationMs":82,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/LaunchFlows.t.sol:LaunchFlowsTest\n[PASS] test_contractIdentifierFitsTheManifest() (gas: 3177)\n[PASS] test_create2DeploymentMintsWholeSupplyToTheFactory() (gas: 23062)\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 632417)\n[PASS] test_deployScriptFunctionMintsToItsCaller() (gas: 1401682)\n[PASS] test_factoryCannotPullBackWhatItHandedOut() (gas: 94565)\n[PASS] test_fullLaunchSplitArrivesExactly() (gas: 230653)\n[PASS] test_poolCounterpartyCanPullViaAllowanceAndPayOut() (gas: 261035)\n[PASS] test_swarmShareArrivesWholeAndIsClaimableWhole() (gas: 159492)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 6.95ms (1.14ms CPU time)\n\nRan 35 tests for test/VerdictToken.t.sol:VerdictTokenTest\n[PASS] testFuzz_burnOnlyEverShrinksSupply(uint256,uint256) (runs: 256, μ: 98444, ~: 99145)\nLogs:\n  Bound result 808750759150593753403492781\n  Bound result 191249240849406246596507216\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 41343, ~: 41693)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584475886453191040\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 101688, ~: 101846)\nLogs:\n  Bound result 24989580874473498238986849\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 147218, ~: 149255)\nLogs:\n  Bound result 0\n  Bound result 0\n\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 91830)\n[PASS] test_approveRevertsForZeroSpender() (gas: 30032)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 67515)\n[PASS] test_burnFromRevertsOnInsufficientAllowance() (gas: 137526)\n[PASS] test_burnFromRevertsWithoutAllowanceEvenForDeployer() (gas: 105981)\n[PASS] test_burnFromSpendsAllowance() (gas: 179984)\n[PASS] test_burnRevertsOnInsufficientBalance() (gas: 92950)\n[PASS] test_burnShrinksSupplyAndBalance() (gas: 114752)\n[PASS] test_constructorMintsWholeSupplyToDeployerOnce() (gas: 39407)\n[PASS] test_decreaseAllowanceRevertsBelowZero() (gas: 84373)\n[PASS] test_increaseAllowanceRevertsOnOverflow() (gas: 81851)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 156146)\n[PASS] test_metadata() (gas: 26727)\n[PASS] test_noCommonAdminCallIncreasesSupply() (gas: 714432)\n[PASS] test_noPrivilegedHandMovesOrFreezesAHolder() (gas: 466538)\n[PASS] test_rejectsEtherAndUnknownCalls() (gas: 58563)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2891872)\n[PASS] test_supplyIsExactlyOneBillionWholeTokens() (gas: 40933)\n[PASS] test_transferFromRevertsOnInsufficientAllowance() (gas: 140064)\n[PASS] test_transferFromRevertsOnInsufficientBalanceEvenWithAllowance() (gas: 154948)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 89302)\n[PASS] test_transferFromRevertsWithoutAnyAllowance() (gas: 92716)\n[PASS] test_transferFromSpendsAllowanceAndEmits() (gas: 225078)\n[PASS] test_transferFromWithUnlimitedAllowanceDoesNotDecrement() (gas: 187666)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 95681)\n[PASS] test_transferOfZeroSucceeds() (gas: 45080)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37682)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 89977)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30008)\n[PASS] test_transferToSelfIsANoOp() (gas: 95697)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 129809)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 9.65ms (38.69ms CPU time)\n\nRan 2 test suites in 10.46ms (16.61ms CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictToken.approve(address,uint256)\",\"VerdictToken.burn(uint256)\",\"VerdictToken.burnFrom(address,uint256)\",\"VerdictToken.decreaseAllowance(address,uint256)\",\"VerdictToken.increaseAllowance(address,uint256)\",\"VerdictToken.transfer(address,uint256)\",\"VerdictToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":7,\"README.md\":139,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":1,\"script/DeployVerdictToken.s.sol\":26,\"src/VerdictToken.sol\":182,\"test/LaunchFlows.t.sol\":125,\"test/VerdictToken.t.sol\":395},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fbc96c6369e9b26c9f6203b09976388a7c19c6ab34189c1f35b00a78c3c6d555","verifiedTreeHash":"39970d550ef4a466e30d7f8e51f19c3dc338ba33","verifierVersion":"0.1.0+fb8278c5"}]}