{"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":"cf0121f7-0c85-475c-8a47-dff8fa323931","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"0ceb1d2b763d852dae968d1264e66a764a04f75f8523334338551e637b413901","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":"ba38d60795e35cafe9491e7b2357422b3d2103dd6095ffc005805f3725607584","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":"93360aa582af8e86370dfaf7cec64416c7dd41c4b24a749f78ccaf4fe4c1f73c","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":"e96ed563939bf07f28cbf4b6502481c2446c120c4b9f2195e842f1d1291a0642","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":"65715ac20852d716278667a308246df35512649246873c54b2a7172bc53f2f19","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":"390232ceb77656107b1be125268cd63dfd59c83d132250fe1051e6275b5fffa3","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"3ef1cca8cab1b3cc9c7e670b122b341532f87ba2d3426fb4667a598bc8a3891a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"01289fd78321f02d22535d9095df58162883ffd2109f7e951108d4a4b15f1491","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: vault (VAULT).\nToken name: vault\nToken symbol: VAULT\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"a61a2e5faa8c6100fe4631792b7b8e36e20557c717f57c84892951493379f8d4","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"cf0121f7-0c85-475c-8a47-dff8fa323931","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2493-vault"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"54230","feedbackHash":"d26c9028a6f924edaba0be0e017a5c16ce4199a5953c894d4d0ff420ef0c6f2e","nodeKey":"audit_economics","submissionHash":"0ceb1d2b763d852dae968d1264e66a764a04f75f8523334338551e637b413901","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54229","feedbackHash":"48c3e66421558d0b94c47d9d245e654c29a52ea8975207db37452ae43876d61c","nodeKey":"audit_flow","submissionHash":"ba38d60795e35cafe9491e7b2357422b3d2103dd6095ffc005805f3725607584","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52258","feedbackHash":"9171d1dbd5361c153fc2124a61bf4e4a7c7c7160b74fc46bb40b333c104eccde","nodeKey":"audit_judge","submissionHash":"93360aa582af8e86370dfaf7cec64416c7dd41c4b24a749f78ccaf4fe4c1f73c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52611","feedbackHash":"572453b9a5546fe96417cb38662a903dd882a06f2d6d2682d5ab473322668fee","nodeKey":"audit_math","submissionHash":"e96ed563939bf07f28cbf4b6502481c2446c120c4b9f2195e842f1d1291a0642","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50904","feedbackHash":"2f714b45ac5f4de8a76579834fcceeb2eb12fdf4bc410b2f4f65983ec545ee4f","nodeKey":"audit_permissions","submissionHash":"65715ac20852d716278667a308246df35512649246873c54b2a7172bc53f2f19","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51377","feedbackHash":"77458cf024c6400d2a588c88e746a045b092744873c934e47f08bfad6dca8637","nodeKey":"build_contract_project","submissionHash":"390232ceb77656107b1be125268cd63dfd59c83d132250fe1051e6275b5fffa3","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52666","feedbackHash":"3513b28f0311db36d5113b39f96a73e91332b1e3c4ddb9a9c17eb8f7134ff2e1","nodeKey":"manifest","submissionHash":"3ef1cca8cab1b3cc9c7e670b122b341532f87ba2d3426fb4667a598bc8a3891a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52468","feedbackHash":"3ebe9db020046e4fba516c58d7deea7a04ea5b7508a7042c8c658804dd818328","nodeKey":"write_foundry_tests","submissionHash":"01289fd78321f02d22535d9095df58162883ffd2109f7e951108d4a4b15f1491","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c8574ae7520b9beb0197766e36611efa1e966a29fd98b65e603b3d14ca0deea7","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"f831a951113fef7f44b6ca84b6b943fcfecd6951f91a401c28291a5825220077","device":"c9743cd9807c4c3a","findings":[],"hash":"01289fd78321f02d22535d9095df58162883ffd2109f7e951108d4a4b15f1491","nodeId":"3a884e69-f5a4-4a49-9f93-9dc615232049","outcome":"completed","summary":"I added a new test file, `test/VaultToken.adversarial.t.sol`, and found no defects in the token. The full suite passes with the verifier's fuzz seed: 43 tests in 4 suites, none failing or skipped. I wrote no `.imd-findings.json` because there is nothing to report.\n\n**The token:** `src/VaultToken.sol` is a plain OpenZeppelin ERC-20. It has no owner and no admin functions; it mints 1,000,000,000 × 10¹⁸ once in the constructor to whoever deploys it, and has no transfer fee or hooks. The tests already in the tree (30 unit and fuzz tests plus one invariant suite) were thorough, so I left them unchanged.\n\n**What the new file adds:**\n- **Invariant test over random call sequences** (256 runs × 64 calls, set in the file itself). Normal transfers, approvals and spends are mixed with calls that must fail:\n  - spending more than the balance or a limited allowance;\n  - sending to the zero address, directly or through an allowance;\n  - approving the zero address as spender;\n  - sending ETH;\n  - calling functions the token doesn't have, using random selectors.\n\n  Every rejected call must revert with the exact OpenZeppelin error. After every call the tests check that:\n  - balances and allowances match a separate model the handler keeps;\n  - the five holders together still hold exactly the full supply, and total supply never changes;\n  - the zero address, the token itself and the handler hold nothing;\n  - none of the rejected calls ever succeeded, and the token holds no ETH;\n  - name, symbol and decimals never change.\n- **Fuzz tests** (1,000 runs each):\n  - someone without an allowance can't move another holder's tokens;\n  - `approve` never changes any balance;\n  - sending tokens out and back restores both balances;\n  - two transfers add up to the same as one;\n  - a recipient can't spend more than it received.\n- **Edge-case unit tests:**\n  - transferring the maximum uint256 value reverts;\n  - an unlimited allowance still can't move one wei more than the supply;\n  - an allowance of max − 1 does go down when spent;\n  - ETH is refused, with or without calldata;\n  - there is no `permit` path.\n- **Bytecode check:** the deployed code contains no `DELEGATECALL`, `CALLCODE` or `SELFDESTRUCT`. A separate check showed this scan reads 1,740 of the 1,753 bytes and stops only at the trailing metadata, so it isn't passing by checking nothing.\n\n**Not committed:** the file is staged but not committed, because this machine has no git author identity set up and changing git configuration is outside what I'm allowed to touch. It needs to be committed by the process that collects the work. Nothing outside `test/` was changed and nothing was installed.","treeHash":"b96c854d19a1f77addf8d22cdaf380e105f155dc","usage":{"cachedInputTokens":405270,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":11293,"runtime":"claude","turns":10,"wallClockMs":124653}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"aa333626543c4dee","findings":[],"hash":"0ceb1d2b763d852dae968d1264e66a764a04f75f8523334338551e637b413901","nodeId":"edd2cefb-37a4-4c4b-91f7-4c5d8d4fd563","outcome":"completed","summary":"The review is complete and the findings file is written. No defects were found in the assigned area.\n\n**Result:** `.imd-findings.json` holds an empty findings list and eight coverage rows, one for each listed entry point plus the invariants and flows I checked. All three entry points are marked `holds`. The working tree is otherwise unchanged, and the findings file is excluded from git by the repo's own exclude list.\n\n**What was checked, against the Economic Security, Invariant and Flow Gap guides:**\n- The token is an unmodified OpenZeppelin v5.2.0 ERC-20 with a single constructor mint. I fetched the upstream v5.2.0 files and diffed them against the vendored copies, and they are byte-identical.\n- The compiled ABI exposes only approve, transfer and transferFrom as state-changing functions. There is no receive or fallback, so ETH and unknown selectors revert. The runtime has no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The supply literal evaluates to exactly 10^27, matching the manifest figure. A CREATE2 deployment through a factory probe credits the factory, not the outer caller or tx.origin.\n- A scratch test drove the launch economics end to end: the 10/80/10 split is integer-exact, the factory's three outbound flows and the distributor's claims arrive whole, the pool buy and sell legs are exact, and a fuzzed round trip through the pool manager is exact for any amount up to the full supply.\n- The project's stateful invariant suite was rerun at depth 256 and conservation of supply and the allowance model both held.\n- The aderyn large-numeric-literal lead at line 10 is style only and was not promoted. Slither reported nothing.\n\n**Not reported on purpose:** the standard ERC-20 approve ordering race and tokens sent to contracts that cannot return them. Both are inherent to the standard, documented in the README, and give no actor a privileged or profitable path, so they do not meet the bar for a finding.","treeHash":null,"usage":{"cachedInputTokens":887227,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":12552,"runtime":"claude","turns":29,"wallClockMs":342963}},{"artifacts":[],"attempt":1,"bundleHash":"46aa818cf7cbed26fa3319d52c30765c5fe7d1502c04d08aee2a222a3bed0a5a","device":"d2ea4ab6ad35e6a1","findings":[],"hash":"390232ceb77656107b1be125268cd63dfd59c83d132250fe1051e6275b5fffa3","nodeId":"66498866-2f73-48e5-ac72-bedfec75130a","outcome":"completed","summary":"Implemented vault (VAULT): 1,000,000,000 tokens with 18 decimals, minted once to the deployer.\n\nIncluded offline dependencies, success/failure tests, fuzz and invariant coverage, and deployment documentation.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test` passed using the required fuzz seed.\n- `forge fmt --check` passed.","treeHash":"91aa71403792645e9903319e6433d7019027166e","usage":{"cachedInputTokens":376576,"inputTokens":52995,"model":"gpt-6-astra","outputTokens":12976,"runtime":"codex","turns":4,"wallClockMs":335461}},{"artifacts":[],"attempt":1,"bundleHash":"a24926c736b4f0c138b80d880b81930d50aff830390c1ffe4f755e17c508dec2","device":"30bcdea6dcb9ee40","findings":[],"hash":"3ef1cca8cab1b3cc9c7e670b122b341532f87ba2d3426fb4667a598bc8a3891a","nodeId":"83037984-99e9-4699-acd1-0a65fba3ac22","outcome":"completed","summary":"Done. The manifest is written and verified against the accepted tree.\n\n**What launch.json contains**\n\n- Kind `custom_token`, token contract VaultToken with name vault, symbol VAULT, 18 decimals.\n- Empty constructorArgs, matching the compiled ABI, which has no constructor inputs.\n- totalSupply of 1000000000000000000000000000 minor units, equal to the constant the constructor mints to msg.sender.\n- No application contracts and no initialization calls, matching the tree, which holds only the token.\n- Pool and economics copied exactly as the launch gives them: native ETH pair, fee 12500, tick spacing 60, the one-to-one provenance price, 8000 pool bps, 10 ETH opening cap, and the requester's remainder address.\n- Notes of 864 characters describing the token's fixed supply and absence of privileged functions.\n\n**Checks run**\n\n- `forge build` compiled cleanly with solc 0.8.26.\n- `forge test` with the verifier's fuzz seed passed all 31 tests across both suites.\n- A script compared the manifest to the compiled artifact: constructor inputs, supply and top-level keys all match the schema fields.\n- Git status shows launch.json as the only new file. Nothing else was changed.","treeHash":"c099e219672c117e2ef6878af4325e059d4b19ce","usage":{"cachedInputTokens":187496,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2683,"runtime":"claude","turns":9,"wallClockMs":48599}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dbfcf48f94822fd7","findings":[],"hash":"65715ac20852d716278667a308246df35512649246873c54b2a7172bc53f2f19","nodeId":"b64ae307-e6ff-4471-9dfa-7ca0526c712d","outcome":"completed","summary":"The review is complete. The findings file holds zero defects and a full coverage record. Git status shows the tree unchanged apart from the findings file, which is untracked, and the scratch directory is removed.\n\n**Result: no defects found in the Access Control, Trust Gap and Asymmetry areas.** `.imd-findings.json` has an empty findings list and seven coverage rows, one per listed entry point plus four checked invariants and trust assumptions.\n\n**What was checked**\n\n- **Entry-point inventory.** The compiled ABI exposes exactly approve, transfer and transferFrom as state-changing functions, plus views. There is no receive, fallback, payable entry, initializer, owner, minter, pause or blocklist. All three entry points are public by design and guard only the caller's own balance or allowance.\n- **Access control.** Twenty-four admin, mint, freeze and upgrade selectors revert whether called by the deployer, the factory stub or a stranger. The factory cannot pull a holder's balance through transferFrom without an allowance. The constructor credits msg.sender only, so a CREATE2 deploy through a factory gives the factory the supply and tx.origin nothing.\n- **Trust gap.** There is no privileged actor, so none of the access-by-economics or access-by-asymmetry seams exists. The only trust assumption is that the immediate deployer, meant to be the launch factory, holds the whole supply after construction. That is the launch flow's design and is recorded as a coverage row rather than a finding.\n- **Asymmetry.** transfer and transferFrom route through the same unmodified OpenZeppelin `_transfer` and move identical amounts under fuzzing. Allowance spending leaves the max allowance untouched and restores on revert.\n- **Library integrity.** All five vendored OpenZeppelin files match upstream v5.2.0 by SHA-256, and the token overrides nothing.\n- **Runtime.** A reachable-opcode walk mirroring the protected floor finds no DELEGATECALL, CALLCODE, SELFDESTRUCT or external call.\n\n**Static-analysis leads.** Slither reported nothing. Aderyn's large-numeric-literal note on `src/VaultToken.sol:10` is style only. The literal uses digit separators and evaluates to exactly the stated supply, so it was not promoted.\n\n**Not reached.** Nothing in the assigned area was left unchecked. One item outside it is unverified: whether Robinhood Chain's execution layer accepts Cancun-target bytecode. That is a toolchain and deployer concern rather than a token defect, and it needs a live chain check this review cannot make.","treeHash":null,"usage":{"cachedInputTokens":664548,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12423,"runtime":"claude","turns":31,"wallClockMs":189011}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76f57db4177175be","findings":[],"hash":"93360aa582af8e86370dfaf7cec64416c7dd41c4b24a749f78ccaf4fe4c1f73c","nodeId":"269394a5-02a3-427d-b589-caa266c86dec","outcome":"completed","summary":"The review is complete. The findings file is valid JSON and the working tree has no tracked changes.\n\n**Outcome: no defects found.** The five specialist reports each returned no findings, so there was nothing to reproduce or merge. My own pass confirmed the code is sound.\n\nWhat I verified:\n\n- **Source.** `src/VaultToken.sol` is a 16-line contract inheriting OpenZeppelin ERC20 with no overrides. The constructor mints the full supply once to msg.sender. The ABI exposes only the standard ERC-20 functions plus the constant. There is no mint, burn, owner, pause, blacklist, or upgrade path.\n- **Dependencies.** The five vendored OpenZeppelin files are byte-identical to the upstream v5.2.0 tag. Fetched and diffed directly.\n- **Bytecode.** Creation code and runtime are well under the protocol limits. A floor-style scan of reachable opcodes found no DELEGATECALL, CALLCODE, or SELFDESTRUCT. Metadata uses bytecode_hash none.\n- **Entry points.** All three state-changing entry points traced and exercised in a scratch test: CREATE2 deployment credits the deploying contract, transfers move the exact amount, allowances decrement correctly and the infinite allowance is preserved, and zero-address and over-balance paths revert.\n- **Manifest.** `launch.json` matches the compiled constructor with empty args, totalSupply equals the minted amount, decimals 18, and economics are present.\n- **Tests.** The project's 43 existing tests pass, including the adversarial invariant suites. The protected floor tests cannot run here since they import the floor's v4-core sources, but each of their checks was traced against the code and holds.\n- **Static analysis.** Slither reported nothing. The aderyn large-numeric-literal note is a style remark on a correctly valued constant and is not a defect.\n\nThe coverage record in `.imd-findings.json` answers all three entry points as holds, with two extra rows for the supply invariant and dependency integrity.","treeHash":null,"usage":{"cachedInputTokens":630614,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":6990,"runtime":"claude","turns":14,"wallClockMs":171307}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0ef0dfae5a05e4be","findings":[],"hash":"ba38d60795e35cafe9491e7b2357422b3d2103dd6095ffc005805f3725607584","nodeId":"9a707757-c2b0-465a-bf2a-9d15441c06b8","outcome":"completed","summary":"The review is complete. No defects found. The findings file is written with an empty list and nine coverage rows.\n\n**What the code is.** `src/VaultToken.sol` is a 16-line contract that inherits OpenZeppelin ERC20 with no overrides and mints one billion tokens with 18 decimals to the deployer in the constructor. It has no owner, mint, burn, pause, hooks, external calls, receive or fallback.\n\n**What I checked against the Execution Trace, Periphery and First Principles guides.**\n\n- **Execution flow.** Traced approve, transfer and transferFrom through the inherited implementation. Zero-address sentinels revert on every path. The unchecked arithmetic cannot wrap because the balance check precedes it. Self-transfer nets to zero. The allowance write in transferFrom is rolled back when the transfer reverts. There are no external calls, so no stale reads or reentrancy.\n- **Periphery.** The vendored OpenZeppelin files are the real attack surface here. I downloaded the upstream v5.2.0 archive, matched its SHA-256 to the one recorded in DEPENDENCIES.md, and confirmed all five vendored files are byte-identical to upstream.\n- **First principles and launch floor.** Supply constant equals exactly 1000000000000000000000000000. Name, symbol and decimals match the brief. A CREATE2 factory deployment leaves the whole supply with the factory, not the outer caller. I reproduced the protected test's reachable-opcode scan over the deployed runtime and found no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL or STATICCALL. Twenty-two common admin, mint and freeze selectors all revert, as do plain ETH and empty-calldata calls.\n\n**Verification run.** The project's 31 tests pass with the README's seed, and `forge fmt --check` is clean. The aderyn \"large numeric literal\" lead is style only and the literal evaluates to the correct supply.\n\n**Not reached.** The Uniswap v4 seed and swap in the protected harness were not exercised because v4 is not vendored here. Since the token has no fee, burn or exemption logic on any transfer path, every launch leg moves exactly the requested amount, so that check should hold. The standard ERC-20 approve front-running property is recorded in the coverage as a note rather than a finding. The README already documents the mitigation.\n\nThe scratch tests were removed and the working tree is unchanged apart from the untracked `.imd-findings.json` output.","treeHash":null,"usage":{"cachedInputTokens":481208,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":10753,"runtime":"claude","turns":25,"wallClockMs":273809}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a4ad9be53991100","findings":[],"hash":"e96ed563939bf07f28cbf4b6502481c2446c120c4b9f2195e842f1d1291a0642","nodeId":"f7b247b2-3597-4799-a901-65150d0933d3","outcome":"completed","summary":"I found no defects in the math area. `.imd-findings.json` holds an empty findings list and a coverage row for each of the three entry points.\n\n**What the code is:** `src/VaultToken.sol` is a 16-line contract that extends OpenZeppelin's ERC20 without changing it. Its constructor mints `1_000_000_000 * 10 ** 18` (exactly 1e27) to `msg.sender` once. It doesn't override `decimals()`, so decimals is 18. There are no fees, rounding, casts, divisions, scaled numbers, payable functions or external calls of its own. Git shows no local changes to the vendored OpenZeppelin library.\n\n**What I checked against the three assigned guides:**\n- **Math Precision:** The only arithmetic is in OpenZeppelin's `_update` and `_spendAllowance`. Each subtraction that skips Solidity's overflow checks comes after a check that reverts if the balance or allowance is too small. The unchecked addition to the recipient's balance can't overflow because the total supply is fixed at 1e27. Nothing in the contract truncates, rounds or narrows a type.\n- **Boundary:** I walked through 0, 1 wei, the full balance, a transfer to yourself, and the maximum `uint256` allowance (which by design is never reduced). Each behaves as the ERC-20 standard says. Transfers or approvals involving the zero address revert. The contract makes no external calls and has no payable functions.\n- **Numerical Gap:** With no rounding there is nothing that can drift. The sum of all balances equals the total supply after every path, and nothing can mint or burn after deployment.\n\n**Static analysis leads:**\n- Aderyn's \"large numeric literal\" at `src/VaultToken.sol:10` is a style note. The value matches the brief.\n- Slither reported nothing.\n\n**Checks:**\n- The project's existing suite passes: 31 tests, 0 failed.\n- Writing proof tests wasn't needed, since nothing reached critical or high severity.\n- I didn't run the protected floor test. It imports `LaunchLiquidity.sol` and v4-core, which aren't in this tree.\n\n**Coverage:** `approve`, `transfer` and `transferFrom` are all marked holds. I also added rows confirming the fixed 1e27 supply and the 18 decimals. Nothing is marked unreached.","treeHash":null,"usage":{"cachedInputTokens":200173,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":2846,"runtime":"claude","turns":6,"wallClockMs":45826}}],"verification":[{"checks":[{"durationMs":1797,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.73s\nCompiler run successful!\n","passed":true},{"durationMs":6109,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/VaultToken.t.sol:VaultTokenTest\n[PASS] testFuzz_create2MintsOnlyToImmediateDeployer(bytes32) (runs: 512, μ: 284062, ~: 284170)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 512, μ: 61514, ~: 61833)\nLogs:\n  Bound result 44085215274248552445248554689848712212\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 99756, ~: 99884)\nLogs:\n  Bound result 5684\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 512, μ: 129966, ~: 130283)\nLogs:\n  Bound result 752817604240838247197123740\n  Bound result 760813568531854943559707981\n\n[PASS] testFuzz_transferFromTracksFiniteAllowance(uint256,uint256) (runs: 512, μ: 169934, ~: 171796)\nLogs:\n  Bound result 558916607933819660169988\n  Bound result 72421047461014582858374\n\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 173461)\n[PASS] test_approvalEmitsEventWithoutMovingTokens() (gas: 111097)\n[PASS] test_approvalMayExceedCurrentBalance() (gas: 80390)\n[PASS] test_approveZeroSpenderReverts() (gas: 40230)\n[PASS] test_constructorEmitsMintTransfer() (gas: 24576)\n[PASS] test_factoryDistributionAndPoolTransfersHaveNoTax() (gas: 637623)\n[PASS] test_metadataAndInitialSupply() (gas: 111639)\n[PASS] test_noMintBurnOwnershipOrPrivilegedBalanceControls() (gas: 888988)\n[PASS] test_selfTransferPreservesBalance() (gas: 54132)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35864)\n[PASS] test_transferEntireSupply() (gas: 78391)\n[PASS] test_transferFromExhaustsAllowanceAndCannotSpendTwice() (gas: 181181)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 123954)\n[PASS] test_transferFromOwnerStillNeedsAllowance() (gas: 38476)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutMovingBalance() (gas: 108147)\n[PASS] test_transferFromSpendsAllowanceAndEmitsTransfer() (gas: 156702)\n[PASS] test_transferFromToZeroRestoresAllowance() (gas: 108744)\n[PASS] test_transferFromUnlimitedAllowanceIsNotDecreased() (gas: 212012)\n[PASS] test_transferFromWrongSpenderReverts() (gas: 110062)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 66202)\n[PASS] test_transferFromZeroSourceReverts() (gas: 44538)\n[PASS] test_transferInsufficientBalanceRevertsWithoutChanges() (gas: 67791)\n[PASS] test_transferMovesExactAmountAndEmitsEvent() (gas: 96263)\n[PASS] test_transferToZeroRevertsEvenForZeroAmount() (gas: 74976)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63069)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 45.81ms (212.74ms CPU time)\n\nRan 11 tests for test/VaultToken.adversarial.t.sol:VaultAdversarialFuzzTest\n[PASS] testFuzz_approveNeverMovesBalances(address,address,uint256) (runs: 1000, μ: 110507, ~: 110936)\n[PASS] testFuzz_recipientCannotSpendMoreThanReceived(address,uint256,uint256) (runs: 1000, μ: 100633, ~: 101175)\nLogs:\n  Bound result 763221508677361273856239857\n  Bound result 641209643467310935658212438\n\n[PASS] testFuzz_roundTripRestoresBalances(address,uint256) (runs: 1000, μ: 117962, ~: 117897)\nLogs:\n  Bound result 762\n\n[PASS] testFuzz_splitTransfersEqualSingleTransfer(address,uint256,uint256) (runs: 1000, μ: 128167, ~: 128840)\nLogs:\n  Bound result 6453\n  Bound result 868386710908740011256610913\n\n[PASS] testFuzz_strangerWithoutAllowanceCannotMoveHolderFunds(address,uint256) (runs: 1000, μ: 51785, ~: 51577)\nLogs:\n  Bound result 1000000000000000000\n\n[PASS] test_allowanceOfMaxMinusOneIsDecremented() (gas: 123632)\n[PASS] test_etherIsRefused() (gas: 69402)\n[PASS] test_maxUintTransferReverts() (gas: 37646)\n[PASS] test_noPermitOrDelegatedSpendPath() (gas: 54182)\n[PASS] test_oneWeiOverSupplyViaUnlimitedAllowanceReverts() (gas: 95346)\n[PASS] test_runtimeHasNoDelegatecallSelfdestructOrCallcode() (gas: 1302243)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 46.03ms (229.41ms CPU time)\n\nRan 1 test for test/VaultToken.invariant.t.sol:VaultTokenInvariantTest\n[PASS]\nVaultTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModelAndConserveSupply\n VaultTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------+------------------+-------+---------+----------╮\n| Contract          | Selector         | Calls | Reverts | Discards |\n+===================================================================+\n| VaultTokenHandler | approve          | 2036  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | attemptOverspend | 2006  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | transfer         | 2033  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | transferFrom     | 2117  | 0       | 0        |\n╰-------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5983\n  Bound result 0\n  Bound result 0\n  Bound result 4992\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 659\n  Bound result 0\n  Bound result 0\n  Bound result 3039\n  Bound result 0\n  Bound result 1\n  Bound result 450\n  Bound result 0\n  Bound result 5982\n  Bound result 10\n  Bound result 11\n  Bound result 999999999999999999999988045\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3795\n  Bound result 2\n  Bound result 10\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.94s (1.93s CPU time)\n\nRan 1 test for test/VaultToken.adversarial.t.sol:VaultAdversarialInvariantTest\n[PASS]\nVaultAdversarialInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_metadataNeverChanges\n[PASS] invariant_rejectedCallsNeverSucceedAndHoldNoEther\n[PASS] invariant_supplyFixedAndFullyAccounted\n VaultAdversarialInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------------+--------------------+-------+---------+----------╮\n| Contract                | Selector           | Calls | Reverts | Discards |\n+===========================================================================+\n| VaultAdversarialHandler | approve            | 1808  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | approveZeroSpender | 1797  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | callUnknown        | 1768  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | overspendAllowance | 1845  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | overspendBalance   | 1843  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | sendEther          | 1775  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | sendToZero         | 1821  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | transfer           | 1828  | 0       | 0        |\n|-------------------------+--------------------+-------+---------+----------|\n| VaultAdversarialHandler | transferFrom       | 1899  | 0       | 0        |\n╰-------------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 495790613316\n  Bound result 100000000000000000000\n  Bound result 254\n  Bound result 7986\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 0\n  Bound result 0\n  Bound result 3094\n  Bound result 1674\n  Bound result 7141\n  Bound result 781786578658883239221125684\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 2635\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 112503240431772285999529837317117211826670658149772948851204259260351046884176\n  Bound result 10188\n  Bound result 0\n  Bound result 0\n  Bound result 211801472\n  Bound result 0\n  Bound result 5228\n  Bound result 3000000000000000000\n  Bound result 154\n  Bound result 5\n  Bound result 127\n  Bound result 0\n  Bound result 0\n  Bound result 4887360514617339878\n  Bound result 244\n  Bound result 4747\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.02s (6.02s CPU time)\n\nRan 4 test suites in 6.02s (8.05s CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":49,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VaultToken.approve(address,uint256)\",\"VaultToken.transfer(address,uint256)\",\"VaultToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":19,\"README.md\":59,\"foundry.toml\":19,\"remappings.txt\":2,\"src/VaultToken.sol\":16,\"test/VaultToken.adversarial.t.sol\":395,\"test/VaultToken.invariant.t.sol\":105,\"test/VaultToken.t.sol\":383},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"01289fd78321f02d22535d9095df58162883ffd2109f7e951108d4a4b15f1491","verifiedTreeHash":"b96c854d19a1f77addf8d22cdaf380e105f155dc","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1417,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.32s\nCompiler run successful!\n","passed":true},{"durationMs":2434,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/VaultToken.t.sol:VaultTokenTest\n[PASS] testFuzz_create2MintsOnlyToImmediateDeployer(bytes32) (runs: 512, μ: 284060, ~: 284170)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 512, μ: 61512, ~: 61833)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913732736613\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 99727, ~: 99908)\nLogs:\n  Bound result 8\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 512, μ: 129791, ~: 130283)\nLogs:\n  Bound result 752817604240838247197123740\n  Bound result 760813568531854943559707981\n\n[PASS] testFuzz_transferFromTracksFiniteAllowance(uint256,uint256) (runs: 512, μ: 169118, ~: 171796)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 173461)\n[PASS] test_approvalEmitsEventWithoutMovingTokens() (gas: 111097)\n[PASS] test_approvalMayExceedCurrentBalance() (gas: 80390)\n[PASS] test_approveZeroSpenderReverts() (gas: 40230)\n[PASS] test_constructorEmitsMintTransfer() (gas: 24576)\n[PASS] test_factoryDistributionAndPoolTransfersHaveNoTax() (gas: 637623)\n[PASS] test_metadataAndInitialSupply() (gas: 111639)\n[PASS] test_noMintBurnOwnershipOrPrivilegedBalanceControls() (gas: 888988)\n[PASS] test_selfTransferPreservesBalance() (gas: 54132)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35864)\n[PASS] test_transferEntireSupply() (gas: 78391)\n[PASS] test_transferFromExhaustsAllowanceAndCannotSpendTwice() (gas: 181181)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 123954)\n[PASS] test_transferFromOwnerStillNeedsAllowance() (gas: 38476)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutMovingBalance() (gas: 108147)\n[PASS] test_transferFromSpendsAllowanceAndEmitsTransfer() (gas: 156702)\n[PASS] test_transferFromToZeroRestoresAllowance() (gas: 108744)\n[PASS] test_transferFromUnlimitedAllowanceIsNotDecreased() (gas: 212012)\n[PASS] test_transferFromWrongSpenderReverts() (gas: 110062)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 66202)\n[PASS] test_transferFromZeroSourceReverts() (gas: 44538)\n[PASS] test_transferInsufficientBalanceRevertsWithoutChanges() (gas: 67791)\n[PASS] test_transferMovesExactAmountAndEmitsEvent() (gas: 96263)\n[PASS] test_transferToZeroRevertsEvenForZeroAmount() (gas: 74976)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63069)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 23.43ms (106.52ms CPU time)\n\nRan 1 test for test/VaultToken.invariant.t.sol:VaultTokenInvariantTest\n[PASS]\nVaultTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModelAndConserveSupply\n VaultTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------+------------------+-------+---------+----------╮\n| Contract          | Selector         | Calls | Reverts | Discards |\n+===================================================================+\n| VaultTokenHandler | approve          | 2036  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | attemptOverspend | 2006  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | transfer         | 2033  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | transferFrom     | 2117  | 0       | 0        |\n╰-------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 444\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 376\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 247\n  Bound result 528361934131939802744645354\n  Bound result 91\n  Bound result 0\n  Bound result 3124\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 144\n  Bound result 1600\n  Bound result 13\n  Bound result 4\n  Bound result 0\n  Bound result 102\n  Bound result 0\n  Bound result 107444132018702665868517728\n  Bound result 2345\n  Bound result 2\n  Bound result 2\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.28s (2.28s CPU time)\n\nRan 2 test suites in 2.28s (2.30s CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VaultToken.approve(address,uint256)\",\"VaultToken.transfer(address,uint256)\",\"VaultToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":19,\"README.md\":59,\"foundry.toml\":19,\"remappings.txt\":2,\"src/VaultToken.sol\":16,\"test/VaultToken.invariant.t.sol\":105,\"test/VaultToken.t.sol\":383},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":613,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":298,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/VaultToken.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"390232ceb77656107b1be125268cd63dfd59c83d132250fe1051e6275b5fffa3","verifiedTreeHash":"91aa71403792645e9903319e6433d7019027166e","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1402,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.30s\nCompiler run successful!\n","passed":true},{"durationMs":2111,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/VaultToken.t.sol:VaultTokenTest\n[PASS] testFuzz_create2MintsOnlyToImmediateDeployer(bytes32) (runs: 512, μ: 284060, ~: 284170)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 512, μ: 61512, ~: 61833)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007914129639935\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 99727, ~: 99908)\nLogs:\n  Bound result 1000000000000000000000000000\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 512, μ: 129791, ~: 130283)\nLogs:\n  Bound result 558916607933819660169988\n  Bound result 199357066798843122752073730\n\n[PASS] testFuzz_transferFromTracksFiniteAllowance(uint256,uint256) (runs: 512, μ: 169118, ~: 171796)\nLogs:\n  Bound result 360447968385206778106562415330882716986027697881752817604240838247197123740\n  Bound result 495331694536233621887716414\n\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 173461)\n[PASS] test_approvalEmitsEventWithoutMovingTokens() (gas: 111097)\n[PASS] test_approvalMayExceedCurrentBalance() (gas: 80390)\n[PASS] test_approveZeroSpenderReverts() (gas: 40230)\n[PASS] test_constructorEmitsMintTransfer() (gas: 24576)\n[PASS] test_factoryDistributionAndPoolTransfersHaveNoTax() (gas: 637623)\n[PASS] test_metadataAndInitialSupply() (gas: 111639)\n[PASS] test_noMintBurnOwnershipOrPrivilegedBalanceControls() (gas: 888988)\n[PASS] test_selfTransferPreservesBalance() (gas: 54132)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35864)\n[PASS] test_transferEntireSupply() (gas: 78391)\n[PASS] test_transferFromExhaustsAllowanceAndCannotSpendTwice() (gas: 181181)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 123954)\n[PASS] test_transferFromOwnerStillNeedsAllowance() (gas: 38476)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutMovingBalance() (gas: 108147)\n[PASS] test_transferFromSpendsAllowanceAndEmitsTransfer() (gas: 156702)\n[PASS] test_transferFromToZeroRestoresAllowance() (gas: 108744)\n[PASS] test_transferFromUnlimitedAllowanceIsNotDecreased() (gas: 212012)\n[PASS] test_transferFromWrongSpenderReverts() (gas: 110062)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 66202)\n[PASS] test_transferFromZeroSourceReverts() (gas: 44538)\n[PASS] test_transferInsufficientBalanceRevertsWithoutChanges() (gas: 67791)\n[PASS] test_transferMovesExactAmountAndEmitsEvent() (gas: 96263)\n[PASS] test_transferToZeroRevertsEvenForZeroAmount() (gas: 74976)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63069)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 18.27ms (92.42ms CPU time)\n\nRan 1 test for test/VaultToken.invariant.t.sol:VaultTokenInvariantTest\n[PASS]\nVaultTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModelAndConserveSupply\n VaultTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------+------------------+-------+---------+----------╮\n| Contract          | Selector         | Calls | Reverts | Discards |\n+===================================================================+\n| VaultTokenHandler | approve          | 2036  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | attemptOverspend | 2006  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | transfer         | 2033  | 0       | 0        |\n|-------------------+------------------+-------+---------+----------|\n| VaultTokenHandler | transferFrom     | 2117  | 0       | 0        |\n╰-------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 444\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 376\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 247\n  Bound result 528361934131939802744645354\n  Bound result 91\n  Bound result 0\n  Bound result 65\n  Bound result 0\n  Bound result 0\n  Bound result 471638065868060197255354645\n  Bound result 2\n  Bound result 19\n  Bound result 1600\n  Bound result 13\n  Bound result 4\n  Bound result 1\n  Bound result 43\n  Bound result 0\n  Bound result 199647094567789641611773724\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.02s (2.01s CPU time)\n\nRan 2 test suites in 2.02s (2.04s CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VaultToken.approve(address,uint256)\",\"VaultToken.transfer(address,uint256)\",\"VaultToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":19,\"README.md\":59,\"foundry.toml\":19,\"launch.json\":24,\"remappings.txt\":2,\"src/VaultToken.sol\":16,\"test/VaultToken.invariant.t.sol\":105,\"test/VaultToken.t.sol\":383},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3ef1cca8cab1b3cc9c7e670b122b341532f87ba2d3426fb4667a598bc8a3891a","verifiedTreeHash":"c099e219672c117e2ef6878af4325e059d4b19ce","verifierVersion":"0.1.0+ead9012e"}]}