{"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":"92b87fce-7818-4c1e-96ce-5f131c3f382d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ad90f704aacba4f7d4522ff34ce67d269916707a4323dde2f593d8d13ffd4b2a","dependsOn":["build_contract_project","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"1b1142095535314281701dfdea8cfc68e86fde0dfc22acdaa6b08f4b2019e36f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"04336988bb7aab2ea44055f7c1004b915b53e7cda8a28069e36cf014c674919e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Build and independently review Token Voting: token Vote (VOTE) and contract TokenVoting, where any holder opens a proposal with a text hash and a deadline; holders vote for or against once per proposal, weighted by their VOTE balance at the moment they vote; results are readable after the deadline and nothing executes on chain. Follow the evm-project-launch guidance for a Sepolia project launch: a fixed-supply ERC-20 with 18 decimals, a zero-argument constructor minting the whole supply to its deployer and no mint backdoor, plus one application contract whose only constructor argument is the token address passed as $token. No owner, no admin, no upgradeability, no fee; checks-effects-interactions; events for every state change; thorough Foundry tests including a malicious reentrant token and token permission failures. The manifest names the token and the contract with the $token argument. Independent review before deployment. Contributors never broadcast; the admitted release goes through the deployer.","parentJobId":null,"planHash":"b0e24d611ae16200eab0aed7bcf0063a7ae256e7ece874ed26244a85cd713ec4","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"92b87fce-7818-4c1e-96ce-5f131c3f382d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/Identity-md/launch-59-build-independently-review-token"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50906","feedbackHash":"4b542757583059b7beef99e90450756544849f515f649f3a47f23e785286ccf9","nodeKey":"adversarial_review","submissionHash":"ad90f704aacba4f7d4522ff34ce67d269916707a4323dde2f593d8d13ffd4b2a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"bb679370481d1fa2ed8ea1277d4caa628062e836bf3c0048de67d5de23e3dd56","nodeKey":"build_contract_project","submissionHash":"1b1142095535314281701dfdea8cfc68e86fde0dfc22acdaa6b08f4b2019e36f","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50953","feedbackHash":"78aa79136af66944f90c43a2ca089b499ebd7d72865f120767cf9613c0f4272e","nodeKey":"manifest","submissionHash":"04336988bb7aab2ea44055f7c1004b915b53e7cda8a28069e36cf014c674919e","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a890f20ad29791fc0877dba1db5a7c22e0e19de5c8f24a9e21776f0200080a20","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"52e89d4f85d3a6aa31dd352abb42225625138d0104fcda9512a7ad1558711164","device":"aad1250d716d3f82","findings":[],"hash":"04336988bb7aab2ea44055f7c1004b915b53e7cda8a28069e36cf014c674919e","nodeId":"c2d3b837-08f7-4c3b-ada6-c9066b89e46f","outcome":"completed","summary":"Implemented [launch.json](/home/imd/.identitymd/work/92b87fce-7818-4c1e-96ce-5f131c3f382d/c2d3b837-08f7-4c3b-ada6-c9066b89e46f/launch.json) as an `evm_project` manifest for `Vote` and `TokenVoting`.\n\nIt now includes:\n- token metadata for `Vote` / `VOTE`, 18 decimals\n- one app contract, `TokenVoting`, with constructor args `[\"$token\"]`\n- Sepolia-style pool settings\n- notes summarizing the independent review boundary and advisory voting limitations\n\nVerification:\n- `jq . launch.json` passed\n- `forge build` passed, with only existing lint warnings in `TokenVoting.sol`\n- `forge test` passed: 13 passed, 0 failed\n- `git status --short` shows only `launch.json` modified","treeHash":"bd365493b3cf1df43aaeff648d8fe1a0282c35ac","usage":{"cachedInputTokens":171392,"inputTokens":28504,"model":null,"outputTokens":3435,"runtime":"codex","turns":9,"wallClockMs":80362}},{"artifacts":[],"attempt":1,"bundleHash":"f7d50484a5e5929ffad524bffd84a90ee40bed8a70d830822111406ff775b62f","device":"3f6a9bdd601cb99f","findings":[],"hash":"1b1142095535314281701dfdea8cfc68e86fde0dfc22acdaa6b08f4b2019e36f","nodeId":"81355f8c-e329-4e50-8c1c-02f8d7b6f642","outcome":"completed","summary":"Implemented Vote, TokenVoting, launch manifest, documentation, and independent review.\n\n- Offline build, tests, and formatting checks pass.\n- All 13 delivered tests and supplied protected checks pass.\n- Independent review found no blockers.\n- Documented balance reuse: transferred tokens can vote again from another address.\n\nNo transactions were broadcast. Release remains with the authorized deployer.","treeHash":"e9a371d3077524e1122fab3316515f6b739d66d2","usage":{"cachedInputTokens":354048,"inputTokens":26262,"model":null,"outputTokens":7934,"runtime":"codex","turns":5,"wallClockMs":302193}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"90f1f5c3374333a0","findings":[],"hash":"ad90f704aacba4f7d4522ff34ce67d269916707a4323dde2f593d8d13ffd4b2a","nodeId":"15d30b20-07a5-4dcf-bf9c-f6777f71d710","outcome":"completed","summary":"No substantiated defects found after reviewing the contracts, tests, protected checks, and manifest.\n\nWrote `{\"findings\":[]}` to [.imd-findings.json](.imd-findings.json). Implementation files remain unchanged. Tests were inspected, not rerun.","treeHash":null,"usage":{"cachedInputTokens":71552,"inputTokens":16990,"model":null,"outputTokens":718,"runtime":"codex","turns":3,"wallClockMs":34828}}],"verification":[{"checks":[{"durationMs":936,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 845.44ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/TokenVoting.sol:49:13\n   │\n49 │         if (deadline <= block.timestamp) revert InvalidDeadline();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/TokenVoting.t.sol:21:28\n   │\n21 │             require(!ok && bytes4(reason) == TokenVoting.Reentrancy.selector, \"vote callback not blocked\");\n   │                            ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/TokenVoting.t.sol:24:28\n   │\n24 │             require(!ok && bytes4(reason) == TokenVoting.Reentrancy.selector, \"create callback not blocked\");\n   │                            ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/TokenVoting.sol:59:13\n   │\n59 │         if (block.timestamp >= proposal.deadline) revert VotingClosed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/TokenVoting.sol:72:13\n   │\n72 │         if (block.timestamp < proposal.deadline) revert VotingStillOpen();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVoting.t.sol:43:9\n   │\n43 │         token.transfer(alice, 100 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVoting.t.sol:44:9\n   │\n44 │         token.transfer(bob, 40 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVoting.t.sol:109:9\n    │\n109 │         token.transfer(bob, 100 ether);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVoting.t.sol:131:9\n    │\n131 │         token.transfer(bob, 60 ether);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVoting.t.sol:180:9\n    │\n180 │         token.transfer(voter, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:40:9\n   │\n40 │         token.transferFrom(address(this), bob, 5);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:45:9\n   │\n45 │         token.transferFrom(address(this), bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:51:9\n   │\n51 │         token.transferFrom(address(this), bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:54:9\n   │\n54 │         token.transfer(bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:56:9\n   │\n56 │         token.transfer(address(0), 0);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:63:9\n   │\n63 │         token.transferFrom(alice, bob, 10);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:68:9\n   │\n68 │         token.transferFrom(address(this), address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:73:9\n   │\n73 │         token.transfer(alice, 0);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:74:9\n   │\n74 │         token.transfer(address(this), 1e27);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:98:9\n   │\n98 │         token.transfer(alice, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":119,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Vote.t.sol:VoteTest\n[PASS] testAllowanceAndEvents() (gas: 77321)\n[PASS] testFuzzTransferConservation(uint256) (runs: 256, μ: 49273, ~: 49199)\nLogs:\n  Bound result 42332057841800443650774679\n\n[PASS] testMetadataSupplyAndConstructorEvent() (gas: 355080)\n[PASS] testNoMintOrAdmin() (gas: 27450)\n[PASS] testPermissionAndBalanceFailuresAreAtomic() (gas: 79105)\n[PASS] testZeroAndSelfTransfers() (gas: 22885)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 7.63ms (8.54ms CPU time)\n\nRan 7 tests for test/TokenVoting.t.sol:TokenVotingTest\n[PASS] testCurrentBalanceTransferReuseAndIndependentProposals() (gas: 404451)\n[PASS] testEmptyAndTiedPolls() (gas: 308434)\n[PASS] testFuzzWeight(uint96) (runs: 256, μ: 197634, ~: 197634)\n[PASS] testInvalidToken() (gas: 71626)\n[PASS] testMaliciousReentryAndPermissionFailuresRollback() (gas: 984783)\n[PASS] testRevertsAndDeadlineBoundary() (gas: 369275)\n[PASS] testWeightedVotingAndEvents() (gas: 227594)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 10.79ms (15.11ms CPU time)\n\nRan 2 test suites in 11.82ms (18.41ms CPU time): 13 tests passed, 0 failed, 0 skipped (13 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"04336988bb7aab2ea44055f7c1004b915b53e7cda8a28069e36cf014c674919e","verifiedTreeHash":"bd365493b3cf1df43aaeff648d8fe1a0282c35ac","verifierVersion":"0.1.0+1308af71"},{"checks":[{"durationMs":922,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 856.35ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/TokenVoting.sol:49:13\n   │\n49 │         if (deadline <= block.timestamp) revert InvalidDeadline();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:40:9\n   │\n40 │         token.transferFrom(address(this), bob, 5);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/TokenVoting.sol:59:13\n   │\n59 │         if (block.timestamp >= proposal.deadline) revert VotingClosed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/TokenVoting.sol:72:13\n   │\n72 │         if (block.timestamp < proposal.deadline) revert VotingStillOpen();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:45:9\n   │\n45 │         token.transferFrom(address(this), bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:51:9\n   │\n51 │         token.transferFrom(address(this), bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:54:9\n   │\n54 │         token.transfer(bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:56:9\n   │\n56 │         token.transfer(address(0), 0);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/TokenVoting.t.sol:21:28\n   │\n21 │             require(!ok && bytes4(reason) == TokenVoting.Reentrancy.selector, \"vote callback not blocked\");\n   │                            ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/TokenVoting.t.sol:24:28\n   │\n24 │             require(!ok && bytes4(reason) == TokenVoting.Reentrancy.selector, \"create callback not blocked\");\n   │                            ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:63:9\n   │\n63 │         token.transferFrom(alice, bob, 10);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:68:9\n   │\n68 │         token.transferFrom(address(this), address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:73:9\n   │\n73 │         token.transfer(alice, 0);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:74:9\n   │\n74 │         token.transfer(address(this), 1e27);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVoting.t.sol:43:9\n   │\n43 │         token.transfer(alice, 100 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVoting.t.sol:44:9\n   │\n44 │         token.transfer(bob, 40 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Vote.t.sol:98:9\n   │\n98 │         token.transfer(alice, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVoting.t.sol:109:9\n    │\n109 │         token.transfer(bob, 100 ether);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVoting.t.sol:131:9\n    │\n131 │         token.transfer(bob, 60 ether);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVoting.t.sol:180:9\n    │\n180 │         token.transfer(voter, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":78,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Vote.t.sol:VoteTest\n[PASS] testAllowanceAndEvents() (gas: 77321)\n[PASS] testFuzzTransferConservation(uint256) (runs: 256, μ: 48996, ~: 49199)\nLogs:\n  Bound result 999999999999999999999999999\n\n[PASS] testMetadataSupplyAndConstructorEvent() (gas: 355080)\n[PASS] testNoMintOrAdmin() (gas: 27450)\n[PASS] testPermissionAndBalanceFailuresAreAtomic() (gas: 79105)\n[PASS] testZeroAndSelfTransfers() (gas: 22885)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.33ms (5.66ms CPU time)\n\nRan 7 tests for test/TokenVoting.t.sol:TokenVotingTest\n[PASS] testCurrentBalanceTransferReuseAndIndependentProposals() (gas: 404451)\n[PASS] testEmptyAndTiedPolls() (gas: 308434)\n[PASS] testFuzzWeight(uint96) (runs: 256, μ: 197634, ~: 197634)\n[PASS] testInvalidToken() (gas: 71626)\n[PASS] testMaliciousReentryAndPermissionFailuresRollback() (gas: 984783)\n[PASS] testRevertsAndDeadlineBoundary() (gas: 369275)\n[PASS] testWeightedVotingAndEvents() (gas: 227594)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 6.06ms (6.98ms CPU time)\n\nRan 2 test suites in 6.88ms (11.40ms CPU time): 13 tests passed, 0 failed, 0 skipped (13 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1b1142095535314281701dfdea8cfc68e86fde0dfc22acdaa6b08f4b2019e36f","verifiedTreeHash":"e9a371d3077524e1122fab3316515f6b739d66d2","verifierVersion":"0.1.0+1308af71"}]}