{"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":"7af508b5-f0ea-48fa-9f6e-8dd72619d0fa","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2547f62ef25102c7aab62be47fa2f4f6766481550a758f31f2f315bff064ce7d","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":"cc6fefb9e96b4427ad043e0faa3d450b206a15c2200ab90b6a93a83226b23da6","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":"4290bc00bec550a84bf44ea2c99980f0454bf6c16e641ccdba55f1706f3259b2","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":"7175e4138ec06c595a305a1cc2a225d9ba4f85221c6bb3382d32481b4cb86ce3","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":"f0275c823b99485ab888a61b9415b9663a401380cc538a0ad8fc3981cc057b02","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":"76f6618f72e730f6a8b805a8da415bee1e4fad4fca63e39fb866e16b741ee85f","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":"da75ae98e4a87f1c57f020746e4c86412edaf5a58c66fdf5d41a55f68d033a4a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"eb589b1b001f2d98894e311ef83a1bc0d019ca46cf9118050a461c0931bb4ee4","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: BloxIMD (BLOX).\nToken name: BloxIMD\nToken symbol: BLOX\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"8d02f6a74268de621760c939f9f75c58c415db49c5e20ec60ce78fede0c042e5","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"7af508b5-f0ea-48fa-9f6e-8dd72619d0fa","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1883-bloximd"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52162","feedbackHash":"ffd81881058006531edaa91d0f16304868849835182c3eaa52e919cc0678c30a","nodeKey":"audit_economics","submissionHash":"2547f62ef25102c7aab62be47fa2f4f6766481550a758f31f2f315bff064ce7d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52685","feedbackHash":"2a558721c0171fdd05a1d53d9a4eeaf8b4082eb6b6d99d9b75d3465f9c8c7d6f","nodeKey":"audit_flow","submissionHash":"cc6fefb9e96b4427ad043e0faa3d450b206a15c2200ab90b6a93a83226b23da6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52170","feedbackHash":"b9e03a9bc1db10c393df498b543c1715ec787665994d7dc64086faacf79d16d1","nodeKey":"audit_judge","submissionHash":"4290bc00bec550a84bf44ea2c99980f0454bf6c16e641ccdba55f1706f3259b2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51451","feedbackHash":"d60bc1af84ace7a572361a2dd2f3a43a61ac4ac25fef2eb3e9b59ec375becb4d","nodeKey":"audit_math","submissionHash":"7175e4138ec06c595a305a1cc2a225d9ba4f85221c6bb3382d32481b4cb86ce3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50974","feedbackHash":"fa69ba63d117f09052ef19c149e0df978b1522c76c732bb660bc95591044ba48","nodeKey":"audit_permissions","submissionHash":"f0275c823b99485ab888a61b9415b9663a401380cc538a0ad8fc3981cc057b02","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52025","feedbackHash":"240a1db6c199d7426a78fa90169a09913f8814e2e32f758d026793460d13600e","nodeKey":"build_contract_project","submissionHash":"76f6618f72e730f6a8b805a8da415bee1e4fad4fca63e39fb866e16b741ee85f","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50999","feedbackHash":"ff2f8c802065b3e6789c47c6518bc5600ce7122347dc5fe7e16e316302ba16b7","nodeKey":"manifest","submissionHash":"da75ae98e4a87f1c57f020746e4c86412edaf5a58c66fdf5d41a55f68d033a4a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51724","feedbackHash":"1240b07e1539240d46a9d388168be3fd5f3bae50baa92e1acc87b8111698f1ae","nodeKey":"write_foundry_tests","submissionHash":"eb589b1b001f2d98894e311ef83a1bc0d019ca46cf9118050a461c0931bb4ee4","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c08b228c9c98f6f26655f3a79a06d64ed9515c3cf82281c9d4f35c844d54fcd2","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f9cb4fd544aa3c68","findings":[{"citation":"resolved","description":"BloxIMD inherits OpenZeppelin v5.1.0 ERC20 unchanged (the vendored file was diffed against upstream; only the version header differs from 5.2.0 plus 5.2.0's `<` vs `!=` gas tweak in _spendAllowance). approve(spender, value) overwrites the allowance rather than adjusting it, so an owner who changes a non-zero allowance to another non-zero value can have a spender front-run the change and spend the old allowance and then the new one. This is the well-known ERC-20 approve race, present in every compliant ERC-20; OpenZeppelin v5 deliberately removed increaseAllowance/decreaseAllowance, and the README already instructs holders to revoke to zero before re-approving. It is reported as a trust assumption for holders, not as a defect in the requested design; no fix is required and adding permit or increase/decrease helpers would be a design change for the requester to decide. The remaining economics of the token hold: a fixed 10^27 supply minted once to msg.sender (the factory), no mint/burn/pause/blacklist/owner entry points, exact-amount transfers with no fee, tax, rebase, callback or sentinel path, so the swarm share, pool seed, remainder forwarding, claims and PoolManager buy/sell flows all move exactly what they say.","line":287,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: DISTRIBUTOR holds 150e18 BLOX and has approved TRADER 100e18. DISTRIBUTOR submits approve(TRADER, 50e18) intending to reduce the allowance. TRADER, seeing it pending, first calls transferFrom(DISTRIBUTOR, TRADER, 100e18) (succeeds, allowance 100e18 -> 0), then after the owner's approve(TRADER, 50e18) lands calls transferFrom(DISTRIBUTOR, TRADER, 50e18) (succeeds). Expected by the owner: at most 50e18 spendable. Actual: TRADER holds 150e18. Verified with a scratch Foundry test (test_approveRaceSpendsOldPlusNew) that passed on this tree. Mitigation already documented: approve(spender, 0) in a confirmed transaction before approving the new amount.","severity":"info","snippet":"        _allowances[owner][spender] = value;","title":"Standard ERC-20 approval replacement lets a front-running spender spend old plus new allowance (inherent ERC-20 property, documented in README, no code defect)"}],"hash":"2547f62ef25102c7aab62be47fa2f4f6766481550a758f31f2f315bff064ce7d","nodeId":"4d456f18-0ce0-487a-8881-615ecdb48c19","outcome":"completed","summary":"The review is complete and recorded in `.imd-findings.json`.\n\n**Outcome: no defect found in the Economic Security, Invariant or Flow Gap areas.** The token is a verbatim OpenZeppelin 5.1.0 ERC-20 with one constructor mint of 10^27 base units to msg.sender and nothing else.\n\nWhat I verified:\n- **Vendored dependency integrity.** All five OpenZeppelin files were diffed against the cached upstream copy. They are byte-identical apart from version headers and one 5.2.0 gas tweak with identical semantics. No non-ASCII or hidden characters in source or library.\n- **Supply invariants.** The literal evaluates to exactly 1e27. The constructor is the only supply writer, the compiled ABI exposes only approve, transfer and transferFrom as state changers, and a CREATE2 deploy from a factory stand-in holds the whole supply.\n- **Conservation.** A 1000-run fuzz of 24-step mixed transfer, approve and transferFrom sequences kept the sum of balances equal to totalSupply after every step, with no allowance residuals.\n- **Launch flows.** Swarm share, pool seed, remainder forwarding, claims, and PoolManager pay and pull all move exact amounts. The 10/80/10 split of 1e27 produces zero rounding dust.\n- **Floor checks.** Runtime bytecode has no DELEGATECALL, CALLCODE or SELFDESTRUCT and is under the EIP-170 limit. Decimals return 18. The existing 26-test suite and build pass cleanly.\n\nThe one recorded item is **info** severity: the inherent ERC-20 approve-replacement race, with a concrete reproduction showing a front-running spender collecting old plus new allowance. It is standard behaviour, already documented in the README with the revoke-first mitigation, and needs no code change.\n\nCoverage has nine rows. All three entry points and five invariants hold. The launch manifest row is marked unreached because no launch.json exists yet in this tree. When it is written it needs empty constructorArgs, decimals 18, contract name BloxIMD and the exact 10^27 totalSupply.\n\nThe scratch test directory was removed, so the working tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":505213,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":15029,"runtime":"claude","turns":21,"wallClockMs":218932}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa99051b60a858d6","findings":[{"citation":"resolved","description":"audit_permissions (ERC20.sol:127) and audit_economics (ERC20.sol:287) reported the same root cause: approve(spender, value) replaces the stored allowance rather than adjusting it, so a holder who changes a non-zero allowance to another non-zero value in one transaction can have the spender spend the old allowance first and the new one afterwards. Merged into one finding. Reproduced on this tree. The vendored ERC20.sol was diffed byte-for-byte against upstream OpenZeppelin v5.1.0 (identical), and the behaviour is the one the ERC-20 standard specifies; OpenZeppelin v5 intentionally removed increaseAllowance/decreaseAllowance. BloxIMD inherits ERC20 unchanged and the requested design is a plain fixed-supply ERC-20, so this is recorded as a holder-side trust assumption, already documented in README.md ('first revoke it in a confirmed transaction before granting the new amount'). It does not reopen the author's work; adding ERC-2612 permit or increase/decrease helpers would be a scope decision for the requester, not a fix.","line":287,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: FACTORY deploys BloxIMD and transfers 1000e18 to ALICE. 1) vm.prank(ALICE); approve(SPENDER, 100e18). 2) ALICE intends to lower it and submits approve(SPENDER, 50e18). 3) Before it lands, vm.prank(SPENDER); transferFrom(ALICE, SPENDER, 100e18) -> returns true, allowance 100e18 -> 0. 4) ALICE's approve(SPENDER, 50e18) executes -> allowance 50e18. 5) vm.prank(SPENDER); transferFrom(ALICE, SPENDER, 50e18) -> returns true. Expected by ALICE: at most 100e18 (or 50e18) spendable in total. Actual: balanceOf(SPENDER) == 150e18, balanceOf(ALICE) == 850e18. Verified with a scratch Foundry test test_approveRaceSpendsOldPlusNew (test/scratch/JudgeRepro.t.sol, run with forge test --match-path, passed on this tree, then removed).","severity":"info","snippet":"        _allowances[owner][spender] = value;","title":"ERC-20 approve overwrites the allowance, so lowering a non-zero allowance can be front-run (inherent ERC-20 property, documented in README; trust assumption, not a code defect; merged from audit_permi"},{"citation":"resolved","description":"audit_permissions reported that for value == 0, _spendAllowance passes because currentAllowance (0) is not < 0, then _transfer emits Transfer(from, to, 0) for arbitrary non-zero from/to chosen by an unrelated caller. Reproduced on this tree. No balance or allowance changes, so no funds or permissions are affected. ERC-20 requires zero-value transfers to be treated as normal transfers and to fire the Transfer event, and the project's own suite (test_zeroTransferFromNeedsNoAllowance) asserts this deliberately. Recorded so the record shows it was examined and intentionally accepted; it does not reopen the author's work.","line":304,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: ALICE holds 1000e18 BLOX, allowance(ALICE, BOB) == 0. Call from BOB: transferFrom(ALICE, BOB, 0). Expected under ERC-20 and actual: returns true, emits Transfer(ALICE, BOB, 0) from the token, balanceOf(ALICE) stays 1000e18, allowance(ALICE, BOB) stays 0. A non-zero amount from the same caller reverts with ERC20InsufficientAllowance(BOB, 0, 1). Verified with scratch Foundry tests test_zeroValueTransferFromAnyone and test_transferFromWithoutAllowanceReverts (test/scratch/JudgeRepro.t.sol, passed on this tree, then removed).","severity":"info","snippet":"            if (currentAllowance < value) {","title":"Zero-value transferFrom from any caller succeeds without allowance and emits Transfer(from, to, 0) (ERC-20 compliant; off-chain indexer nuisance only, not a defect)"}],"hash":"4290bc00bec550a84bf44ea2c99980f0454bf6c16e641ccdba55f1706f3259b2","nodeId":"9ad902a7-b65e-4f3f-b239-7a5c8494606e","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. The tree is otherwise unchanged (git status is clean apart from the findings file, which is ignored by the repo's gitignore).\n\n**Outcome: no defects.** BloxIMD is a fixed-supply ERC-20 that inherits OpenZeppelin v5.1.0 unchanged and adds only a constant and a constructor mint of 10^27 units to the deployer. Everything I checked holds:\n\n- **Vendored library is genuine.** I diffed all five files under `lib/openzeppelin-contracts` byte-for-byte against upstream v5.1.0. They are identical.\n- **Build and tests pass.** The project's 49 tests, including invariants and seeded fuzz runs, pass. Formatting check passes.\n- **No privileged or dangerous surface.** The ABI exposes only the ERC-20 functions plus the supply constant. The runtime bytecode contains no CALL, DELEGATECALL, CALLCODE, STATICCALL or SELFDESTRUCT. No receive or fallback.\n- **Launch flows are exact.** No fee, tax or callback, so factory, distributor, pool seed and swaps move exactly what they say. Creation code is 2636 bytes, far under the limits.\n- **Manifest is consistent.** Only schema keys, empty constructorArgs matching the parameterless constructor, supply and decimals matching the mint, lowercase addresses, notes under the limit.\n\n**Specialist findings.** All three were informational and all reproduced as standard ERC-20 behaviour rather than defects. I merged the two approve-race reports from audit_permissions and audit_economics into one info finding and kept the zero-value transferFrom report as a second info finding, each with the exact reproduction I ran in a scratch Foundry test. Neither should reopen the author's work. The aderyn large-literal lead is a compile-time constant that evaluates to exactly 10^27, confirmed by test, so it was dropped.\n\n**Coverage.** All three listed entry points are marked `holds`, with additional rows for the constructor, the fixed-supply invariant and manifest deployability. No proof files were needed since nothing reached high or critical severity.","treeHash":null,"usage":{"cachedInputTokens":435868,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11289,"runtime":"claude","turns":19,"wallClockMs":147231}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"79373c79d1351eba","findings":[],"hash":"7175e4138ec06c595a305a1cc2a225d9ba4f85221c6bb3382d32481b4cb86ce3","nodeId":"2bb72a80-59bb-42cc-86c4-e0e86017d087","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree is unchanged apart from it.\n\n**Result: no defects in the assigned area.** BloxIMD is a two-line subclass of OpenZeppelin v5.1.0 ERC20 with one constructor mint, and every Math Precision, Boundary and Numerical Gap failure mode I checked holds.\n\n**What I verified**\n\n- **Supply constant.** The literal on line 10 evaluates to exactly 1e27 at compile time, equal to one billion whole tokens at 18 decimals. Operator precedence is correct and there is no overflow headroom concern.\n- **Arithmetic paths.** The only arithmetic is inside OpenZeppelin's balance update and allowance spend. Both are guarded by an explicit comparison before the unchecked subtraction, so no underflow or wrap is reachable. Transfers of balance+1 and of 2^256-1 revert cleanly; self-transfer of the full balance preserves it.\n- **Allowance edges.** The maximum value is treated as infinite, maximum-minus-one is finite and decrements exactly, and the allowance check runs before the balance check so failed calls revert atomically.\n- **Boundaries.** No external calls, no payable or fallback path, no bytes decoding, no rounding or scaling anywhere. The only sentinel branches are the zero-address checks, which I traced on both sides.\n- **Library integrity.** All five vendored OpenZeppelin files hash byte-for-byte to the upstream v5.1.0 tag.\n- **Static-analysis lead.** The aderyn large-literal note is stylistic and the value is exact. Not a defect.\n\n**Evidence.** The existing 26-test suite passes with the pinned fuzz seed. An 11-test scratch battery over zero, one-wei, full-balance, over-balance, maximum, self-transfer, odd-amount conservation and double-deployment inputs also passed. That scratch directory has been deleted.\n\n**Coverage record.** The findings file holds eight rows marked holds: the three ABI entry points, the supply invariant, the conservation invariant, the external-boundary inventory, the vendored-library check and the static-analysis lead. Nothing was left unreached.\n\n**Out of my area, noted for the judge.** No launch.json exists in the tree yet, which is expected before the manifest step runs. The token has no owner or privileged entry point, so there are no trust assumptions to document.","treeHash":null,"usage":{"cachedInputTokens":588702,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12137,"runtime":"claude","turns":23,"wallClockMs":182400}},{"artifacts":[],"attempt":1,"bundleHash":"2b2e47b2071b83ab040d83e9e7d467ac415cc4832da7d88d19cf940dc89ef699","device":"d6981b1e15db2f76","findings":[],"hash":"76f6618f72e730f6a8b805a8da415bee1e4fad4fca63e39fb866e16b741ee85f","nodeId":"8cf7748a-4f46-48bb-a038-c3975ba7adf2","outcome":"completed","summary":"Implemented BloxIMD (BLOX) with 18 decimals and exactly 1,000,000,000 tokens minted once to the deployer.\n\nVendored dependencies and documented assumptions, deployment, and operational responsibilities.\n\nVerified:\n- `forge build`\n- `forge test`: 26 passed, including 4,000 fuzz cases using the required seed\n- `forge fmt --check`","treeHash":"5bc1c81815b0a6151c29de9438e76238ece43e62","usage":{"cachedInputTokens":366720,"inputTokens":41486,"model":"gpt-6.1-sol","outputTokens":8557,"runtime":"codex","turns":4,"wallClockMs":173042}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"776c025db24644e8","findings":[],"hash":"cc6fefb9e96b4427ad043e0faa3d450b206a15c2200ab90b6a93a83226b23da6","nodeId":"09a7ab67-30a7-4495-9f9a-34113db3aa6b","outcome":"completed","summary":"The review is complete and the findings file is in place. No defects were found in the assigned area.\n\n**Result:** `.imd-findings.json` holds an empty findings list and 11 coverage rows. All three verifier-listed entry points are marked `holds`, with the remaining rows recording the invariants I checked.\n\n**What I traced (Execution Trace, Periphery, First Principles):**\n- `approve`, `transfer` and `transferFrom` through the vendored OpenZeppelin `_approve`, `_transfer`, `_update` and `_spendAllowance` paths, including zero-address, zero-value, full-supply, `uint256.max` and self-transfer boundaries, allowance residuals, and atomic failure.\n- The constructor under CREATE2 from a factory-like contract: exactly 10^27 base units land at the factory address, decimals are 18.\n- The launch flows in my scratch harness: distributor transfer, claim, pool seed, and a PoolManager-style balance-delta pull and take all arrive whole with supply unchanged.\n- Periphery: the five vendored OpenZeppelin files are byte-identical to upstream v5.1.0, so no modified base contract hides behind the import.\n- Runtime bytecode scanned with the protected test's exact loop plus `cast disassemble`: no DELEGATECALL, CALLCODE, SELFDESTRUCT, or any CALL/CREATE opcode. No receive or fallback, so the contract rejects ETH and unknown selectors.\n- The aderyn large-literal lead evaluates to exactly 10^27 at compile time and is style only.\n\n**Checks run:** `forge build`, the project suite with the README's fuzz seed (26 passed), `forge fmt --check`, and seven scratch trace tests (all passed, then removed). The protected Uniswap v4 harness could not be run locally since v4-core and its environment are not vendored, but its opcode and supply checks were replicated directly.\n\n**Documented trust assumptions, not defects:** standard ERC-20 approval front-running and tokens sent to the token's own address being unrecoverable. Both are reproduced and already stated in the README as intended standard-token behaviour.","treeHash":null,"usage":{"cachedInputTokens":643911,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14513,"runtime":"claude","turns":25,"wallClockMs":194611}},{"artifacts":[],"attempt":1,"bundleHash":"60a603bcacecc048997ba9a76bbee4d24b5007802f86455b3139c13fe01354d9","device":"59b51c92352647b4","findings":[],"hash":"da75ae98e4a87f1c57f020746e4c86412edaf5a58c66fdf5d41a55f68d033a4a","nodeId":"af3fcdfc-7aef-4da6-a07b-ed0b79cb49ca","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/7af508b5-f0ea-48fa-9f6e-8dd72619d0fa/af3fcdfc-7aef-4da6-a07b-ed0b79cb49ca/launch.json) matching BloxIMD’s constructor, exact supply, and required pool and economics.\n\n`forge build` passed. All 26 tests passed with the supplied fuzz seed. Only `launch.json` is included for submission.","treeHash":"6175aef8233b85bd093315b0410cb6e20f3e887f","usage":{"cachedInputTokens":251648,"inputTokens":35141,"model":"gpt-6-astra","outputTokens":4350,"runtime":"codex","turns":4,"wallClockMs":135096}},{"artifacts":[],"attempt":1,"bundleHash":"250ebc22073239e7fdfcb87f555e52dbfe9b0ca7eda70aec6355fbc1aac3b27f","device":"e1d2139b33ec4bd9","findings":[],"hash":"eb589b1b001f2d98894e311ef83a1bc0d019ca46cf9118050a461c0931bb4ee4","nodeId":"48e49b51-9bd9-42bc-9661-9aac0a69cf0b","outcome":"completed","summary":"Added failure-path, boundary, and fuzz tests plus three stateful invariants under `test/`.\n\n`forge build` and `forge test` pass offline with the required seed. Invariants passed 256 sequences totaling 32,768 calls.\n\nNo defects found. Existing implementation and configuration remain unchanged.","treeHash":"e4c119a16d2bbca4fb7b4c5c41dc8e1baccca4b3","usage":{"cachedInputTokens":765184,"inputTokens":82399,"model":"gpt-6-astra","outputTokens":17725,"runtime":"codex","turns":6,"wallClockMs":465015}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"98b4506bef931d13","findings":[{"citation":"resolved","description":"Asymmetry guide, pair approve <-> transferFrom (ERC20.sol:127 and ERC20.sol:149). approve overwrites the allowance (ERC20.sol:287 `_allowances[owner][spender] = value;`) instead of adjusting it, so a holder who lowers an existing non-zero allowance in one transaction cannot prevent the spender from spending the old allowance first and the new one afterwards. This is the behaviour the ERC-20 standard itself documents and OpenZeppelin v5 chose to keep (increaseAllowance/decreaseAllowance were removed in v5). The token's README already instructs holders to revoke to zero before re-approving. It is recorded here as a trust assumption for holders, not as a defect of BloxIMD: the requested design is a plain ERC-20 and changing approve semantics would change that design. No fix recommended; if the author wants mitigation without changing approve, the only compatible options are adding ERC-2612 permit or increase/decrease helpers, which widen the agreed scope.","line":127,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: alice holds 1000e18 BLOX. 1) alice: approve(spender, 100e18). 2) alice broadcasts approve(spender, 50e18) intending to lower the allowance. 3) spender sees it pending and first calls transferFrom(alice, spender, 100e18) -> succeeds, allowance 0. 4) alice's approve(spender, 50e18) executes -> allowance 50e18. 5) spender calls transferFrom(alice, spender, 50e18) -> succeeds. Result: spender holds 150e18, alice intended at most 100e18 total. Verified with a scratch Foundry test (test_approveRace) on this tree.","severity":"info","snippet":"    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }","title":"Standard ERC-20 approve race: lowering a non-zero allowance can be front-run (inherent to ERC-20, not an implementation defect)"},{"citation":"resolved","description":"Access Control guide, 'map every caller class'. For value == 0, _spendAllowance (ERC20.sol:301) passes because currentAllowance (0) is not < 0, then _transfer emits Transfer(from, to, 0) for any non-zero from/to chosen by an unrelated caller. No balance changes, no allowance changes, so no funds or permissions are affected; the only effect is that any address can cause the token to emit Transfer events naming arbitrary accounts, which can confuse naive off-chain indexers or 'activity' heuristics. ERC-20 requires zero-value transfers to be treated as normal transfers and to emit the event, and the project's own suite (test_zeroTransferFromNeedsNoAllowance) asserts this on purpose. Not a defect; recorded so the judge can see it was examined and intentionally accepted.","line":149,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: alice holds 1000e18, allowance(alice, spender) == 0. Call from spender: transferFrom(alice, bob, 0). Expected under the ERC-20 standard and actual: returns true, emits Transfer(alice, bob, 0), balanceOf(alice) stays 1000e18, allowance stays 0. Verified with a scratch Foundry test (test_zeroValueTransferFromAnyone) on this tree.","severity":"info","snippet":"    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }","title":"Zero-value transferFrom from any account succeeds without allowance and emits Transfer(from,to,0) (ERC-20 compliant; indexer nuisance only)"}],"hash":"f0275c823b99485ab888a61b9415b9663a401380cc538a0ad8fc3981cc057b02","nodeId":"1531338a-5408-4dfa-bc81-89efe4ad5405","outcome":"completed","summary":"Review complete. The findings file is written and the tree holds no changes of mine beyond it.\n\n**Result: no defects found in the assigned area.** `.imd-findings.json` contains two informational notes and ten coverage rows. All three verifier entry points are marked `holds`.\n\n**What I checked**\n- **Access control:** the token inherits only OpenZeppelin ERC20 and Context. The compiled ABI exposes exactly `approve`, `transfer` and `transferFrom` as state-changing functions. There is no owner, initializer, mint, burn, pause, blacklist, receive or fallback. The deployer has ordinary holder rights only after construction.\n- **Trust gap:** the five vendored OpenZeppelin files are byte-identical to upstream v5.1.0, so the base the token trusts is untampered. `_msgSender` returns `msg.sender`, so no meta-transaction impersonation path exists. The constructor mints the full supply once to `msg.sender`, which is the factory in the launch flow.\n- **Asymmetry:** `transfer` and `transferFrom` share one `_update` path with no fee, exemption or branch that treats one caller class differently. Allowance has one writer that sets and one that only decreases.\n- **Bytecode:** an opcode scan of the compiled runtime found no DELEGATECALL, CALLCODE, SELFDESTRUCT, CREATE or CALL-family instructions.\n- **Tests:** the existing 26-test suite passes offline from a clean build. The aderyn large-literal lead is a compile-time constant equal to 1e27 and is not a defect.\n\n**Informational notes recorded**\n- The ERC-20 approve race when lowering a non-zero allowance. This is inherent to the standard and the README already documents the revoke-first mitigation.\n- Zero-value `transferFrom` succeeds from any caller without allowance and emits a Transfer event. This is required by ERC-20 and moves nothing.\n\nBoth were confirmed with a scratch Foundry test that was deleted afterwards. No finding is high or critical, so no proof file was attached.","treeHash":null,"usage":{"cachedInputTokens":968848,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":16041,"runtime":"claude","turns":25,"wallClockMs":305040}}],"verification":[{"checks":[{"durationMs":463,"exitCode":0,"name":"build","output":"Compiling 7 files with Solc 0.8.26\nSolc 0.8.26 finished in 396.80ms\nCompiler run successful!\n","passed":true},{"durationMs":309,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/BloxIMD.t.sol:BloxIMDTest\n[PASS] testFuzz_delegatedTransfer(uint256,uint256) (runs: 1000, μ: 144010, ~: 146230)\n[PASS] testFuzz_overBalanceTransferFailsAtomically(uint256) (runs: 1000, μ: 52128, ~: 52091)\n[PASS] testFuzz_transferRoundTripConservesSupply(uint256) (runs: 1000, μ: 122700, ~: 123245)\n[PASS] testFuzz_transferSequenceConservesSupply(uint256) (runs: 1000, μ: 2659731, ~: 2662441)\n[PASS] test_approvalEmitsAndCanBeReplacedOrRevoked() (gas: 159561)\n[PASS] test_approvalRejectsZeroSpender() (gas: 30379)\n[PASS] test_constructorEmitsMint() (gas: 5530)\n[PASS] test_deployerCannotMoveHolderTokensWithoutApproval() (gas: 136802)\n[PASS] test_factoryReceivesEntireSupply() (gas: 190049)\n[PASS] test_launchDistributionAndClaimArriveWhole() (gas: 254815)\n[PASS] test_metadataAndInitialSupply() (gas: 65479)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 524222)\n[PASS] test_selfTransferPreservesBalance() (gas: 42589)\n[PASS] test_transferEmitsAndDeliversExactAmount() (gas: 79761)\n[PASS] test_transferFromFailureRestoresAllowance() (gas: 98031)\n[PASS] test_transferFromPreservesMaximumAllowance() (gas: 115667)\n[PASS] test_transferFromRejectsInsufficientAllowance() (gas: 92236)\n[PASS] test_transferFromRejectsMissingAllowance() (gas: 37672)\n[PASS] test_transferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 95065)\n[PASS] test_transferFromRejectsZeroSenderEvenForZeroAmount() (gas: 32935)\n[PASS] test_transferFromSpendsFiniteAllowance() (gas: 212362)\n[PASS] test_transferRejectsInsufficientBalance() (gas: 44736)\n[PASS] test_transferRejectsZeroRecipient() (gas: 41635)\n[PASS] test_zeroTransferFromEmptyAccountEmits() (gas: 49646)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 50558)\n[PASS] test_zeroTransferStillRejectsZeroRecipient() (gas: 30337)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 237.71ms (912.10ms CPU time)\n\nRan 1 test suite in 238.62ms (237.71ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BloxIMD.approve(address,uint256)\",\"BloxIMD.transfer(address,uint256)\",\"BloxIMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":109,\"foundry.toml\":14,\"src/BloxIMD.sol\":15,\"test/BloxIMD.t.sol\":305},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":555,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":251,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/BloxIMD.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"76f6618f72e730f6a8b805a8da415bee1e4fad4fca63e39fb866e16b741ee85f","verifiedTreeHash":"5bc1c81815b0a6151c29de9438e76238ece43e62","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":352,"exitCode":0,"name":"build","output":"Compiling 7 files with Solc 0.8.26\nSolc 0.8.26 finished in 311.65ms\nCompiler run successful!\n","passed":true},{"durationMs":233,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/BloxIMD.t.sol:BloxIMDTest\n[PASS] testFuzz_delegatedTransfer(uint256,uint256) (runs: 1000, μ: 144010, ~: 146230)\n[PASS] testFuzz_overBalanceTransferFailsAtomically(uint256) (runs: 1000, μ: 52128, ~: 52091)\n[PASS] testFuzz_transferRoundTripConservesSupply(uint256) (runs: 1000, μ: 122700, ~: 123245)\n[PASS] testFuzz_transferSequenceConservesSupply(uint256) (runs: 1000, μ: 2659731, ~: 2662441)\n[PASS] test_approvalEmitsAndCanBeReplacedOrRevoked() (gas: 159561)\n[PASS] test_approvalRejectsZeroSpender() (gas: 30379)\n[PASS] test_constructorEmitsMint() (gas: 5530)\n[PASS] test_deployerCannotMoveHolderTokensWithoutApproval() (gas: 136802)\n[PASS] test_factoryReceivesEntireSupply() (gas: 190049)\n[PASS] test_launchDistributionAndClaimArriveWhole() (gas: 254815)\n[PASS] test_metadataAndInitialSupply() (gas: 65479)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 524222)\n[PASS] test_selfTransferPreservesBalance() (gas: 42589)\n[PASS] test_transferEmitsAndDeliversExactAmount() (gas: 79761)\n[PASS] test_transferFromFailureRestoresAllowance() (gas: 98031)\n[PASS] test_transferFromPreservesMaximumAllowance() (gas: 115667)\n[PASS] test_transferFromRejectsInsufficientAllowance() (gas: 92236)\n[PASS] test_transferFromRejectsMissingAllowance() (gas: 37672)\n[PASS] test_transferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 95065)\n[PASS] test_transferFromRejectsZeroSenderEvenForZeroAmount() (gas: 32935)\n[PASS] test_transferFromSpendsFiniteAllowance() (gas: 212362)\n[PASS] test_transferRejectsInsufficientBalance() (gas: 44736)\n[PASS] test_transferRejectsZeroRecipient() (gas: 41635)\n[PASS] test_zeroTransferFromEmptyAccountEmits() (gas: 49646)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 50558)\n[PASS] test_zeroTransferStillRejectsZeroRecipient() (gas: 30337)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 187.32ms (578.54ms CPU time)\n\nRan 1 test suite in 187.94ms (187.32ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":18,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BloxIMD.approve(address,uint256)\",\"BloxIMD.transfer(address,uint256)\",\"BloxIMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":109,\"foundry.toml\":14,\"launch.json\":24,\"src/BloxIMD.sol\":15,\"test/BloxIMD.t.sol\":305},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"da75ae98e4a87f1c57f020746e4c86412edaf5a58c66fdf5d41a55f68d033a4a","verifiedTreeHash":"6175aef8233b85bd093315b0410cb6e20f3e887f","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":848,"exitCode":0,"name":"build","output":"Compiling 11 files with Solc 0.8.26\nSolc 0.8.26 finished in 796.96ms\nCompiler run successful!\n","passed":true},{"durationMs":8178,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/BloxIMD.t.sol:BloxIMDTest\n[PASS] testFuzz_delegatedTransfer(uint256,uint256) (runs: 1000, μ: 144120, ~: 146242)\n[PASS] testFuzz_overBalanceTransferFailsAtomically(uint256) (runs: 1000, μ: 52130, ~: 52091)\n[PASS] testFuzz_transferRoundTripConservesSupply(uint256) (runs: 1000, μ: 122701, ~: 123269)\n[PASS] testFuzz_transferSequenceConservesSupply(uint256) (runs: 1000, μ: 2660773, ~: 2664117)\n[PASS] test_approvalEmitsAndCanBeReplacedOrRevoked() (gas: 159561)\n[PASS] test_approvalRejectsZeroSpender() (gas: 30379)\n[PASS] test_constructorEmitsMint() (gas: 5530)\n[PASS] test_deployerCannotMoveHolderTokensWithoutApproval() (gas: 136802)\n[PASS] test_factoryReceivesEntireSupply() (gas: 190049)\n[PASS] test_launchDistributionAndClaimArriveWhole() (gas: 254815)\n[PASS] test_metadataAndInitialSupply() (gas: 65479)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 524222)\n[PASS] test_selfTransferPreservesBalance() (gas: 42589)\n[PASS] test_transferEmitsAndDeliversExactAmount() (gas: 79761)\n[PASS] test_transferFromFailureRestoresAllowance() (gas: 98031)\n[PASS] test_transferFromPreservesMaximumAllowance() (gas: 115667)\n[PASS] test_transferFromRejectsInsufficientAllowance() (gas: 92236)\n[PASS] test_transferFromRejectsMissingAllowance() (gas: 37672)\n[PASS] test_transferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 95065)\n[PASS] test_transferFromRejectsZeroSenderEvenForZeroAmount() (gas: 32935)\n[PASS] test_transferFromSpendsFiniteAllowance() (gas: 212362)\n[PASS] test_transferRejectsInsufficientBalance() (gas: 44736)\n[PASS] test_transferRejectsZeroRecipient() (gas: 41635)\n[PASS] test_zeroTransferFromEmptyAccountEmits() (gas: 49646)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 50558)\n[PASS] test_zeroTransferStillRejectsZeroRecipient() (gas: 30337)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 227.51ms (473.43ms CPU time)\n\nRan 21 tests for test/BloxIMDProperties.t.sol:BloxIMDPropertiesTest\n[PASS] testFuzz_approvalCannotBeUsedAgainstAnotherOwner(uint256) (runs: 1000, μ: 160117, ~: 160089)\n[PASS] testFuzz_approvalReplacementIsIdempotentAndIsolated(uint256,uint256) (runs: 1000, μ: 253752, ~: 253885)\n[PASS] testFuzz_delegatedSelfTransferPreservesBalanceAndSpendsFiniteAllowance(uint256) (runs: 1000, μ: 106595, ~: 106593)\n[PASS] testFuzz_insufficientAllowanceFailsWithSufficientBalance(uint256,uint256) (runs: 1000, μ: 107546, ~: 108103)\n[PASS] testFuzz_insufficientBalanceRestoresFiniteAllowance(uint256,uint256) (runs: 1000, μ: 173079, ~: 173744)\n[PASS] testFuzz_spenderCannotUseAnotherSpendersApproval(uint256) (runs: 1000, μ: 100193, ~: 100131)\n[PASS] testFuzz_splitSpendingExhaustsExactlyTheApproval(uint256,uint256) (runs: 1000, μ: 253503, ~: 255846)\n[PASS] testFuzz_transferToAnyNonzeroRecipient(address,uint256) (runs: 1000, μ: 80155, ~: 80519)\n[PASS] test_contractRecipientDoesNotNeedReceiverHook() (gas: 269370)\n[PASS] test_delegatedSelfTransferConsumesAllowanceWithoutMovingBalance() (gas: 104322)\n[PASS] test_exhaustedAllowanceCannotBeReplayed() (gas: 161015)\n[PASS] test_fullSupplyTransferCannotBeReplayedAndCanReturn() (gas: 162037)\n[PASS] test_maximumMinusOneAllowanceIsFinite() (gas: 131360)\n[PASS] test_maximumTransferFailsWithoutArithmeticPanic() (gas: 44757)\n[PASS] test_oneBaseUnitCanMoveWithoutRounding() (gas: 139768)\n[PASS] test_ownerUsingTransferFromNeedsItsOwnAllowance() (gas: 152933)\n[PASS] test_selfTransferStillRequiresEnoughBalance() (gas: 37260)\n[PASS] test_unlimitedAllowanceCanBeRevokedAndReplaced() (gas: 303216)\n[PASS] test_unlimitedAllowanceDoesNotBypassBalanceChecks() (gas: 110154)\n[PASS] test_zeroApprovalStillRejectsZeroSpender() (gas: 34612)\n[PASS] test_zeroDelegatedTransferToZeroStillReverts() (gas: 53357)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 228.39ms (1.47s CPU time)\n\nRan 2 tests for test/BloxIMDInvariant.t.sol:BloxIMDInvariantTest\n[PASS]\nBloxIMDInvariantTest invariants:\n[PASS] invariant_allowancesMatchAuthorizations\n[PASS] invariant_balancesMatchAuthorizedTransfers\n[PASS] invariant_supplyEqualsSumOfAllReachableBalances\n BloxIMDInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------+---------------------------+-------+---------+----------╮\n| Contract       | Selector                  | Calls | Reverts | Discards |\n+=========================================================================+\n| BloxIMDHandler | approve                   | 4082  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | approveZeroSpender        | 4144  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | transfer                  | 4080  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | transferFrom              | 4052  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | transferFromOverAllowance | 4040  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | transferFromOverBalance   | 4171  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | transferOverBalance       | 4054  | 0       | 0        |\n|----------------+---------------------------+-------+---------+----------|\n| BloxIMDHandler | transferToZero            | 4145  | 0       | 0        |\n╰----------------+---------------------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesTransfersAndRejections() (gas: 8084308)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.12s (8.12s CPU time)\n\nRan 3 test suites in 8.12s (8.58s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":27,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BloxIMD.approve(address,uint256)\",\"BloxIMD.transfer(address,uint256)\",\"BloxIMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":109,\"foundry.toml\":14,\"src/BloxIMD.sol\":15,\"test/BloxIMD.t.sol\":305,\"test/BloxIMDInvariant.t.sol\":137,\"test/BloxIMDProperties.t.sol\":292,\"test/README.md\":64,\"test/helpers/BloxIMDHandler.sol\":184,\"test/helpers/BloxIMDTestSupport.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"eb589b1b001f2d98894e311ef83a1bc0d019ca46cf9118050a461c0931bb4ee4","verifiedTreeHash":"e4c119a16d2bbca4fb7b4c5c41dc8e1baccca4b3","verifierVersion":"0.1.0+8fbf00a5"}]}