{"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":"2fdf837b-92ea-42f6-8c9d-a1cafdcac854","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"e5d2289b739105a6249c5a1fb2047145e6ce1aa0f5b85a787130e66428bb3247","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"3fb847989f5929b1d0aee8843c18b427aa3a547954199a9d55200b24f7ba8ec8","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2f383656894e66f3304422030125f35e01c240b3eb30c3b45426f8ea6312cb8e","skillId":"deploy-script","tools":[]},"key":"deploy_script","kind":"code","role":"implement","skillHash":"2f383656894e66f3304422030125f35e01c240b3eb30c3b45426f8ea6312cb8e","skillId":"deploy-script","state":"accepted"}],"objective":"Build a small token-plus-linear-vesting Foundry project, then a deployment script that takes every parameter from a JSON config and is proven against a local anvil. Nothing is ever broadcast to a public network.\n\nContracts (Solidity 0.8.26):\n- VestToken (src/VestToken.sol): plain ERC-20 'Vest Demo' / 'VDEMO', 18 decimals, no constructor arguments, mints 1,000,000,000 × 10^18 to msg.sender; no mint, burn or admin.\n- LinearVesting (src/LinearVesting.sol): constructor(address token, address beneficiary, uint64 start, uint64 cliffSeconds, uint64 durationSeconds) with non-zero token and beneficiary, durationSeconds > 0 and cliffSeconds ≤ durationSeconds. The allocation is whatever tokens it holds: total = balance + released. vestedAmount(uint64 t) = 0 if t < start + cliffSeconds, total if t ≥ start + durationSeconds, else floor(total × (t − start) / durationSeconds). release() is callable by anyone and transfers vestedAmount(now) − released to the beneficiary, reverting NothingToRelease when that is zero; released() view; event Released(amount). No owner, revoke or ETH. Unit tests: before the cliff, at the cliff, midway, at and after the end, an odd total, and tokens donated after start.\n\nDeployment script (script/Deploy.s.sol). foundry.toml is platform-protected and may not grant file-read permission, so the script reads the JSON text from the environment: vm.envString(\"DEPLOY_CONFIG\"), run as DEPLOY_CONFIG=\"$(cat config/deploy.json)\" forge script …, then vm.parseJson. Config shape: { \"chainId\": 31337, \"beneficiaries\": [ { \"account\": address, \"amount\": decimal string in token base units, \"start\": unix seconds, \"cliffSeconds\": n, \"durationSeconds\": n } ] }. Before deploying anything it reverts unless block.chainid == chainId, there are 1-20 beneficiaries, every account is non-zero and unique, every amount is positive and the amounts sum to at most the token supply. Under vm.startBroadcast() — the sender comes from the command line (--sender with anvil's --unlocked accounts, or --account), never from a key in the repository or config — it deploys VestToken, one LinearVesting per beneficiary, transfers each amount, logs every address, and asserts balances and parameters before stopping the broadcast. Ship config/deploy.json for anvil (anvil's default accounts 1-3 as beneficiaries) and config/deploy.example.json with placeholder addresses.\n\nProof: start anvil; run `DEPLOY_CONFIG=\"$(cat config/deploy.json)\" forge script script/Deploy.s.sol --rpc-url http://127.0.0.1:8545 --broadcast --unlocked --sender <anvil account 0>`; read the result back with cast (VDEMO balance of each vesting contract, its beneficiary and start); and show that a config with the wrong chainId, a duplicate beneficiary or an over-supply total reverts before any deployment. Record the commands and their output in script/README.md.","parentJobId":null,"planHash":"c3e4bbca3b03f89891c1fc9e6993a34e954362357b241252bdeab45821974931","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"2fdf837b-92ea-42f6-8c9d-a1cafdcac854","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-289-build-small-token-plus-linear-vesting-fo"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51340","feedbackHash":"fe6ddbc5687ce31dcc01db3d29ff624b8401b42c731a7e1219fbcfa18868faf3","nodeKey":"build_contract_project","submissionHash":"e5d2289b739105a6249c5a1fb2047145e6ce1aa0f5b85a787130e66428bb3247","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51198","feedbackHash":"55ca107db64e50f46da11a260d0f7b72bb81008301f50e958c388226cc4294c4","nodeKey":"deploy_script","submissionHash":"3fb847989f5929b1d0aee8843c18b427aa3a547954199a9d55200b24f7ba8ec8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51013","feedbackHash":"c418d86794f5ed6ad98623492358682c2eff39f16cf661cfb6624cea84eec18c","nodeKey":"deploy_script","submissionHash":"10db544abff5d3f4aaed5a5e86f06824bee1041f27f8258033ffaee46d427e4f","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"d142e4702b97de702bc7162fcd90debf425bd26f6ada517d1ad33ef5b9131edf","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"c2d8b01d6023dc25dbaa63fc1f676043128af47a23ea970674aafcec456f9e1e","device":"84a29c6575331b77","findings":[],"hash":"10db544abff5d3f4aaed5a5e86f06824bee1041f27f8258033ffaee46d427e4f","nodeId":"807ed020-8a19-435a-b6e6-0272aa162e4a","outcome":"completed","summary":"Implemented the deployment script, JSON fixtures, wiring tests, and documentation.\n\nVerified:\n- Offline build and all 70 tests pass.\n- Dry run succeeds without RPC.\n- Local Anvil deployment and `cast` readbacks match.\n- Invalid configs revert before deployment.\n\nCommands and output are in [script/README.md](/home/imd/.identitymd/work/2fdf837b-92ea-42f6-8c9d-a1cafdcac854/807ed020-8a19-435a-b6e6-0272aa162e4a/script/README.md).\n\nFixtures live under `script/config/` to comply with the permitted paths. No public network was used.","treeHash":"862d4c43c4d43ab00976c1e0fd4d5d646a51a0a8","usage":{"cachedInputTokens":1042944,"inputTokens":70457,"model":"gpt-6-astra","outputTokens":20002,"runtime":"codex","turns":6,"wallClockMs":654959}},{"artifacts":[],"attempt":2,"bundleHash":"ba91e303ba7cdb03a1ce4868afca65b9dda6c51dedb0305ce4d01dd186d1abd4","device":"29ea8835baa3dfe1","findings":[],"hash":"3fb847989f5929b1d0aee8843c18b427aa3a547954199a9d55200b24f7ba8ec8","nodeId":"807ed020-8a19-435a-b6e6-0272aa162e4a","outcome":"completed","summary":"Done. The deployment script, configs, tests and the anvil proof are in place, and `forge build` plus `forge test` pass locally with 79 tests and no failures.\n\n**Why the previous attempt failed, and the fix.** The selector `0xcdb6e4ac` the verifier rejected is `parseJsonArrayLength`, a cheatcode the verifier's older forge does not implement. The new script never calls it. It counts beneficiaries by probing `.beneficiaries[i]` with `keyExistsJson` until the first missing index, and otherwise uses only long-established cheatcodes: `envOr`, `parseJsonUint`, `parseJsonAddress`, `toString`, `readCallers`, `startBroadcast` and `stopBroadcast`. I confirmed with traces that these are the only cheatcodes the script emits.\n\n**What was delivered**\n\n- `script/Deploy.s.sol`: `run()` reads `DEPLOY_CONFIG` and falls back to a built-in copy of the anvil config. Parsing, validation and deployment are separate public functions so tests drive them in memory and never touch the environment. Every rule (chain id, 1 to 20 entries, non-zero unique accounts, positive amounts, total within supply, valid schedule, uint64 ranges) is checked before `startBroadcast`, and the wiring is re-read and asserted before `stopBroadcast`.\n- `script/config/deploy.json` for anvil accounts 1 to 3, and `script/config/deploy.example.json` with placeholder addresses. These live under `script/config/` rather than a top-level `config/` because that is the only allowed path for this assignment. Both READMEs say so.\n- `test/Deploy.t.sol`: 30 tests covering parsing, wiring, actual release to beneficiaries, and every rejection with a check that no transaction or contract was produced.\n- `script/README.md`: parameter table with defaults and the error each rule raises, exact dry-run and broadcast commands, and the recorded anvil transcript. The transcript shows the wrong chain id, duplicate beneficiary and over-supply configs reverting with nonce and block number unchanged, then the broadcast, then `cast` readbacks of each vault's balance, beneficiary and start.\n- Root `README.md`: file tree and deployment section updated with the commands and defaults.\n\n**Two things to know**\n\n- Forge 1.8 prints a cosmetic \"artifacts built from source files that no longer exist\" warning about its script preprocessor on every `forge script` run, even after `forge clean`. It is recorded and explained in the README rather than hidden.\n- The changes are left uncommitted in the working tree, since nothing was installed and the instructions only required committing installed dependencies. The temporary `broadcast/` directory from the proof was removed.","treeHash":"d546e0262d9e9521beb0e23ce195bb3436c1f3e7","usage":{"cachedInputTokens":2084890,"inputTokens":802,"model":"claude-fable-5-1","outputTokens":55768,"runtime":"claude","turns":26,"wallClockMs":672670}},{"artifacts":[],"attempt":1,"bundleHash":"d38ffc585ebd41945ef3dfaeb0c5c94e6f568baba054ae7a69e06f827730cc0b","device":"3b260b68e9ad6a37","findings":[],"hash":"e5d2289b739105a6249c5a1fb2047145e6ce1aa0f5b85a787130e66428bb3247","nodeId":"3f1f1787-b3d9-4695-a63e-c3100dbc837e","outcome":"completed","summary":"Done. The contracts and tests are committed on `main` as commit `2c70040`, and all three checks pass.\n\n**What was delivered**\n\n- `src/VestToken.sol`: self-contained fixed-supply ERC-20 (\"Vest Demo\" / \"VDEMO\", 18 decimals). It mints the whole supply to the deployer in the constructor and has no mint, burn, owner or other admin path.\n- `src/LinearVesting.sol`: ownerless single-beneficiary vault. The allocation is `balance + released`, so donations at any time join the curve. It vests nothing before the cliff, everything at the end, and a floored linear amount in between. Anyone can call `release()`, which reverts with `NothingToRelease` when nothing new has vested and with `TransferFailed` if the token returns false or reverts. No ETH, no revoke.\n- `test/VestToken.t.sol` and `test/LinearVesting.t.sol`: 49 tests in total, covering every schedule point in the spec (before cliff, at cliff, midway, at and after end, odd totals, donations after start) plus constructor validation, permissionless release, absence of admin entry points, misbehaving-token failures, and fuzzed monotonicity and conservation invariants.\n- `foundry.toml` pins `solc = \"0.8.26\"`, disables ffi and grants no filesystem permissions. `forge-std` 1.16.2 is vendored as plain files under `lib/` with no nested git metadata.\n- `README.md` documents the schedule semantics, assumptions (plain ERC-20 only, rounding down, irreversible donations, fixed beneficiary), the deployment config parameters and their constraints, and operational responsibilities.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| `forge build --offline` | clean, no warnings |\n| `forge test --offline` | 49 passed, 0 failed |\n| `forge fmt --check` | passes |\n\n**Out of scope for this assignment**\n\nThe deployment script, `config/deploy.json`, and the anvil proof in `script/README.md` belong to a separate assignment in this project. The root README already documents the config shape and constraints the script must enforce so the two pieces line up.\n\nOne leftover: `forge init` created a `.vscode/` folder that the sandbox would not let me delete. It is untracked and not part of the commit.","treeHash":"efde7b30e5f3903b39561984b0dd66ab1e930a46","usage":{"cachedInputTokens":916433,"inputTokens":770,"model":"claude-fable-5-1","outputTokens":25999,"runtime":"claude","turns":25,"wallClockMs":304594}}],"verification":[{"checks":[{"durationMs":1385,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.32s\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Deploy.t.sol:22:34\n   │\n22 │                 account: address(uint160(i + 1)),\n   │                                  ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' 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/VestToken.t.sol:79:9\n   │\n79 │         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/VestToken.t.sol:85:9\n   │\n85 │         token.transfer(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/VestToken.t.sol:108:9\n    │\n108 │         token.transferFrom(deployer, bob, 1e18);\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/Deploy.t.sol:24:24\n   │\n24 │                 start: uint64(1_800_000_000 + i),\n   │                        ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' 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/Deploy.t.sol:25:31\n   │\n25 │                 cliffSeconds: uint64(i * 10),\n   │                               ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' 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/LinearVesting.t.sol:29:9\n   │\n29 │         token.transfer(address(vesting), TOTAL);\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/LinearVesting.t.sol:39:9\n   │\n39 │         token.transfer(address(v), amount);\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/Deploy.t.sol:26:34\n   │\n26 │                 durationSeconds: uint64(360 days + i)\n   │                                  ━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' 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/VestToken.t.sol:117:9\n    │\n117 │         token.transferFrom(deployer, bob, 11);\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/VestToken.t.sol:125:9\n    │\n125 │         token.transferFrom(alice, 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/VestToken.t.sol:139:9\n    │\n139 │         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/LinearVesting.t.sol:242:9\n    │\n242 │         token.transfer(address(vesting), donation);\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/LinearVesting.t.sol:265:9\n    │\n265 │         token.transfer(address(vesting), 123);\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/LinearVesting.t.sol:274:9\n    │\n274 │         token.transfer(address(vesting), 1e18);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":117,"exitCode":1,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/VestToken.t.sol:VestTokenTest\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 45382, ~: 45697)\n[PASS] test_ApproveAndTransferFrom() (gas: 78801)\n[PASS] test_EmitsTransferFromZeroOnDeploy() (gas: 336410)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 72019)\n[PASS] test_Metadata() (gas: 12268)\n[PASS] test_MintsWholeSupplyToDeployer() (gas: 11641)\n[PASS] test_NoMintOrBurnEntryPoints() (gas: 19047)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 11429)\n[PASS] test_RevertWhen_TransferExceedsBalance() (gas: 16134)\n[PASS] test_RevertWhen_TransferFromExceedsAllowance() (gas: 42157)\n[PASS] test_RevertWhen_TransferFromExceedsBalance() (gas: 29915)\n[PASS] test_RevertWhen_TransferToZeroAddress() (gas: 11551)\n[PASS] test_Transfer() (gas: 47957)\n[PASS] test_TransferZeroAmount() (gas: 20690)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 5.83ms (6.53ms CPU time)\n\nRan 21 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_ConfiguredChainNeedNotBeAnvilChain() (gas: 806354)\nLogs:\n  Deployer 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken 0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n  Beneficiary 0x0000000000000000000000000000000000000001\n  Allocation 1000000000000000001\n  Start 1800000000\n\n[PASS] test_DeployWiresEveryContractAndLeavesRemainderWithSender() (gas: 1708611)\nLogs:\n  Deployer 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken 0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n  Beneficiary 0x0000000000000000000000000000000000000001\n  Allocation 1000000000000000001\n  Start 1800000000\n  LinearVesting 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3\n  Beneficiary 0x0000000000000000000000000000000000000002\n  Allocation 2000000000000000001\n  Start 1800000001\n  LinearVesting 0x50EEf481cae4250d252Ae577A09bF514f224C6C4\n  Beneficiary 0x0000000000000000000000000000000000000003\n  Allocation 3000000000000000001\n  Start 1800000002\n\n[PASS] test_OneBeneficiaryMayReceiveWholeSupply() (gas: 786323)\nLogs:\n  Deployer 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken 0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n  Beneficiary 0x0000000000000000000000000000000000000001\n  Allocation 1000000000000000000000000000\n  Start 1800000000\n\n[FAIL: Error != expected error: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version != InvalidBeneficiaryCount(0)] test_ParseEmptyArrayReverts() (gas: 10742)\n[FAIL: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version] test_ParseJSONAndDeployWithoutEnvironmentMutation() (gas: 11824)\n[FAIL: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version] test_ParseMaximumUint64Start() (gas: 11832)\n[FAIL: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version] test_ParseMultipleEntriesWithDifferentKeyOrders() (gas: 11514)\n[PASS] test_RejectAmountThatWouldOverflowNaiveSum() (gas: 21281)\n[PASS] test_RejectCliffBeyondDurationInLastEntry() (gas: 24676)\n[PASS] test_RejectCombinedOverSupplyByOne() (gas: 21476)\n[PASS] test_RejectEmptyBeneficiaries() (gas: 16320)\n[PASS] test_RejectMissingField() (gas: 12844)\n[PASS] test_RejectNonAdjacentDuplicate() (gas: 24102)\n[FAIL: Error != expected error: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version != InvalidAmountString(0)] test_RejectNonDecimalAmountStrings() (gas: 12984)\n[PASS] test_RejectTwentyOneBeneficiaries() (gas: 56504)\n[FAIL: Error != expected error: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version != TimeOutOfRange(0)] test_RejectUint64Truncation() (gas: 12393)\n[PASS] test_RejectWrongChain() (gas: 22135)\n[PASS] test_RejectZeroAccountInLastEntry() (gas: 23674)\n[PASS] test_RejectZeroAmountInLastEntry() (gas: 24094)\n[PASS] test_RejectZeroDurationInLastEntry() (gas: 24416)\n[PASS] test_TwentyBeneficiaries() (gas: 9441130)\nLogs:\n  Deployer 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken 0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n  Beneficiary 0x0000000000000000000000000000000000000001\n  Allocation 1000000000000000001\n  Start 1800000000\n  LinearVesting 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3\n  Beneficiary 0x0000000000000000000000000000000000000002\n  Allocation 2000000000000000001\n  Start 1800000001\n  LinearVesting 0x50EEf481cae4250d252Ae577A09bF514f224C6C4\n  Beneficiary 0x0000000000000000000000000000000000000003\n  Allocation 3000000000000000001\n  Start 1800000002\n  LinearVesting 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809\n  Beneficiary 0x0000000000000000000000000000000000000004\n  Allocation 4000000000000000001\n  Start 1800000003\n  LinearVesting 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351\n  Beneficiary 0x0000000000000000000000000000000000000005\n  Allocation 5000000000000000001\n  Start 1800000004\n  LinearVesting 0xd21060559c9beb54fC07aFd6151aDf6cFCDDCAeB\n  Beneficiary 0x0000000000000000000000000000000000000006\n  Allocation 6000000000000000001\n  Start 1800000005\n  LinearVesting 0x978e3286EB805934215a88694d80b09aDed68D90\n  Beneficiary 0x0000000000000000000000000000000000000007\n  Allocation 7000000000000000001\n  Start 1800000006\n  LinearVesting 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4\n  Beneficiary 0x0000000000000000000000000000000000000008\n  Allocation 8000000000000000001\n  Start 1800000007\n  LinearVesting 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D\n  Beneficiary 0x0000000000000000000000000000000000000009\n  Allocation 9000000000000000001\n  Start 1800000008\n  LinearVesting 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB\n  Beneficiary 0x000000000000000000000000000000000000000A\n  Allocation 10000000000000000001\n  Start 1800000009\n  LinearVesting 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d\n  Beneficiary 0x000000000000000000000000000000000000000b\n  Allocation 11000000000000000001\n  Start 1800000010\n  LinearVesting 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92\n  Beneficiary 0x000000000000000000000000000000000000000C\n  Allocation 12000000000000000001\n  Start 1800000011\n  LinearVesting 0x970670459734a83899773A0fd45941B5afC1200e\n  Beneficiary 0x000000000000000000000000000000000000000d\n  Allocation 13000000000000000001\n  Start 1800000012\n  LinearVesting 0xcae746B46013Bf4D43B8E2B9e98F9DBE2461532A\n  Beneficiary 0x000000000000000000000000000000000000000E\n  Allocation 14000000000000000001\n  Start 1800000013\n  LinearVesting 0x347f7f488cD7d60fc2F2Fa0741B5Cf121c03d902\n  Beneficiary 0x000000000000000000000000000000000000000F\n  Allocation 15000000000000000001\n  Start 1800000014\n  LinearVesting 0xD11f9396c36BBedcaa6242dB32e08164097F1622\n  Beneficiary 0x0000000000000000000000000000000000000010\n  Allocation 16000000000000000001\n  Start 1800000015\n  LinearVesting 0xE03975C050344587186Aa11d78F1f8765A278Ab1\n  Beneficiary 0x0000000000000000000000000000000000000011\n  Allocation 17000000000000000001\n  Start 1800000016\n  LinearVesting 0xA51e039acaeF798a3d42583ec3110baBe8B8666F\n  Beneficiary 0x0000000000000000000000000000000000000012\n  Allocation 18000000000000000001\n  Start 1800000017\n  LinearVesting 0xd510Ea3A752c1BaA72Bb30FBa1bF50bE22fBE6cF\n  Beneficiary 0x0000000000000000000000000000000000000013\n  Allocation 19000000000000000001\n  Start 1800000018\n  LinearVesting 0x77443101F739bf8b771B96a7DD92E89088379D1F\n  Beneficiary 0x0000000000000000000000000000000000000014\n  Allocation 20000000000000000001\n  Start 1800000019\n\nSuite result: FAILED. 15 passed; 6 failed; 0 skipped; finished in 37.05ms (7.69ms CPU time)\n\nRan 35 tests for test/LinearVesting.t.sol:LinearVestingTest\n[PASS] testFuzz_ReleasesNeverExceedVestedAndSumToTotal(uint64,uint64,uint64) (runs: 256, μ: 121447, ~: 123485)\n[PASS] testFuzz_Schedule(uint64,uint64,uint64,uint96,uint64) (runs: 256, μ: 454040, ~: 454045)\n[PASS] testFuzz_VestedNeverExceedsTotalAndIsMonotone(uint64,uint64) (runs: 256, μ: 16213, ~: 16207)\n[PASS] test_AfterEnd_EverythingVested_NoOverRelease() (gas: 75238)\n[PASS] test_AnyoneCanRelease_FundsGoToBeneficiary() (gas: 72595)\n[PASS] test_AtCliff_LinearPortionVestsAtOnce() (gas: 82782)\n[PASS] test_AtEnd_EverythingVested() (gas: 74053)\n[PASS] test_BeforeCliff_NothingVested() (gas: 31903)\n[PASS] test_BeforeStart_NothingVested() (gas: 23133)\n[PASS] test_CliffEqualsDuration_AllOrNothing() (gas: 488209)\n[PASS] test_Constructor_AllowsCliffEqualToDuration() (gas: 410338)\n[PASS] test_Constructor_StoresParameters() (gas: 24469)\n[PASS] test_DonationAfterEnd_IsFullyReleasable() (gas: 90279)\n[PASS] test_DonationAfterStart_JoinsScheduleImmediately() (gas: 106022)\n[PASS] test_DonationBeforeCliff_StillLocked() (gas: 35268)\n[PASS] test_EmptyContract_NothingToRelease() (gas: 425806)\n[PASS] test_MaxTimestamps_DoNotOverflow() (gas: 418929)\n[PASS] test_Midway_HalfVested() (gas: 14053)\n[PASS] test_Midway_ReleaseThenReleaseAgainLater() (gas: 89527)\n[PASS] test_Midway_TotalAllocationUnchangedByRelease() (gas: 71001)\n[PASS] test_NoAdminEntryPoints() (gas: 11326)\n[PASS] test_NoEth() (gas: 17622)\n[PASS] test_NoReturnToken_IsAccepted() (gas: 595659)\n[PASS] test_OddTotal_RoundsDownAndSettlesAtEnd() (gas: 509891)\n[PASS] test_OddTotal_SevenOverTen_FloorEveryStep() (gas: 478944)\n[PASS] test_OddTotal_TinyAllocationNothingUntilItRoundsUp() (gas: 486497)\n[PASS] test_PartialThenFinalRelease_SumsToTotal() (gas: 85810)\n[PASS] test_RevertWhen_BeneficiaryIsZero() (gas: 39149)\n[PASS] test_RevertWhen_CliffExceedsDuration() (gas: 41440)\n[PASS] test_RevertWhen_DurationIsZero() (gas: 41181)\n[PASS] test_RevertWhen_TokenIsZero() (gas: 39028)\n[PASS] test_RevertWhen_TokenReturnsFalse() (gas: 578233)\n[PASS] test_RevertWhen_TokenReverts() (gas: 585936)\n[PASS] test_StartInThePast_VestsImmediately() (gas: 482780)\n[PASS] test_ZeroCliff_VestsFromStart() (gas: 507626)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 37.10ms (53.31ms CPU time)\n\nRan 3 test suites in 38.23ms (79.99ms CPU time): 64 tests passed, 6 failed, 0 skipped (70 total tests)\n\nFailing tests:\nEncountered 6 failing tests in test/Deploy.t.sol:DeployTest\n[FAIL: Error != expected error: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version != InvalidBeneficiaryCount(0)] test_ParseEmptyArrayReverts() (gas: 10742)\n[FAIL: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version] test_ParseJSONAndDeployWithoutEnvironmentMutation() (gas: 11824)\n[FAIL: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version] test_ParseMaximumUint64Start() (gas: 11832)\n[FAIL: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version] test_ParseMultipleEntriesWithDifferentKeyOrders() (gas: 11514)\n[FAIL: Error != expected error: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version != InvalidAmountString(0)] test_RejectNonDecimalAmountStrings() (gas: 12984)\n[FAIL: Error != expected error: unknown cheatcode with selector 0xcdb6e4ac; you may have a mismatch between the `Vm` interface (likely in `forge-std`) and the `forge` version != TimeOutOfRange(0)] test_RejectUint64Truncation() (gas: 12393)\n\nEncountered a total of 6 failing tests, 64 tests succeeded\n\nTip: Run `forge test --rerun` to retry only the 6 failed tests\n","passed":false}],"detail":"test failed with exit code 1","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"10db544abff5d3f4aaed5a5e86f06824bee1041f27f8258033ffaee46d427e4f","verifiedTreeHash":"862d4c43c4d43ab00976c1e0fd4d5d646a51a0a8","verifierVersion":"0.1.0+ff982c0f"},{"checks":[{"durationMs":1653,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.59s\nCompiler run successful!\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/VestToken.t.sol:79:9\n   │\n79 │         token.transfer(bob, 1);\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    ╭▸ script/Deploy.s.sol:135:16\n    │\n135 │         return uint64(value);\n    │                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/VestToken.t.sol:85:9\n   │\n85 │         token.transfer(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/VestToken.t.sol:108:9\n    │\n108 │         token.transferFrom(deployer, bob, 1e18);\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    ╭▸ script/Deploy.s.sol:192:13\n    │\n192 │             token.transfer(address(vestings[i]), b.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/VestToken.t.sol:117:9\n    │\n117 │         token.transferFrom(deployer, bob, 11);\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/Deploy.t.sol:44:25\n   │\n44 │                 address(uint160(0x1000 + i)), (i + 1) * 1_000e18 + 1, uint64(1_800_000_000 + i), 30 days, 360 days\n   │                         ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' 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/VestToken.t.sol:125:9\n    │\n125 │         token.transferFrom(alice, 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/LinearVesting.t.sol:29:9\n   │\n29 │         token.transfer(address(vesting), TOTAL);\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/VestToken.t.sol:139:9\n    │\n139 │         token.transfer(alice, amount);\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/Deploy.t.sol:44:71\n   │\n44 │                 address(uint160(0x1000 + i)), (i + 1) * 1_000e18 + 1, uint64(1_800_000_000 + i), 30 days, 360 days\n   │                                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' 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/LinearVesting.t.sol:39:9\n   │\n39 │         token.transfer(address(v), 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/LinearVesting.t.sol:242:9\n    │\n242 │         token.transfer(address(vesting), donation);\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/LinearVesting.t.sol:265:9\n    │\n265 │         token.transfer(address(vesting), 123);\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/LinearVesting.t.sol:274:9\n    │\n274 │         token.transfer(address(vesting), 1e18);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":95,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/VestToken.t.sol:VestTokenTest\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 45693, ~: 45697)\n[PASS] test_ApproveAndTransferFrom() (gas: 78801)\n[PASS] test_EmitsTransferFromZeroOnDeploy() (gas: 336410)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 72019)\n[PASS] test_Metadata() (gas: 12268)\n[PASS] test_MintsWholeSupplyToDeployer() (gas: 11641)\n[PASS] test_NoMintOrBurnEntryPoints() (gas: 19047)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 11429)\n[PASS] test_RevertWhen_TransferExceedsBalance() (gas: 16134)\n[PASS] test_RevertWhen_TransferFromExceedsAllowance() (gas: 42157)\n[PASS] test_RevertWhen_TransferFromExceedsBalance() (gas: 29915)\n[PASS] test_RevertWhen_TransferToZeroAddress() (gas: 11551)\n[PASS] test_Transfer() (gas: 47957)\n[PASS] test_TransferZeroAmount() (gas: 20690)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 5.68ms (6.95ms CPU time)\n\nRan 30 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_DefaultConfig_MatchesShippedAnvilConfig() (gas: 67466)\n[PASS] test_DeployFromJson_RejectsEmptyArrayBeforeDeploying() (gas: 16237)\n[PASS] test_DeployFromJson_RejectsWrongChainIdBeforeDeploying() (gas: 30465)\n[PASS] test_DeployFromJson_WiresEveryContract() (gas: 1820031)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x70997970C51812dc3A010C7d01b50e0d17dc79C8\n    amount          100000000000000000000000000\n    start           1800000000\n    cliffSeconds    7776000\n    durationSeconds 31536000\n  LinearVesting 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3\n    beneficiary     0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC\n    amount          50000000000000000000000001\n    start           1800000001\n    cliffSeconds    15552000\n    durationSeconds 63072000\n  LinearVesting 0x50EEf481cae4250d252Ae577A09bF514f224C6C4\n    beneficiary     0x90F79bf6EB2c4f870365E785982E1f101E93b906\n    amount          25000000000000000000000000\n    start           1800000002\n    cliffSeconds    0\n    durationSeconds 7776000\n  Unallocated supply left with deployer 824999999999999999999999999\n\n[PASS] test_Deploy_AcceptsTwentyBeneficiaries() (gas: 9319737)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x0000000000000000000000000000000000001000\n    amount          1000000000000000000001\n    start           1800000000\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3\n    beneficiary     0x0000000000000000000000000000000000001001\n    amount          2000000000000000000001\n    start           1800000001\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x50EEf481cae4250d252Ae577A09bF514f224C6C4\n    beneficiary     0x0000000000000000000000000000000000001002\n    amount          3000000000000000000001\n    start           1800000002\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809\n    beneficiary     0x0000000000000000000000000000000000001003\n    amount          4000000000000000000001\n    start           1800000003\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351\n    beneficiary     0x0000000000000000000000000000000000001004\n    amount          5000000000000000000001\n    start           1800000004\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xd21060559c9beb54fC07aFd6151aDf6cFCDDCAeB\n    beneficiary     0x0000000000000000000000000000000000001005\n    amount          6000000000000000000001\n    start           1800000005\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x978e3286EB805934215a88694d80b09aDed68D90\n    beneficiary     0x0000000000000000000000000000000000001006\n    amount          7000000000000000000001\n    start           1800000006\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4\n    beneficiary     0x0000000000000000000000000000000000001007\n    amount          8000000000000000000001\n    start           1800000007\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D\n    beneficiary     0x0000000000000000000000000000000000001008\n    amount          9000000000000000000001\n    start           1800000008\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB\n    beneficiary     0x0000000000000000000000000000000000001009\n    amount          10000000000000000000001\n    start           1800000009\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d\n    beneficiary     0x000000000000000000000000000000000000100A\n    amount          11000000000000000000001\n    start           1800000010\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92\n    beneficiary     0x000000000000000000000000000000000000100b\n    amount          12000000000000000000001\n    start           1800000011\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x970670459734a83899773A0fd45941B5afC1200e\n    beneficiary     0x000000000000000000000000000000000000100C\n    amount          13000000000000000000001\n    start           1800000012\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xcae746B46013Bf4D43B8E2B9e98F9DBE2461532A\n    beneficiary     0x000000000000000000000000000000000000100D\n    amount          14000000000000000000001\n    start           1800000013\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x347f7f488cD7d60fc2F2Fa0741B5Cf121c03d902\n    beneficiary     0x000000000000000000000000000000000000100e\n    amount          15000000000000000000001\n    start           1800000014\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xD11f9396c36BBedcaa6242dB32e08164097F1622\n    beneficiary     0x000000000000000000000000000000000000100f\n    amount          16000000000000000000001\n    start           1800000015\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xE03975C050344587186Aa11d78F1f8765A278Ab1\n    beneficiary     0x0000000000000000000000000000000000001010\n    amount          17000000000000000000001\n    start           1800000016\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xA51e039acaeF798a3d42583ec3110baBe8B8666F\n    beneficiary     0x0000000000000000000000000000000000001011\n    amount          18000000000000000000001\n    start           1800000017\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xd510Ea3A752c1BaA72Bb30FBa1bF50bE22fBE6cF\n    beneficiary     0x0000000000000000000000000000000000001012\n    amount          19000000000000000000001\n    start           1800000018\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0x77443101F739bf8b771B96a7DD92E89088379D1F\n    beneficiary     0x0000000000000000000000000000000000001013\n    amount          20000000000000000000001\n    start           1800000019\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  Unallocated supply left with deployer 999789999999999999999999980\n\n[PASS] test_Deploy_CliffEqualToDurationIsAllowed() (gas: 796493)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x0000000000000000000000000000000000001000\n    amount          1000000000000000000001\n    start           1800000000\n    cliffSeconds    31104000\n    durationSeconds 31104000\n  Unallocated supply left with deployer 999998999999999999999999999\n\n[PASS] test_Deploy_ConfiguredChainNeedNotBeAnvil() (gas: 796816)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x0000000000000000000000000000000000001000\n    amount          1000000000000000000001\n    start           1800000000\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  Unallocated supply left with deployer 999998999999999999999999999\n\n[PASS] test_Deploy_OneBeneficiaryMayReceiveWholeSupply() (gas: 777647)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x0000000000000000000000000000000000001000\n    amount          1000000000000000000000000000\n    start           1800000000\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  Unallocated supply left with deployer 0\n\n[PASS] test_Deploy_RejectsAmountThatWouldOverflowNaiveSum() (gas: 28655)\n[PASS] test_Deploy_RejectsCliffLongerThanDuration() (gas: 27090)\n[PASS] test_Deploy_RejectsDuplicateAccount() (gas: 30982)\n[PASS] test_Deploy_RejectsSingleAmountAboveSupply() (gas: 23972)\n[PASS] test_Deploy_RejectsTotalAboveSupply() (gas: 28897)\n[PASS] test_Deploy_RejectsTwentyOneBeneficiaries() (gas: 77611)\n[PASS] test_Deploy_RejectsWrongChainId() (gas: 21873)\n[PASS] test_Deploy_RejectsZeroAccount() (gas: 28981)\n[PASS] test_Deploy_RejectsZeroAmount() (gas: 26683)\n[PASS] test_Deploy_RejectsZeroBeneficiaries() (gas: 19058)\n[PASS] test_Deploy_RejectsZeroDuration() (gas: 22697)\n[PASS] test_Deploy_UsesTheBroadcasterAsDeployer() (gas: 801662)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x0000000000000000000000000000000000001000\n    amount          1000000000000000000001\n    start           1800000000\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  Unallocated supply left with deployer 999998999999999999999999999\n\n[PASS] test_Deploy_VaultsReleaseToTheirBeneficiaries() (gas: 1312665)\nLogs:\n  Deployer   0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38\n  VestToken  0x34A1D3fff3958843C43aD80F30b94c510645C316\n  LinearVesting 0x90193C961A926261B756D1E5bb255e67ff9498A1\n    beneficiary     0x0000000000000000000000000000000000001000\n    amount          1000000000000000000001\n    start           1800000000\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  LinearVesting 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3\n    beneficiary     0x0000000000000000000000000000000000001001\n    amount          2000000000000000000001\n    start           1800000001\n    cliffSeconds    2592000\n    durationSeconds 31104000\n  Unallocated supply left with deployer 999996999999999999999999998\n\n[PASS] test_ParseConfig_AcceptsAmountAsJsonNumber() (gas: 28134)\n[PASS] test_ParseConfig_AcceptsMaximumUint64Start() (gas: 28639)\n[PASS] test_ParseConfig_EmptyArrayYieldsNoEntries() (gas: 13656)\n[PASS] test_ParseConfig_ReadsEveryFieldRegardlessOfKeyOrder() (gas: 59669)\n[PASS] test_ParseConfig_RevertsWhenAnEntryLacksAField() (gas: 26328)\n[PASS] test_ParseConfig_RevertsWhenBeneficiariesMissing() (gas: 13049)\n[PASS] test_ParseConfig_RevertsWhenChainIdMissing() (gas: 12307)\n[PASS] test_ParseConfig_RevertsWhenDurationExceedsUint64() (gas: 29533)\n[PASS] test_ParseConfig_RevertsWhenStartExceedsUint64() (gas: 25105)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 22.21ms (10.30ms CPU time)\n\nRan 35 tests for test/LinearVesting.t.sol:LinearVestingTest\n[PASS] testFuzz_ReleasesNeverExceedVestedAndSumToTotal(uint64,uint64,uint64) (runs: 256, μ: 121288, ~: 123485)\n[PASS] testFuzz_Schedule(uint64,uint64,uint64,uint96,uint64) (runs: 256, μ: 454014, ~: 453882)\n[PASS] testFuzz_VestedNeverExceedsTotalAndIsMonotone(uint64,uint64) (runs: 256, μ: 16213, ~: 16207)\n[PASS] test_AfterEnd_EverythingVested_NoOverRelease() (gas: 75238)\n[PASS] test_AnyoneCanRelease_FundsGoToBeneficiary() (gas: 72595)\n[PASS] test_AtCliff_LinearPortionVestsAtOnce() (gas: 82782)\n[PASS] test_AtEnd_EverythingVested() (gas: 74053)\n[PASS] test_BeforeCliff_NothingVested() (gas: 31903)\n[PASS] test_BeforeStart_NothingVested() (gas: 23133)\n[PASS] test_CliffEqualsDuration_AllOrNothing() (gas: 488209)\n[PASS] test_Constructor_AllowsCliffEqualToDuration() (gas: 410338)\n[PASS] test_Constructor_StoresParameters() (gas: 24469)\n[PASS] test_DonationAfterEnd_IsFullyReleasable() (gas: 90279)\n[PASS] test_DonationAfterStart_JoinsScheduleImmediately() (gas: 106022)\n[PASS] test_DonationBeforeCliff_StillLocked() (gas: 35268)\n[PASS] test_EmptyContract_NothingToRelease() (gas: 425806)\n[PASS] test_MaxTimestamps_DoNotOverflow() (gas: 418929)\n[PASS] test_Midway_HalfVested() (gas: 14053)\n[PASS] test_Midway_ReleaseThenReleaseAgainLater() (gas: 89527)\n[PASS] test_Midway_TotalAllocationUnchangedByRelease() (gas: 71001)\n[PASS] test_NoAdminEntryPoints() (gas: 11326)\n[PASS] test_NoEth() (gas: 17622)\n[PASS] test_NoReturnToken_IsAccepted() (gas: 595659)\n[PASS] test_OddTotal_RoundsDownAndSettlesAtEnd() (gas: 509891)\n[PASS] test_OddTotal_SevenOverTen_FloorEveryStep() (gas: 478944)\n[PASS] test_OddTotal_TinyAllocationNothingUntilItRoundsUp() (gas: 486497)\n[PASS] test_PartialThenFinalRelease_SumsToTotal() (gas: 85810)\n[PASS] test_RevertWhen_BeneficiaryIsZero() (gas: 39149)\n[PASS] test_RevertWhen_CliffExceedsDuration() (gas: 41440)\n[PASS] test_RevertWhen_DurationIsZero() (gas: 41181)\n[PASS] test_RevertWhen_TokenIsZero() (gas: 39028)\n[PASS] test_RevertWhen_TokenReturnsFalse() (gas: 578233)\n[PASS] test_RevertWhen_TokenReverts() (gas: 585936)\n[PASS] test_StartInThePast_VestsImmediately() (gas: 482780)\n[PASS] test_ZeroCliff_VestsFromStart() (gas: 507626)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 22.21ms (41.89ms CPU time)\n\nRan 3 test suites in 23.44ms (50.10ms CPU time): 79 tests passed, 0 failed, 0 skipped (79 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3fb847989f5929b1d0aee8843c18b427aa3a547954199a9d55200b24f7ba8ec8","verifiedTreeHash":"d546e0262d9e9521beb0e23ce195bb3436c1f3e7","verifierVersion":"0.1.0+ff982c0f"},{"checks":[{"durationMs":1109,"exitCode":0,"name":"build","output":"Compiling 25 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.02s\nCompiler run successful!\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/VestToken.t.sol:79:9\n   │\n79 │         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/VestToken.t.sol:85:9\n   │\n85 │         token.transfer(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/LinearVesting.t.sol:29:9\n   │\n29 │         token.transfer(address(vesting), TOTAL);\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/LinearVesting.t.sol:39:9\n   │\n39 │         token.transfer(address(v), 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/VestToken.t.sol:108:9\n    │\n108 │         token.transferFrom(deployer, bob, 1e18);\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/VestToken.t.sol:117:9\n    │\n117 │         token.transferFrom(deployer, bob, 11);\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/VestToken.t.sol:125:9\n    │\n125 │         token.transferFrom(alice, 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/LinearVesting.t.sol:242:9\n    │\n242 │         token.transfer(address(vesting), donation);\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/VestToken.t.sol:139:9\n    │\n139 │         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/LinearVesting.t.sol:265:9\n    │\n265 │         token.transfer(address(vesting), 123);\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/LinearVesting.t.sol:274:9\n    │\n274 │         token.transfer(address(vesting), 1e18);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":103,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/VestToken.t.sol:VestTokenTest\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 45489, ~: 45697)\n[PASS] test_ApproveAndTransferFrom() (gas: 78801)\n[PASS] test_EmitsTransferFromZeroOnDeploy() (gas: 336410)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 72019)\n[PASS] test_Metadata() (gas: 12268)\n[PASS] test_MintsWholeSupplyToDeployer() (gas: 11641)\n[PASS] test_NoMintOrBurnEntryPoints() (gas: 19047)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 11429)\n[PASS] test_RevertWhen_TransferExceedsBalance() (gas: 16134)\n[PASS] test_RevertWhen_TransferFromExceedsAllowance() (gas: 42157)\n[PASS] test_RevertWhen_TransferFromExceedsBalance() (gas: 29915)\n[PASS] test_RevertWhen_TransferToZeroAddress() (gas: 11551)\n[PASS] test_Transfer() (gas: 47957)\n[PASS] test_TransferZeroAmount() (gas: 20690)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 4.96ms (7.15ms CPU time)\n\nRan 35 tests for test/LinearVesting.t.sol:LinearVestingTest\n[PASS] testFuzz_ReleasesNeverExceedVestedAndSumToTotal(uint64,uint64,uint64) (runs: 256, μ: 121809, ~: 123485)\n[PASS] testFuzz_Schedule(uint64,uint64,uint64,uint96,uint64) (runs: 256, μ: 454023, ~: 453989)\n[PASS] testFuzz_VestedNeverExceedsTotalAndIsMonotone(uint64,uint64) (runs: 256, μ: 16209, ~: 16207)\n[PASS] test_AfterEnd_EverythingVested_NoOverRelease() (gas: 75238)\n[PASS] test_AnyoneCanRelease_FundsGoToBeneficiary() (gas: 72595)\n[PASS] test_AtCliff_LinearPortionVestsAtOnce() (gas: 82782)\n[PASS] test_AtEnd_EverythingVested() (gas: 74053)\n[PASS] test_BeforeCliff_NothingVested() (gas: 31903)\n[PASS] test_BeforeStart_NothingVested() (gas: 23133)\n[PASS] test_CliffEqualsDuration_AllOrNothing() (gas: 488209)\n[PASS] test_Constructor_AllowsCliffEqualToDuration() (gas: 410338)\n[PASS] test_Constructor_StoresParameters() (gas: 24469)\n[PASS] test_DonationAfterEnd_IsFullyReleasable() (gas: 90279)\n[PASS] test_DonationAfterStart_JoinsScheduleImmediately() (gas: 106022)\n[PASS] test_DonationBeforeCliff_StillLocked() (gas: 35268)\n[PASS] test_EmptyContract_NothingToRelease() (gas: 425806)\n[PASS] test_MaxTimestamps_DoNotOverflow() (gas: 418929)\n[PASS] test_Midway_HalfVested() (gas: 14053)\n[PASS] test_Midway_ReleaseThenReleaseAgainLater() (gas: 89527)\n[PASS] test_Midway_TotalAllocationUnchangedByRelease() (gas: 71001)\n[PASS] test_NoAdminEntryPoints() (gas: 11326)\n[PASS] test_NoEth() (gas: 17622)\n[PASS] test_NoReturnToken_IsAccepted() (gas: 595659)\n[PASS] test_OddTotal_RoundsDownAndSettlesAtEnd() (gas: 509891)\n[PASS] test_OddTotal_SevenOverTen_FloorEveryStep() (gas: 478944)\n[PASS] test_OddTotal_TinyAllocationNothingUntilItRoundsUp() (gas: 486497)\n[PASS] test_PartialThenFinalRelease_SumsToTotal() (gas: 85810)\n[PASS] test_RevertWhen_BeneficiaryIsZero() (gas: 39149)\n[PASS] test_RevertWhen_CliffExceedsDuration() (gas: 41440)\n[PASS] test_RevertWhen_DurationIsZero() (gas: 41181)\n[PASS] test_RevertWhen_TokenIsZero() (gas: 39028)\n[PASS] test_RevertWhen_TokenReturnsFalse() (gas: 578233)\n[PASS] test_RevertWhen_TokenReverts() (gas: 585936)\n[PASS] test_StartInThePast_VestsImmediately() (gas: 482780)\n[PASS] test_ZeroCliff_VestsFromStart() (gas: 507626)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 15.86ms (36.31ms CPU time)\n\nRan 2 test suites in 16.69ms (20.82ms CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e5d2289b739105a6249c5a1fb2047145e6ce1aa0f5b85a787130e66428bb3247","verifiedTreeHash":"efde7b30e5f3903b39561984b0dd66ab1e930a46","verifierVersion":"0.1.0+ff982c0f"}]}