{"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":"86cb79e1-3969-49e2-81c4-37d09ef48fbb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"6229a1765b744c1bb03a712454a9838e9827f039136f865f49fe3343d4146f79","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":"2099c005314ffc98d3f573717be3c727b7ae31e12d2549d5f7ab7f05f8ec3cd3","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":"0853918366b4b07c93d708457aff75621fdf895833e6dcc3a0bf24d3993c92a6","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"9a4bd57cac03efb4f922881f1695d2fb28948fdf56484e3c5e7a45901a38937d","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":"02a4af87fba0992235c8ce2fb096f6d5769fdcc83bae34108204712b760c31f6","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":"2273b5df74f2a0f7d6b476a4f2794acdb63631a4e3ab0213e053a7f1c265beff","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"023656ef95fdde8f2bb70dc1d27f5c2292db3432523cc0fa26d4a422f82e4c2c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a83b71996546b125fa086f22c2d48869502486d32168e23e567b140e0cdff765","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: AINSEM (AINSEM).\nToken name: AINSEM\nToken symbol: AINSEM\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: 1% on each transfer, no minting after launch","parentJobId":null,"planHash":"11479781ef271cc6285bf62dcced6b6edb4f608911ab3283489890339446f5a1","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"86cb79e1-3969-49e2-81c4-37d09ef48fbb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-824-ainsem"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51039","feedbackHash":"ff98e93bb5d37396f4dc64786a0acab68b2f7ee85a83f776b097a31b5d09639f","nodeKey":"audit_economics","submissionHash":"6229a1765b744c1bb03a712454a9838e9827f039136f865f49fe3343d4146f79","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52130","feedbackHash":"e8b91d1d0035409bdffc62d90eaa7b2e385485151f8b42b68b86d9b6eaf3e9e1","nodeKey":"audit_flow","submissionHash":"2099c005314ffc98d3f573717be3c727b7ae31e12d2549d5f7ab7f05f8ec3cd3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52129","feedbackHash":"bfe0bb6617ee0228740ee8f63e3266afe29fa48f96b32e854f5eaf8b55833114","nodeKey":"audit_judge","submissionHash":"0853918366b4b07c93d708457aff75621fdf895833e6dcc3a0bf24d3993c92a6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52205","feedbackHash":"821da8ce053a3c52dd34bd86343d47f77e8ffe65b54ac40bc110e7dfb49b2d9b","nodeKey":"audit_math","submissionHash":"9a4bd57cac03efb4f922881f1695d2fb28948fdf56484e3c5e7a45901a38937d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51382","feedbackHash":"6b99ce0462bb9eec6b52691db4b75f414a4a64a56d1f44b16dd2b2451c4c3103","nodeKey":"audit_permissions","submissionHash":"02a4af87fba0992235c8ce2fb096f6d5769fdcc83bae34108204712b760c31f6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51103","feedbackHash":"d10f029cee8c24408f1f6c3996a15d6d5df7200210ec3bad775a7d44811d64cf","nodeKey":"build_contract_project","submissionHash":"2273b5df74f2a0f7d6b476a4f2794acdb63631a4e3ab0213e053a7f1c265beff","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51736","feedbackHash":"54421014408e77678978f612064894e07a92af301c2059b614954c56fa7dbe6f","nodeKey":"manifest","submissionHash":"023656ef95fdde8f2bb70dc1d27f5c2292db3432523cc0fa26d4a422f82e4c2c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51380","feedbackHash":"f5d33a7e1d4d3ee8992b84097221c0d9a8603f9cc5d4d28081e0f6e9f0788d3c","nodeKey":"write_foundry_tests","submissionHash":"a83b71996546b125fa086f22c2d48869502486d32168e23e567b140e0cdff765","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c851a60dec7240e95debe01801e353fea9dabf59d8dc8c34c8c505d84af26f39","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"48143cb42a0fac6aeff0eff2b5b3b5b6f8004292f5cd15657c859da62b30d12b","device":"080b27034220eb6f","findings":[],"hash":"023656ef95fdde8f2bb70dc1d27f5c2292db3432523cc0fa26d4a422f82e4c2c","nodeId":"6831e3c6-bf63-4bf9-adab-06123fb0f1d4","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/86cb79e1-3969-49e2-81c4-37d09ef48fbb/6831e3c6-bf63-4bf9-adab-06123fb0f1d4/launch.json) matching AINSEM’s constructor, supply, and exact requested economics.\n\nValidation passed: supplied schema, constructor ABI, `forge build`, and all 34 local tests. Only `launch.json` is changed for submission.","treeHash":"b79c153b39664b2ed6bf63eb3393122a5a16d2df","usage":{"cachedInputTokens":168320,"inputTokens":31607,"model":"gpt-6-astra","outputTokens":2969,"runtime":"codex","turns":3,"wallClockMs":91003}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"85f29f4c09dba910","findings":[{"citation":"resolved","description":"Area: Trust Gap (access x asymmetry x economics), with the Asymmetry guide's branch diff. The exemption predicate treats the pool manager asymmetrically from every other counterparty: a transfer is exempt whenever the recipient is the pool manager (`to == poolManager`) and whenever the sender is the pool manager (`from == poolManager`), with no condition on who initiated the call. The Uniswap v4 PoolManager is a permissionless singleton whose custody primitives (`unlock`, `sync`, `settle`, `take`, and ERC-6909 `mint`/`burn`) are callable by anyone and do not require a swap. Chaining the two exempt legs in one `unlock` therefore gives every holder a tax-free transfer to any recipient: deposit via `sync` + `transfer(poolManager, X)` + `settle` (exempt by `to == poolManager`), then `take(token, recipient, X)` (exempt by `from == poolManager`). Net effect: sender debited X, recipient credited X, supply unchanged, so the requester's stated rule ('1% on each transfer') is enforceable only against holders who do not know this route, and the deflation the rule promises can be avoided at the cost of gas. The same bypass applies to ERC-6909 claim tokens: mint claims to oneself, transfer the claims inside the PoolManager (no AINSEM transfer occurs), and let the counterparty `burn` + `take`. Trust framing: the README discloses that pool-routed transfers are untaxed, and the protected launch floor requires an ordinary trader to be able to sell exactly into the pool (v4 settle credits the balance delta, so a taxed inbound leg would leave a non-zero delta and revert the swap). The `to == poolManager` and `from == poolManager` legs are therefore required by the agreed design, and this is a design consequence to be accepted explicitly rather than a bug with a drop-in fix. Options if the requester wants a stronger guarantee: (a) accept and document that the 1% burn applies only to transfers that do not touch the launch pool infrastructure (current state); or (b) narrow the outbound leg, e.g. keep `to == poolManager` exempt but tax `from == poolManager` transfers only when the recipient is not the current locker, which v4 does not expose, so (b) is not implementable from the token alone. No concrete victim loses funds; the harm is that the economic rule is weaker than stated. Guard gap: the distributor and factory exemptions are keyed on `msg.sender`/`from` identity of a trusted contract that only moves tokens on launch flows; the pool manager exemption is keyed on a permissionless custody contract that moves tokens on behalf of any caller.","line":61,"path":"src/AINSEM.sol","reproduction":"State: token deployed by the factory with poolManager = PM; factory transferred 1,000,000 AINSEM to ALICE (exempt, arrives whole). Control: ALICE calls transfer(BOB, 500,000e18) -> BOB receives 495,000e18 and totalSupply falls by 5,000e18. Bypass: ALICE approves a helper contract H for 500,000e18 and calls H.move(BOB, 500,000e18). H calls PM.unlock(); inside unlockCallback H calls PM.sync(token); token.transferFrom(ALICE, PM, 500,000e18) [msg.sender = H, to = PM -> _isExempt true, no burn]; PM.settle() credits H with +500,000e18; PM.take(token, BOB, 500,000e18) -> PM calls token.transfer(BOB, 500,000e18) [from = PM -> _isExempt true, no burn]; delta returns to zero and unlock completes. Expected under the stated rule: BOB receives 495,000e18 and 5,000e18 is burned. Actual: BOB receives 500,000e18, ALICE's balance is 0, PM holds 0, totalSupply unchanged by the bridged leg (still only 5,000e18 below the deployment supply from the control transfer). Verified locally with test/scratch/PoolManagerBridge.t.sol, which models the v4 PoolManager's unlock/sync/settle/take accounting (v4-core is not vendored in lib/ and lib/ may not be modified); the test passes on the current code, demonstrating the untaxed path: `forge test --match-path test/scratch/PoolManagerBridge.t.sol`. Against a real v4 PoolManager the sequence is identical, using IPoolManager.unlock, sync, settle, take.","severity":"low","snippet":"        if (msg.sender == factory || msg.sender == poolManager || from == poolManager || to == poolManager) {","title":"PoolManager exemption lets any holder route transfers through the pool manager's custody with zero burn (access x asymmetry x economics)"}],"hash":"02a4af87fba0992235c8ce2fb096f6d5769fdcc83bae34108204712b760c31f6","nodeId":"365274e9-f5df-4a9c-83da-bbe4619ed124","outcome":"completed","summary":"Review complete. The findings file is written and validated, with the snippet matching the source line exactly.\n\n**Outcome:** one low-severity finding in my area, and all three entry points covered.\n\n**Finding 1 (low), `src/AINSEM.sol:61`.** The exemption predicate exempts any transfer whose recipient or sender is the pool manager, regardless of who initiated it. Since the Uniswap v4 PoolManager is a permissionless singleton, any holder can chain the two exempt legs in one `unlock` call: deposit via sync/settle, then `take` to any recipient. The result is a tax-free transfer to anyone at the cost of gas, so the requester's \"1% on each transfer\" rule holds only against holders who do not route through the pool manager. I confirmed this with a scratch test modelling v4's settlement accounting. The direct half of a transfer burned 5,000 tokens while the bridged half burned nothing. The README discloses this, and the protected launch floor requires the inbound leg to be exempt so traders can sell exactly, so this is a design consequence to accept explicitly rather than a bug with a drop-in fix. No concrete victim loses funds.\n\n**What holds in my area:**\n- No owner, roles, initializer, mint, pause, blacklist, freeze, seize or burnFrom paths exist. All configuration is immutable.\n- Constructor enforces the deployer is the declared factory and mints exactly once to it.\n- The distributor lookup is a bounded STATICCALL that cannot reenter or freeze holders. Its correctness rests on the factory exposing `distributorOf(uint64)` honestly, which is a trust assumption on the launch infrastructure.\n- Exemptions only waive the burn. They never bypass the allowance or balance checks, so no exempt party can move a holder's balance.\n\n**Not reached:** nothing in the assigned guides was left unchecked for this three-function surface. I did not run the protected harness since it needs the network's v4 fixtures and manifest environment, which are not in this tree.","treeHash":null,"usage":{"cachedInputTokens":712211,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":14750,"runtime":"claude","turns":15,"wallClockMs":237592}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"63c29c49a249ab7e","findings":[{"citation":"resolved","description":"Three specialists reported the same root cause at the same line; merged into one finding at low. _isExempt waives the burn whenever the recipient is the PoolManager (to == poolManager) and whenever the PoolManager is the caller or sender. Uniswap v4's PoolManager is a permissionless singleton: any account can unlock(), sync(token), pay tokens in, settle() for a credit, and take(token, anyRecipient, amount). The pay-in leg is exempt (to == poolManager) and the pay-out leg is exempt (msg.sender == poolManager), so an A -> B transfer of any size completes with zero burn at gas cost only; the credit can also be minted as ERC-6909 claims and moved inside the PoolManager with no AINSEM transfer at all. Reproduced locally with a model of v4 flash accounting (v4-core is not vendored and lib/ may not be changed). Impact: no holder loses funds and supply never grows; the stated rule '1% on each transfer' in practice applies only to direct holder-to-holder transfers and can be routed around by any router or sophisticated holder. Recalibration: the to == poolManager and msg.sender == poolManager legs are required by the protected launch floor (an exact-input sell settles exactly `bought` into the PoolManager and a buy pays out from it; taxing either leg leaves a non-zero delta and reverts the swap), and README lines 29 and 86 disclose that the token does not enforce a universal tax. This is therefore a design consequence the requester should accept explicitly, not a bug with a drop-in fix. Fix options: (a) accept and document, as now; or (b) change the brief (e.g. tax only direct transfers) - the token alone cannot distinguish a swap settlement from a bridged transfer.","line":61,"path":"src/AINSEM.sol","reproduction":"State: token deployed by factory F with poolManager PM (model with sync/settle/take). F.transfer(ALICE, 1000e18) (exempt, arrives whole). Control: ALICE.transfer(BOB, 100e18) -> BOB = 99e18, totalSupply = S - 1e18. Bypass: ALICE approves router R for 100e18; R calls PM.sync(token); token.transferFrom(ALICE, PM, 100e18) [to == PM -> exempt, PM receives exactly 100e18]; PM.settle() credits R 100e18; PM.take(token, BOB, 100e18) [msg.sender == PM -> exempt]. Expected under '1% on each transfer': BOB = 198e18, totalSupply = S - 2e18. Actual: BOB = 199e18, totalSupply = S - 1e18, PM balance 0. Run: test/scratch/Judge.t.sol::test_poolManagerRouteSkipsBurn passes on the current code showing the untaxed path.","severity":"low","snippet":"        if (msg.sender == factory || msg.sender == poolManager || from == poolManager || to == poolManager) {","title":"1% burn is optional: any holder can move tokens burn-free by routing through the exempt PoolManager (merged: audit_permissions, audit_economics, audit_flow)"},{"citation":"resolved","description":"Two specialists reported the same mechanism; merged at low. The distributor exemption depends on a STATICCALL to factory.distributorOf(launchNumber) capped at DISTRIBUTOR_LOOKUP_GAS = 30_000 (line 16). On revert, out-of-gas inside that cap, or a non-32-byte return, _distributor() returns address(0), _isExempt() is false, and the claim falls through to the ordinary path: the distributor is debited the full amount, the claimant receives amount - amount/100 and the rest is burned. Nothing reverts, so a Merkle claim is recorded as paid while it arrived 1% short, which shorts the last claimant - the 'launch flow that arrives short' the floor refuses. Fail-open is the right choice for ordinary holders (a dead registry must not freeze transfers), but the precondition is an unverified assumption about the real ProjectFactory's getter, whose source is not in this tree; the protected harness probe is a plain mapping getter (~2.6k gas) and passes. I confirmed the ruled-out paths: an outside caller cannot starve the lookup by tuning the outer gas limit (EIP-150 leaves the token at most 1/64 of what the lookup needed, below the two balance writes that follow), and a failed lookup never lets a holder avoid the burn. Fix options that keep the design: record evidence of the production getter's cold gas cost well under 30,000 with the launch; or raise the cap; or revert instead of taxing when the lookup fails and from == a previously resolved distributor.","line":84,"path":"src/AINSEM.sol","reproduction":"State: factory.distributorOf(7) == DIST; factory transfers 100e18 to DIST (exact). Healthy: vm.prank(DIST); token.transfer(CLAIMANT, 50e18) -> CLAIMANT = 50e18, supply unchanged. Then vm.etch(factory, hex\"5b600056\") (JUMPDEST PUSH1 0 JUMP: a getter that consumes all forwarded gas, modelling a read that needs more than 30,000). vm.prank(DIST); token.transfer(CLAIMANT, 50e18) returns true. Expected for a claim: CLAIMANT = 100e18, supply unchanged. Actual: CLAIMANT = 99.5e18, totalSupply drops by 0.5e18, DIST = 0, no revert. With a correct getter that reads N extra cold slots before answering, claims are exact up to N = 10 and taxed from N = 11 on (test_slowCorrectGetterCliff). Run: test/scratch/Judge.t.sol::test_slowRegistrySilentlyTaxesClaim.","severity":"low","snippet":"        if (!success || result > type(uint160).max) return address(0);","title":"A distributor claim is silently taxed 1% (not reverted) when factory.distributorOf fails, is malformed, or costs more than the hard-coded 30,000-gas lookup (merged: audit_economics, audit_math)"},{"citation":"resolved","description":"Reproduced from audit_math (info). burnAmount = amount / 100 (line 52) never reads BURN_BPS, so the public constant is advertising only; the two agree today (floor(amount*100/10000) == floor(amount/100) for all amounts) but a later edit to either would not move the other. The rounding itself is intended and documented in README lines 10 and 15: transfers below 100 base units burn nothing and every transfer under-burns by at most 99 base units (9.9e-17 AINSEM), economically irrelevant at 18 decimals. No overflow or truncation path exists (amount <= 1e27). No action required beyond either using the constant in the formula or removing it.","line":15,"path":"src/AINSEM.sol","reproduction":"Ordinary holder ALICE with 10,000 base units: transfer(BOB, 99) -> BOB +99, no burn; transfer(BOB, 199) -> BOB +198, burn 1; transfer(BOB, 100) -> BOB +99, burn 1; totalSupply == INITIAL_SUPPLY - 2. Run: test/scratch/Judge.t.sol::test_roundingSweep. Static: grep BURN_BPS src/AINSEM.sol shows one declaration and no use.","severity":"info","snippet":"    uint256 public constant BURN_BPS = 100;","title":"BURN_BPS is a public constant that the burn calculation does not use; the rate is hard-coded as '/ 100' and rounds down (documented)"},{"citation":"resolved","description":"Reproduced from audit_math (info). README line 76 and lib/README.md state that sha256sum -c lib/SHA256SUMS passes. In this tree six forge-std files fail (StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol); the five OpenZeppelin files the production token compiles against pass, so deployed bytecode is unaffected. The record and the README claim are untrue for the test library. Fix: regenerate SHA256SUMS from the current bytes (or restore the upstream v1.9.6 bytes) and update the README's recorded results, which also still say 34 tests where the suite now has 45.","line":17,"path":"lib/SHA256SUMS","reproduction":"From the repository root: sha256sum -c lib/SHA256SUMS -> six lines ending in FAILED and 'WARNING: 6 computed checksums did NOT match'. Expected: every line OK, as README line 76 and lib/README.md state.","severity":"info","snippet":"37cdc22402df6c218ca65502e7fa2a24a3ce5b796eaaee330ad84fb9578bc73c  lib/forge-std/src/Vm.sol","title":"lib/SHA256SUMS no longer verifies: six vendored forge-std files differ from the recorded bytes (test-only library; README claim is stale)"},{"citation":"resolved","description":"The README tells the operator to use \"src/AINSEM.sol:AINSEM\" for token.contract. The canonical LaunchManifest schema constrains token.contract to ^[A-Za-z_][A-Za-z0-9_]{0,31}$, which that string fails ('/', '.', ':'). The committed launch.json uses \"AINSEM\" and validates, so there is no deployment defect; the documentation would mislead anyone regenerating the manifest from the README.","line":53,"path":"README.md","reproduction":"Apply the schema pattern ^[A-Za-z_][A-Za-z0-9_]{0,31}$ to \"src/AINSEM.sol:AINSEM\": no match. Apply it to launch.json's \"AINSEM\": match. Expected: README example equals the schema-valid value used in launch.json.","severity":"info","snippet":"  \"contract\": \"src/AINSEM.sol:AINSEM\",","title":"README's suggested manifest token entry uses a contract value the LaunchManifest schema rejects (launch.json itself is correct)"}],"hash":"0853918366b4b07c93d708457aff75621fdf895833e6dcc3a0bf24d3993c92a6","nodeId":"fda1b19b-73cc-435e-8eac-c088851dce71","outcome":"completed","summary":"All five snippets anchor exactly to the tree, the coverage record answers all three entry points, and `git status` shows no tracked file changed. The review is complete.\n\n**Outcome:** the audit holds up. No critical, high, or medium defects exist in `src/AINSEM.sol`. All 45 project tests pass, `lib/` is 34 plain tracked files with no submodule, and the manifest validates against the schema.\n\n**Findings kept, written to `.imd-findings.json`:**\n\n- **Low, merged from three specialists.** Any holder can move tokens burn-free by routing through the PoolManager, since both the pay-in leg and the pay-out leg are exempt. Reproduced with a v4 flash-accounting model: the routed leg delivered 100 of 100 with supply unchanged, while a direct transfer delivered 99. It is forced by the launch floor and disclosed in the README, so it is a design consequence for the requester to accept, not a bug.\n- **Low, merged from two specialists.** A claim is silently taxed, not reverted, when the registry read fails or exceeds its 30,000 gas cap. Reproduced by etching a gas-exhausting getter at the factory. A correct getter stayed exact up to 10 extra cold reads and taxed from 11 on. The production factory's getter cost is unverified in this tree.\n- **Info.** The public constant for the burn rate is never used by the burn formula, and rounding down is documented behaviour.\n- **Info.** The checksum file fails on six forge-std files, contradicting the README. Production OpenZeppelin files are intact.\n- **Info, my own.** The README's example manifest entry uses a contract value the schema rejects. The committed launch.json is correct.\n\n**Dropped:** nothing substantive. The rounding report was folded into the unused-constant note because the behaviour is intended and documented.\n\n**Coverage:** approve holds; transfer and transferFrom carry finding 1. Four invariant rows cover supply, exact launch flows, absence of privileged controls and forbidden opcodes, and the constructor plus manifest.","treeHash":null,"usage":{"cachedInputTokens":370960,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":16159,"runtime":"claude","turns":15,"wallClockMs":255337}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1c29c7c6e4cf57eb","findings":[{"citation":"resolved","description":"The brief says '1% on each transfer'. _isExempt waives the burn whenever the recipient is the PoolManager (to == poolManager) and whenever the PoolManager is the caller or sender (msg.sender/from == poolManager). In Uniswap v4 anyone can call unlock() and, inside the callback, sync(AINSEM), send AINSEM to the PoolManager, settle() and then take(AINSEM, anyRecipient, amount). The pay-in leg is exempt because to == poolManager, and the take leg is exempt because msg.sender == poolManager. So any holder, or a public router contract, can move any amount to any address with no burn. Swaps through the launch pool are also never taxed. The README documents this as a design choice ('the token does not enforce a universal economic tax'), and the launch floor requires PoolManager flows to move exact amounts. Taxing either leg would short a pool settlement or a buy, so this cannot be fixed inside the token without breaking the launch floor. It is reported so the requester knows the 1% applies only to direct holder-to-holder transfers, and that any integration can route around it at gas cost only. Fixing it means relaxing the brief, for example taxing only direct EOA/contract transfers, or accepting the bypass explicitly; changing the code alone does not fix it. Severity is info because no funds are lost and the behavior is documented.","line":61,"path":"src/AINSEM.sol","reproduction":"State: token deployed with factory F and poolManager PM. A real v4 PoolManager is modeled by a contract that keeps a per-caller credit equal to balanceOf(PM) - reserves at settle and sends credit out via take. F sends Alice 1,000e18. Alice approves router R for 100e18. R calls PM.sync(AINSEM), then AINSEM.transferFrom(Alice, PM, 100e18), which is exempt because to == PM, so PM receives 100e18 and nothing is burned. R then calls PM.settle(), which credits R with 100e18, and PM.take(AINSEM, Bob, 100e18), which is exempt because msg.sender == PM. Expected under '1% on each transfer': Bob receives 99e18 and totalSupply falls by 1e18. Actual: Bob receives 100e18 and totalSupply is unchanged. For comparison, a direct Alice.transfer(Bob, 100e18) delivers 99e18. A local Foundry test of exactly this sequence passed with Bob's balance equal to 100e18 and supply unchanged.","severity":"info","snippet":"        if (msg.sender == factory || msg.sender == poolManager || from == poolManager || to == poolManager) {","title":"The 1% burn is optional: any holder can skip it on a peer-to-peer transfer by routing it through PoolManager flash accounting"}],"hash":"2099c005314ffc98d3f573717be3c727b7ae31e12d2549d5f7ab7f05f8ec3cd3","nodeId":"e97041c8-a284-4738-acff-7704199947a8","outcome":"completed","summary":"I found no critical, high, medium or low defects in `src/AINSEM.sol`. There is one info-level finding, and the results are in `.imd-findings.json`, which is valid JSON. No other files changed: the two scratch tests I wrote under `test/scratch/` were run and then deleted.\n\n**The finding (info): `src/AINSEM.sol:61`.** The 1% burn can be skipped by anyone. The token doesn't burn when tokens go to the PoolManager, or when the PoolManager is the sender or caller. So any holder, or a router acting for them, can do this inside a PoolManager unlock: `sync` the token, `transferFrom` their tokens to the PoolManager, `settle`, then `take` them out to any recipient. The recipient gets the full amount and nothing is burned. A scratch test of this sequence showed Bob receiving 100e18 with supply unchanged; a direct transfer of the same amount delivered 99e18. Swaps in the launch pool are never taxed either. The README already documents this, and the launch floor requires PoolManager flows to move exact amounts. The token can't close this gap without breaking that floor, so it's a decision on the brief, not a code fix.\n\n**Coverage:**\n- **`approve`:** holds. It is the standard OpenZeppelin v5 version, unchanged.\n- **`transfer`, `transferFrom`:** marked as having the finding. Apart from the bypass, everything else I traced behaves as intended:\n  - the full requested amount is checked against the balance before anything happens;\n  - the burn is exactly `floor(amount/100)`, and a self-transfer loses only the burn;\n  - `transferFrom` charges the allowance for the full amount, and exempt callers still can't spend without an allowance;\n  - the distributor is looked up fresh on each transfer, never cached, and the lookup's return data is checked before use.\n- **Extra rows, all holding:**\n  - **Supply:** it can never grow after construction.\n  - **Launch flows:** the transfers out of the factory, the distributor's claim payouts, the pool seed, and buys and sells all arrive in full.\n  - **Constructor:** it validates its arguments and grants no roles.\n  - **Gas griefing:** limiting gas cannot make the distributor lookup fail while a claim still succeeds, so a claim can't be taxed that way. I tried every gas limit from 5k to 200k on a claim, and every claim that went through delivered the full amount.\n\n**Static analysis:** slither reported nothing. aderyn's \"large numeric literal\" at line 14 is just the supply constant and isn't a defect.\n\n**Limits:**\n- Uniswap v4 isn't vendored, so I modeled the PoolManager's `sync`/`settle`/`take` accounting with a small mock rather than the real contract.\n- The real ProjectFactory isn't in the tree. The gas result assumes its `distributorOf` is a cheap read, well under the 30,000-gas lookup limit. If it costs more, every distributor claim would be taxed 1%, as the README warns.\n- The existing suite still passes (34 of 34 tests).","treeHash":null,"usage":{"cachedInputTokens":556503,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":13636,"runtime":"claude","turns":11,"wallClockMs":171410}},{"artifacts":[],"attempt":1,"bundleHash":"5c77e206ff60f4cb338040fae2bd3f3f8d41ccd6b2e90635915f64e8fb24b92f","device":"fd4958ee1ca0d1f2","findings":[],"hash":"2273b5df74f2a0f7d6b476a4f2794acdb63631a4e3ab0213e053a7f1c265beff","nodeId":"f47088cd-5dd9-4956-8bbb-1a7a921fcdb2","outcome":"completed","summary":"Implemented AINSEM with 1 billion tokens, 18 decimals, minted once to the deployer.\n\nThe 1% charge burns tokens on ordinary transfers, with required launch exemptions. Dependencies are vendored; assumptions and deployment responsibilities are documented in [README.md](/home/seat/.identitymd/work/86cb79e1-3969-49e2-81c4-37d09ef48fbb/f47088cd-5dd9-4956-8bbb-1a7a921fcdb2/README.md).\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed\n- `forge test`: 34 passed\n- `forge fmt --check` passed","treeHash":"ee02264e48467dd722a1465768fbfe8c2705a375","usage":{"cachedInputTokens":449664,"inputTokens":48573,"model":"gpt-6-astra","outputTokens":16888,"runtime":"codex","turns":7,"wallClockMs":489158}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9ab27edcfd62be02","findings":[{"citation":"resolved","description":"The requested rule is '1% on each transfer'. _isExempt waives the burn whenever the recipient is the PoolManager, regardless of who the caller is, and whenever the sender is the PoolManager. Uniswap v4 lets any unprivileged account drive both legs inside PoolManager.unlock: sync(token) -> token.transfer(poolManager, X) -> settle() credits X to the caller -> take(token, recipient, X) pays X out from the PoolManager to any address. Each leg is exempt, so an A->B value movement completes with zero burn. The same credit can instead be minted as ERC-6909 claim tokens, which are transferable with no AINSEM burn at all. Cost to the bypasser is only gas; nobody loses funds directly, but the token's single economic mechanism (deflation benefiting all holders) becomes optional for any sophisticated transferor, router or aggregator. The README discloses this ('the token does not enforce a universal economic tax'), and the to == poolManager exemption is forced by the launch floor: an exact-input sell settles exactly `bought` tokens into the PoolManager and would revert with CurrencyNotSettled if taxed. Reported so the requester decides consciously; it cannot be removed without failing the protected swap test. Economic lens: Legitimate features turned against the protocol / Flow Gap seam periphery x first-principles.","line":61,"path":"src/AINSEM.sol","reproduction":"State: ALICE holds 1,000e18 AINSEM; `manager` is the configured poolManager (any contract with v4 sync/settle/take semantics). (1) ALICE.transfer(BOB, 100e18) -> BOB +99e18, totalSupply -1e18 (burn applied, as specified). (2) ALICE, inside unlock: manager.sync(token); token.transfer(manager, 100e18) [to == poolManager -> exempt, PoolManager receives exactly 100e18]; manager.settle() returns 100e18 credit; manager.take(token, BOB, 100e18) [msg.sender/from == poolManager -> exempt]. Result: BOB +100e18, totalSupply unchanged. Expected under '1% on each transfer': BOB +99e18 and 1e18 burned. Actual: 0 burned. Verified with a PoolManager model in test/scratch/EconReview.t.sol::test_poolManagerRouteBypassesBurn (BOB ends at 199e18 after both routes, totalSupply = SUPPLY - 1e18).","severity":"low","snippet":"        if (msg.sender == factory || msg.sender == poolManager || from == poolManager || to == poolManager) {","title":"1% burn is bypassable at gas-only cost by routing an ordinary transfer through the PoolManager (to == poolManager and from == poolManager are both exempt)"},{"citation":"resolved","description":"The distributor exemption is resolved by a bounded STATICCALL to factory.distributorOf(launchNumber); on any failure (revert, out-of-gas within the 30,000 allowance, malformed return) the token treats the launch as having no distributor and applies the 1% burn. This design correctly protects ordinary holders from a broken registry, but it means a claim executed while the real ProjectFactory's getter costs more than 30,000 gas (for example a factory behind a beacon proxy plus extra reads, or a getter that derives the distributor address) does not revert: the claim succeeds and the claimant receives 99% while the MerkleDistributor's last claimant is shorted. The verifier's probe is a plain mapping getter (well under the budget), and the README documents the requirement, so this holds for the attested deployment path; it is recorded as the one state in which the 'claims arrive whole' guarantee degrades silently rather than loudly. I also checked that gas starvation of the outer call cannot cause this: either the lookup receives its full 30,000 or the outer transfer itself runs out of gas (test_lowGasClaimEitherRevertsOrArrivesWhole, gas limits 20k..120k).","line":84,"path":"src/AINSEM.sol","reproduction":"State: factory.distributorOf(42) == DISTRIBUTOR; DISTRIBUTOR holds 100e18. Replace the factory runtime with code that spins until the forwarded gas is gone (vm.etch(factory, hex\"5b600056\")), modelling a getter that needs > 30,000 gas. DISTRIBUTOR.transfer(CLAIMANT, 100e18) returns true; CLAIMANT balance = 99e18, totalSupply = SUPPLY - 1e18. Expected for a claim: CLAIMANT = 100e18, supply unchanged (as in the healthy-registry run of the same call). Verified in test/scratch/EconReview.t.sol::test_slowRegistrySilentlyTaxesClaims.","severity":"info","snippet":"        if (!success || result > type(uint160).max) return address(0);","title":"A registry read that fails or exceeds 30,000 gas silently taxes distributor claims by 1% instead of reverting"}],"hash":"6229a1765b744c1bb03a712454a9838e9827f039136f865f49fe3343d4146f79","nodeId":"3b8411df-c28b-42d4-838f-c7aef7f047d5","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with two findings and eight coverage rows; no source files were changed.\n\n**Outcome.** The token's economics hold up well. Supply conservation, gross-allowance accounting, no post-launch mint, and exact movement on every launch flow (factory to distributor, distributor to claimant, seed, buy, sell) all trace correctly, and the existing 34 tests plus my scratch checks confirm them. I found no loss-of-funds or permanent-breakage defect.\n\n**Findings reported:**\n\n- **Low, `src/AINSEM.sol:61`.** The 1% burn can be bypassed at gas-only cost. Both `to == poolManager` and `from == poolManager` are exempt, so any unprivileged account can do sync, transfer in, settle, take out inside a Uniswap v4 unlock and move value A to B with zero burn, or hold it as untaxed ERC-6909 claims. Reproduced with a PoolManager model: the same 100e18 move burns 1e18 directly and 0 via the manager. The README discloses this and the exemption is forced by the launch floor, since an exact-input sell would revert if taxed. Reported so the requester accepts it knowingly.\n- **Info, `src/AINSEM.sol:84`.** If the real factory's distributor getter reverts or needs more than the 30,000-gas lookup budget, a claim does not revert. It succeeds with the claimant shorted 1%. The verifier's probe is a plain mapping getter, so this does not trigger on the attested path. I also verified that gas starvation of the outer call cannot cause it: across gas limits from 20k to 120k, every successful claim arrived whole.\n\n**Coverage.** All three entry points have rows. `approve` holds. `transfer` and `transferFrom` point to finding 1. Five invariant rows (balance sum, non-increasing supply, exact launch flows, no privileged balance movement, no gas-starvation taxing) all hold.\n\n**Not reached.** I could not verify the real ProjectFactory's `distributorOf` gas cost or return shape, nor run the protected harness, since the v4 and LaunchLiquidity sources are not vendored. Those remain operational assumptions, as the README states.","treeHash":null,"usage":{"cachedInputTokens":837148,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":22683,"runtime":"claude","turns":18,"wallClockMs":347239}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa5c50e7abe46571","findings":[{"citation":"resolved","description":"Numerical Gap seam: boundary x invariant. The invariant 'a claim leaves the distributor whole' is enforced only when the registry STATICCALL succeeds inside a fixed numeric bound (DISTRIBUTOR_LOOKUP_GAS = 30_000, line 16). At the edge of that bound _distributor() returns address(0) (line 84), _isExempt() returns false, and the claim falls through to the ordinary path: the distributor is debited the full amount, the claimant receives amount - amount/100, and amount/100 is burned. Nothing reverts, so a Merkle claim is marked paid while it arrived 1% short, which is the 'launch flow that arrives short' the launch floor refuses. The cap is an unverified assumption about the real ProjectFactory.distributorOf, whose source is not in this tree; only the test mock (a single mapping read, about 3,100 gas measured cold from the caller) is exercised. Measured cliff: a correct getter that costs up to ~28,300 gas keeps claims exact; at ~30,600 gas (one mapping read plus 12 further cold SLOADs) every claim is taxed. The same happens for any reverting or malformed read (README line 31 says claims 'must not be executed while the registry is unhealthy', but the token cannot enforce that and claims are normally permissionless). What I ruled out, so the precondition is limited to the registry's own cost/health: (a) an outside caller cannot starve the lookup with a tuned gas limit - EIP-150 leaves the token at most 1/64 of what the lookup needed (<476 gas for any getter under the cap), far below the two balance writes that follow; a sweep of every gas limit from 5,000 to 120,000 on a claim produced 0 taxed successes, also with a 28k-gas getter; (b) the 1024 call-depth route needs ~(64/63)^1022 = ~1e7 times the gas of the claim, above any block limit; (c) failing closed means 'taxed', so no holder can use a failed lookup to avoid the burn. Fix options that keep the design: obtain evidence that the real factory getter costs well below 30,000 gas cold and record it with the launch; or remember the last successfully resolved non-zero distributor and use it when a later lookup fails (tradeoff: a registry failure then no longer ends the exemption; a successful read returning address(0) still can), or make a transfer whose msg.sender/from could be the distributor revert on a failed lookup instead of taxing it.","line":80,"path":"src/AINSEM.sol","reproduction":"State: token deployed by a factory whose getter is correct but slow: distributorOf(uint64 n) reads 12 distinct cold storage slots (all zero) and then returns dist[n] (about 30,584 gas measured from a caller; 11 extra reads = 28,293 gas). factory.register(7, DIST); factory transfers 100e18 to DIST (exact, msg.sender == factory). Call: vm.prank(DIST); token.transfer(CLAIMANT, 100e18). Expected: balanceOf(CLAIMANT) == 100e18 and totalSupply unchanged (as with 0..11 extra reads). Actual with 12 or more extra reads: balanceOf(CLAIMANT) == 99e18, totalSupply drops by 1e18, balanceOf(DIST) == 0, no revert.","severity":"low","snippet":"            success := staticcall(lookupGas, registry, add(input, 32), mload(input), output, 32)","title":"Distributor claims are silently taxed 1% (not reverted) once factory.distributorOf costs more than the hard-coded 30,000-gas lookup cap"},{"citation":"resolved","description":"Math Precision: zero-rounding and fee rounding direction. burnAmount = floor(amount/100), so the effective rate is below 1% whenever amount % 100 != 0 and is 0% below 100 base units. Splitting defeats the burn entirely in principle. The leak is bounded at 99 base units (9.9e-17 AINSEM) per transfer, so with 18 decimals it is economically irrelevant: avoiding the burn on 1 AINSEM needs about 1.01e16 transfers of 99 base units. README lines 10 and 15 document this as intended, and rounding up instead would make a 1-base-unit transfer deliver nothing, so I am not asking for a change; it is recorded so the judge has the numbers. Related check: the public constant BURN_BPS = 100 (line 15) is not used by the calculation, which hard-codes '/ 100'; the two agree today because floor(amount*100/10000) == floor(amount/100) for every amount, and dividing first cannot overflow, but a later edit to one would not move the other. No overflow, underflow, downcast or scale-mixing path exists: amount <= balance <= 1e27, burnAmount <= amount, divisor is a literal.","line":52,"path":"src/AINSEM.sol","reproduction":"Ordinary holder ALICE (not factory/PoolManager/distributor) with 1,000 base units: transfer(BOB, 99) -> BOB +99, totalSupply unchanged (0% instead of 1%); transfer(BOB, 199) -> BOB +198, burn 1 (0.50%); transfer(BOB, 100) -> BOB +99, burn 1 (exact). 9,900 base units sent as one transfer burn 99; sent as 100 transfers of 99 they burn 0. Boundary sweep run on 0, 1, 99, 100, 101, 199, 200, 9,999, 10,000, 1e18, SUPPLY/3 and SUPPLY/2: sender debit == amount, recipient credit == amount - amount/100, supply drop == amount/100 in every case.","severity":"info","snippet":"        uint256 burnAmount = amount / 100;","title":"Burn rounds down: transfers of 1-99 base units pay no burn and every transfer under-burns by up to 99 base units (documented, dust-sized)"},{"citation":"resolved","description":"README line 76 and lib/README.md state that the vendored sources are unchanged and that 'sha256sum -c lib/SHA256SUMS' passes. In this tree it reports 6 mismatches, all in forge-std (console.sol, interfaces/IMulticall3.sol, StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol). I compared them with upstream forge-std v1.9.6: the differences are line-wrapping only (identical after stripping whitespace), consistent with a formatter having been run over lib/. The five OpenZeppelin v5.1.0 files the production token compiles against are byte-identical to the upstream tag and do pass, so the deployed bytecode is unaffected. The defect is that the integrity record and the README claim are no longer true for the test library.","line":17,"path":"lib/SHA256SUMS","reproduction":"From the repository root: sha256sum -c lib/SHA256SUMS -> 'WARNING: 6 computed checksums did NOT match'. Example: recorded 37cdc22402df...bc73c for lib/forge-std/src/Vm.sol, actual 9ef7ee8c9a0a...f408. Expected: all OK, as the README states.","severity":"info","snippet":"37cdc22402df6c218ca65502e7fa2a24a3ce5b796eaaee330ad84fb9578bc73c  lib/forge-std/src/Vm.sol","title":"Outside my area: lib/SHA256SUMS no longer verifies - six vendored forge-std files differ from the recorded bytes (whitespace only, test-only)"}],"hash":"9a4bd57cac03efb4f922881f1695d2fb28948fdf56484e3c5e7a45901a38937d","nodeId":"2f652ab8-097e-472c-ac40-cac21a24a838","outcome":"completed","summary":"The review is written to `.imd-findings.json`: no critical, high or medium defects in the math, one low finding and two informational notes. No tracked files were changed; the scratch tests I used are deleted.\n\n## Findings\n\n1. **Low — distributor claims are silently taxed if the registry lookup exceeds its gas cap** (`src/AINSEM.sol:80`). The token looks up the distributor with a fixed 30,000-gas call. If the real factory's `distributorOf` costs more than that, or fails, a claim does not revert: the claimant gets 99% and 1% is burned.\n   - **Reproduction:** with a correct getter costing about 30,600 gas, a 100e18 claim delivers 99e18; at about 28,300 gas it is exact.\n   - **Open question:** the real factory is not in the tree. Only the test mock (about 3,100 gas) is exercised, so the cap is an unverified assumption about it.\n   - **Ruled out:** an outside caller cannot force this. A sweep of gas limits on a claim produced no taxed success, and the call-depth route needs more gas than any block allows.\n\n2. **Info — the burn rounds down** (`src/AINSEM.sol:52`). Transfers of 1–99 base units burn nothing, and 199 burns 1. The loss is at most 99 base units per transfer and the README documents it, so I am not asking for a change. `BURN_BPS` is also unused by the calculation, though the two agree today.\n\n3. **Info, outside my area — `lib/SHA256SUMS` no longer verifies.** Six forge-std files differ from the recorded checksums, contrary to the README. The differences are whitespace only and test-only; the OpenZeppelin files the token compiles against match upstream v5.1.0 exactly.\n\n## Coverage\n\n| Target | Verdict | Reason |\n| --- | --- | --- |\n| `AINSEM.approve(address,uint256)` | holds | No arithmetic or external call; unmodified OpenZeppelin. |\n| `AINSEM.transfer(address,uint256)` | finding 1 | Debit, burn and credit are exact at 0, 1, 99, 100, 101 and up to half the supply; only the lookup cap remains. |\n| `AINSEM.transferFrom(address,address,uint256)` | finding 1 | Allowance is spent gross and rolls back on revert; shares the same transfer path. |\n\nThe file also carries rows for the balance and supply invariants, the registry call boundary, and the launch flows. All three guides (Math Precision, Boundary, Numerical Gap) were applied to the whole contract.\n\nOne limit: the launch flows through the pool manager were traced by reading only. The protected harness needs Uniswap v4 and launch fixtures that are not in this tree, so I did not execute it. The repository's own 34 tests pass.","treeHash":null,"usage":{"cachedInputTokens":859416,"inputTokens":22,"model":"claude-fable-5-1","outputTokens":29443,"runtime":"claude","turns":13,"wallClockMs":343047}},{"artifacts":[],"attempt":1,"bundleHash":"17a720e2402fb37a18512ea19f337bc7f51a558ccd5ced2ef58c0dc3b2214b19","device":"f7cb61cceaa27e78","findings":[],"hash":"a83b71996546b125fa086f22c2d48869502486d32168e23e567b140e0cdff765","nodeId":"b1fe0266-25ca-4885-a4cf-0bba8279074c","outcome":"completed","summary":"Added 11 tests under `test/`, covering failure rollback, allowance replay, boundary amounts, distributor changes, and stateful balance/allowance invariants.\n\n`forge build` and `forge test` pass: **45 tests, 0 failures**. The new invariant completed **16,384 calls**.\n\nNo reproducible defects found.","treeHash":"2a55e2011edf4d111cbabb55c4ca238f2a5fd90b","usage":{"cachedInputTokens":795520,"inputTokens":70274,"model":"gpt-6-astra","outputTokens":11164,"runtime":"codex","turns":5,"wallClockMs":385245}}],"verification":[{"checks":[{"durationMs":1679,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.52s\nCompiler run successful!\n","passed":true},{"durationMs":1048,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/AINSEMRegistry.t.sol:AINSEMRegistryTest\n[PASS] test_emptyReturnDoesNotFreezeHolders() (gas: 96227)\n[PASS] test_eoaDeployerWithoutRegistryStillSupportsOrdinaryTransfers() (gas: 129310)\n[PASS] test_excessiveReturnDataDoesNotFreezeHolders() (gas: 194666)\n[PASS] test_exemptPoolFlowsDoNotDependOnRegistryAvailability() (gas: 122236)\n[PASS] test_gasExhaustingRegistryDoesNotFreezeHolders() (gas: 125736)\n[PASS] test_longReturnDoesNotFreezeHolders() (gas: 96371)\n[PASS] test_noncanonicalAddressDoesNotGrantExemption() (gas: 96368)\n[PASS] test_registryCannotReenterToChangeBalances() (gas: 320982)\n[PASS] test_revertingLookupDoesNotFreezeHolders() (gas: 96303)\n[PASS] test_shortReturnDoesNotFreezeHolders() (gas: 96343)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 25.06ms (5.29ms CPU time)\n\nRan 23 tests for test/AINSEM.t.sol:AINSEMTest\n[PASS] testFuzz_rejectsOverspendingWithoutOverflow(uint256) (runs: 512, μ: 117313, ~: 117057)\nLogs:\n  Bound result 2162183479427328123816939679449884050619322945894544767794916969434108922\n\n[PASS] testFuzz_transferConservesBalancesAndBurn(uint256) (runs: 512, μ: 183031, ~: 184981)\nLogs:\n  Bound result 1000000000000000000000000000\n\n[PASS] testFuzz_transferFromAndDirectTransferAgree(uint256,uint256) (runs: 512, μ: 223248, ~: 225547)\nLogs:\n  Bound result 64614405671699470906\n  Bound result 18309485851973930151058661855635356144411271978613934738561\n\n[PASS] test_constructorEmitsWholeMint() (gas: 11966)\n[PASS] test_distributorIsResolvedAfterDeploymentAndOnlyForThisLaunch() (gas: 392779)\n[PASS] test_infiniteApprovalAndRevocation() (gas: 243902)\n[PASS] test_insufficientBalanceIsAtomicEvenAfterAllowanceSpend() (gas: 183211)\n[PASS] test_launchDistributionClaimsSeedBuyAndSellMoveExactAmounts() (gas: 444355)\n[PASS] test_metadataAndConstructorSupply() (gas: 108506)\n[PASS] test_netOnlyAllowanceCannotCoverTransfer() (gas: 177666)\n[PASS] test_noMintOrAdministrativeBackdoors() (gas: 1761260)\n[PASS] test_poolSettlementThroughAllowanceIsExact() (gas: 189103)\n[PASS] test_privilegedCallersStillNeedAllowance() (gas: 209909)\n[PASS] test_rejectsInsufficientGrossBalanceOnSelfTransfer() (gas: 98397)\n[PASS] test_rejectsInvalidDeploymentParameters() (gas: 3990)\n[PASS] test_rejectsZeroAddressesWithoutBurningOrSpendingAllowance() (gas: 272404)\n[PASS] test_roundingAndZeroTransfers() (gas: 328821)\n[PASS] test_runtimeContainsNoForbiddenOpcodes() (gas: 1113154)\n[PASS] test_selfTransferStillBurns() (gas: 126192)\n[PASS] test_sendingToFactoryOrDistributorDoesNotGrantExemption() (gas: 257793)\n[PASS] test_transferBurnsOnePercentAndEmitsBothMovements() (gas: 169689)\n[PASS] test_transferFromToSelfStillBurnsAndSpendsGrossAllowance() (gas: 185185)\n[PASS] test_transferFromUsesGrossAllowance() (gas: 225272)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 33.01ms (102.31ms CPU time)\n\nRan 1 test for test/AINSEMInvariant.t.sol:AINSEMInvariantTest\n[PASS] invariant_balancesEqualSupplyAndBurnsAccountForEveryMissingToken() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2654  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2863  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2675  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 75\n  Bound result 89473962904730835335657405\n  Bound result 902\n  Bound result 96052862054557671933\n  Bound result 95\n  Bound result 79363286894103059636521063\n  Bound result 99000000000000000000\n  Bound result 0\n  Bound result 2835717307\n  Bound result 2\n  Bound result 154960966616128076163234901\n  Bound result 2835717307\n  Bound result 2\n  Bound result 2827\n  Bound result 112834782712176892626406757\n  Bound result 50000000000000000000\n  Bound result 37406459673548400824440818\n  Bound result 530\n  Bound result 6680386810498774316111763\n  Bound result 0\n  Bound result 94437353516142147453728720\n  Bound result 255\n  Bound result 6\n  Bound result 1000000000000000000\n  Bound result 28142141643096\n  Bound result 2442\n  Bound result 528\n  Bound result 4990\n  Bound result 66518665513633814280691333\n  Bound result 2487\n  Bound result 0\n  Bound result 1000\n  Bound result 1977844280078743809871647\n  Bound result 150000000000000000000\n  Bound result 6788\n  Bound result 3395723176\n  Bound result 8192\n  Bound result 1246\n  Bound result 30000\n  Bound result 3219\n  Bound result 4594637\n  Bound result 2799\n  Bound result 1000\n  Bound result 96132242136269616378820726\n  Bound result 977431812553992991\n  Bound result 81363944835619200257745661\n  Bound result 100\n  Bound result 828417\n  Bound result 56251426130008187708409207\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 915.52ms (909.07ms CPU time)\n\nRan 3 test suites in 918.84ms (973.59ms CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AINSEM.approve(address,uint256)\",\"AINSEM.transfer(address,uint256)\",\"AINSEM.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":88,\"foundry.toml\":22,\"launch.json\":20,\"src/AINSEM.sol\":89,\"test/AINSEM.t.sol\":373,\"test/AINSEMInvariant.t.sol\":107,\"test/AINSEMRegistry.t.sol\":129,\"test/helpers/LaunchFactoryMock.sol\":27},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"023656ef95fdde8f2bb70dc1d27f5c2292db3432523cc0fa26d4a422f82e4c2c","verifiedTreeHash":"b79c153b39664b2ed6bf63eb3393122a5a16d2df","verifierVersion":"0.1.0+e6140b7a"},{"checks":[{"durationMs":2020,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.76s\nCompiler run successful!\n","passed":true},{"durationMs":1552,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/AINSEMRegistry.t.sol:AINSEMRegistryTest\n[PASS] test_emptyReturnDoesNotFreezeHolders() (gas: 96227)\n[PASS] test_eoaDeployerWithoutRegistryStillSupportsOrdinaryTransfers() (gas: 129310)\n[PASS] test_excessiveReturnDataDoesNotFreezeHolders() (gas: 194666)\n[PASS] test_exemptPoolFlowsDoNotDependOnRegistryAvailability() (gas: 122236)\n[PASS] test_gasExhaustingRegistryDoesNotFreezeHolders() (gas: 125736)\n[PASS] test_longReturnDoesNotFreezeHolders() (gas: 96371)\n[PASS] test_noncanonicalAddressDoesNotGrantExemption() (gas: 96368)\n[PASS] test_registryCannotReenterToChangeBalances() (gas: 320982)\n[PASS] test_revertingLookupDoesNotFreezeHolders() (gas: 96303)\n[PASS] test_shortReturnDoesNotFreezeHolders() (gas: 96343)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 92.92ms (18.01ms CPU time)\n\nRan 23 tests for test/AINSEM.t.sol:AINSEMTest\n[PASS] testFuzz_rejectsOverspendingWithoutOverflow(uint256) (runs: 512, μ: 117299, ~: 117057)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039357584007913129669608\n\n[PASS] testFuzz_transferConservesBalancesAndBurn(uint256) (runs: 512, μ: 183053, ~: 184981)\nLogs:\n  Bound result 26125394635409926830586918\n\n[PASS] testFuzz_transferFromAndDirectTransferAgree(uint256,uint256) (runs: 512, μ: 222367, ~: 225547)\nLogs:\n  Bound result 5073\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129635105\n\n[PASS] test_constructorEmitsWholeMint() (gas: 11966)\n[PASS] test_distributorIsResolvedAfterDeploymentAndOnlyForThisLaunch() (gas: 392779)\n[PASS] test_infiniteApprovalAndRevocation() (gas: 243902)\n[PASS] test_insufficientBalanceIsAtomicEvenAfterAllowanceSpend() (gas: 183211)\n[PASS] test_launchDistributionClaimsSeedBuyAndSellMoveExactAmounts() (gas: 444355)\n[PASS] test_metadataAndConstructorSupply() (gas: 108506)\n[PASS] test_netOnlyAllowanceCannotCoverTransfer() (gas: 177666)\n[PASS] test_noMintOrAdministrativeBackdoors() (gas: 1761260)\n[PASS] test_poolSettlementThroughAllowanceIsExact() (gas: 189103)\n[PASS] test_privilegedCallersStillNeedAllowance() (gas: 209909)\n[PASS] test_rejectsInsufficientGrossBalanceOnSelfTransfer() (gas: 98397)\n[PASS] test_rejectsInvalidDeploymentParameters() (gas: 3990)\n[PASS] test_rejectsZeroAddressesWithoutBurningOrSpendingAllowance() (gas: 272404)\n[PASS] test_roundingAndZeroTransfers() (gas: 328821)\n[PASS] test_runtimeContainsNoForbiddenOpcodes() (gas: 1113154)\n[PASS] test_selfTransferStillBurns() (gas: 126192)\n[PASS] test_sendingToFactoryOrDistributorDoesNotGrantExemption() (gas: 257793)\n[PASS] test_transferBurnsOnePercentAndEmitsBothMovements() (gas: 169689)\n[PASS] test_transferFromToSelfStillBurnsAndSpendsGrossAllowance() (gas: 185185)\n[PASS] test_transferFromUsesGrossAllowance() (gas: 225272)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 97.49ms (262.75ms CPU time)\n\nRan 1 test for test/AINSEMInvariant.t.sol:AINSEMInvariantTest\n[PASS] invariant_balancesEqualSupplyAndBurnsAccountForEveryMissingToken() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2718  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2713  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2761  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 7\n  Bound result 255\n  Bound result 7167\n  Bound result 6780\n  Bound result 2516\n  Bound result 4580\n  Bound result 433\n  Bound result 73292873934583965650718123\n  Bound result 12\n  Bound result 1516\n  Bound result 256\n  Bound result 700\n  Bound result 148795784158848614827044389\n  Bound result 1863\n  Bound result 4333\n  Bound result 7759\n  Bound result 132501956997617797895286595\n  Bound result 6690492\n  Bound result 13\n  Bound result 101000000000000000000\n  Bound result 1750\n  Bound result 14\n  Bound result 177334874817356\n  Bound result 7568923971774277001299922\n  Bound result 6853900584758866712\n  Bound result 136978389116875255651584249\n  Bound result 107477464\n  Bound result 347307826317260128678773946\n  Bound result 5867\n  Bound result 2344\n  Bound result 268496214433127640225190686\n  Bound result 0\n  Bound result 8300319775369537202420991\n  Bound result 5082\n  Bound result 11\n  Bound result 192732116545219011720392802\n  Bound result 1908\n  Bound result 15395778\n  Bound result 7\n  Bound result 3373\n  Bound result 101\n  Bound result 1000000000\n  Bound result 4585\n  Bound result 244\n  Bound result 33641636265421913360567371\n  Bound result 16944563376437946843434707\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.35s (1.34s CPU time)\n\nRan 3 test suites in 1.35s (1.54s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AINSEM.approve(address,uint256)\",\"AINSEM.transfer(address,uint256)\",\"AINSEM.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":88,\"foundry.toml\":22,\"src/AINSEM.sol\":89,\"test/AINSEM.t.sol\":373,\"test/AINSEMInvariant.t.sol\":107,\"test/AINSEMRegistry.t.sol\":129,\"test/helpers/LaunchFactoryMock.sol\":27},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":754,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":410,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/AINSEM.sol:14: Large Numeric Literal (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2273b5df74f2a0f7d6b476a4f2794acdb63631a4e3ab0213e053a7f1c265beff","verifiedTreeHash":"ee02264e48467dd722a1465768fbfe8c2705a375","verifierVersion":"0.1.0+e6140b7a"},{"checks":[{"durationMs":4015,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.74s\nCompiler run successful!\n","passed":true},{"durationMs":21877,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/AINSEMRegistry.t.sol:AINSEMRegistryTest\n[PASS] test_emptyReturnDoesNotFreezeHolders() (gas: 96227)\n[PASS] test_eoaDeployerWithoutRegistryStillSupportsOrdinaryTransfers() (gas: 129310)\n[PASS] test_excessiveReturnDataDoesNotFreezeHolders() (gas: 194666)\n[PASS] test_exemptPoolFlowsDoNotDependOnRegistryAvailability() (gas: 122236)\n[PASS] test_gasExhaustingRegistryDoesNotFreezeHolders() (gas: 125736)\n[PASS] test_longReturnDoesNotFreezeHolders() (gas: 96371)\n[PASS] test_noncanonicalAddressDoesNotGrantExemption() (gas: 96368)\n[PASS] test_registryCannotReenterToChangeBalances() (gas: 320982)\n[PASS] test_revertingLookupDoesNotFreezeHolders() (gas: 96303)\n[PASS] test_shortReturnDoesNotFreezeHolders() (gas: 96343)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 101.33ms (11.93ms CPU time)\n\nRan 23 tests for test/AINSEM.t.sol:AINSEMTest\n[PASS] testFuzz_rejectsOverspendingWithoutOverflow(uint256) (runs: 512, μ: 117312, ~: 117057)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039357584007913129643313\n\n[PASS] testFuzz_transferConservesBalancesAndBurn(uint256) (runs: 512, μ: 183508, ~: 184981)\nLogs:\n  Bound result 999999999999999999999999998\n\n[PASS] testFuzz_transferFromAndDirectTransferAgree(uint256,uint256) (runs: 512, μ: 222581, ~: 225547)\nLogs:\n  Bound result 1000000000\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007912130299855\n\n[PASS] test_constructorEmitsWholeMint() (gas: 11966)\n[PASS] test_distributorIsResolvedAfterDeploymentAndOnlyForThisLaunch() (gas: 392779)\n[PASS] test_infiniteApprovalAndRevocation() (gas: 243902)\n[PASS] test_insufficientBalanceIsAtomicEvenAfterAllowanceSpend() (gas: 183211)\n[PASS] test_launchDistributionClaimsSeedBuyAndSellMoveExactAmounts() (gas: 444355)\n[PASS] test_metadataAndConstructorSupply() (gas: 108506)\n[PASS] test_netOnlyAllowanceCannotCoverTransfer() (gas: 177666)\n[PASS] test_noMintOrAdministrativeBackdoors() (gas: 1761260)\n[PASS] test_poolSettlementThroughAllowanceIsExact() (gas: 189103)\n[PASS] test_privilegedCallersStillNeedAllowance() (gas: 209909)\n[PASS] test_rejectsInsufficientGrossBalanceOnSelfTransfer() (gas: 98397)\n[PASS] test_rejectsInvalidDeploymentParameters() (gas: 3990)\n[PASS] test_rejectsZeroAddressesWithoutBurningOrSpendingAllowance() (gas: 272404)\n[PASS] test_roundingAndZeroTransfers() (gas: 328821)\n[PASS] test_runtimeContainsNoForbiddenOpcodes() (gas: 1113154)\n[PASS] test_selfTransferStillBurns() (gas: 126192)\n[PASS] test_sendingToFactoryOrDistributorDoesNotGrantExemption() (gas: 257793)\n[PASS] test_transferBurnsOnePercentAndEmitsBothMovements() (gas: 169689)\n[PASS] test_transferFromToSelfStillBurnsAndSpendsGrossAllowance() (gas: 185185)\n[PASS] test_transferFromUsesGrossAllowance() (gas: 225272)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 126.39ms (345.49ms CPU time)\n\nRan 9 tests for test/AINSEMAdversarial.t.sol:AINSEMAdversarialTest\n[PASS] testFuzz_burnStaysWithinOneBaseUnitOfOnePercent(uint256) (runs: 1000, μ: 156496, ~: 158052)\nLogs:\n  Bound result 228\n\n[PASS] testFuzz_directAndDelegatedTransferAreEquivalent(uint256,uint256,bool,bool) (runs: 1000, μ: 333263, ~: 338047)\nLogs:\n  Bound result 859330546029557744002037978\n  Bound result 33758994102470782048839830\n\n[PASS] testFuzz_rejectedOverspendPreservesAllowanceForAValidRetry(uint256,uint256,bool) (runs: 1000, μ: 290370, ~: 285183)\nLogs:\n  Bound result 9787\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129634460\n\n[PASS] test_distributorRotationAppliesToExistingAllowancesImmediately() (gas: 435168)\n[PASS] test_fullSupplyRoundTripDestroysOnlyTheTwoBurns() (gas: 263585)\n[PASS] test_maximumDelegatedTransferCannotOverflowOrSpendInfiniteApproval() (gas: 248241)\n[PASS] test_oneBaseUnitCanEmptyAnAccount() (gas: 142896)\n[PASS] test_replacedApprovalIsNotAddedAndSpentApprovalCannotBeReplayed() (gas: 285570)\n[PASS] test_twoLaunchesCannotBorrowEachOthersDistributorExemption() (gas: 635780)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 126.72ms (367.11ms CPU time)\n\nRan 1 test for test/AINSEMInvariant.t.sol:AINSEMInvariantTest\n[PASS] invariant_balancesEqualSupplyAndBurnsAccountForEveryMissingToken() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2673  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2792  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2727  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 160\n  Bound result 909228616\n  Bound result 8\n  Bound result 1137\n  Bound result 100084373767449711973113854\n  Bound result 5291\n  Bound result 242\n  Bound result 50000000000000000000\n  Bound result 42\n  Bound result 999\n  Bound result 13\n  Bound result 181195000697220046833413014\n  Bound result 159848679631575561769985437\n  Bound result 7\n  Bound result 207740512331\n  Bound result 3088\n  Bound result 18446744073709551615\n  Bound result 6505\n  Bound result 1313373041\n  Bound result 189999800000000003636915048\n  Bound result 2\n  Bound result 2000000000000000000\n  Bound result 587\n  Bound result 11196589589891041464521370\n  Bound result 2436\n  Bound result 1000000000000000000000\n  Bound result 3216\n  Bound result 10\n  Bound result 3\n  Bound result 101000000000000000000\n  Bound result 6084019008024619\n  Bound result 0\n  Bound result 260103963136903889904020907\n  Bound result 1000000000000000000000\n  Bound result 992\n  Bound result 962\n  Bound result 5545\n  Bound result 45767315621920500375699848\n  Bound result 4942\n  Bound result 1029\n  Bound result 5582\n  Bound result 160\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.95s (1.95s CPU time)\n\nRan 2 tests for test/AINSEMStateful.t.sol:AINSEMStatefulTest\n[PASS] invariant_eachBalanceAndAllowanceMatchesTheLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+-------------------+-------+---------+----------╮\n| Contract            | Selector          | Calls | Reverts | Discards |\n+======================================================================+\n| AINSEMLedgerHandler | approve           | 2770  | 0       | 0        |\n|---------------------+-------------------+-------+---------+----------|\n| AINSEMLedgerHandler | changeDistributor | 2721  | 0       | 0        |\n|---------------------+-------------------+-------+---------+----------|\n| AINSEMLedgerHandler | overdraw          | 2774  | 0       | 0        |\n|---------------------+-------------------+-------+---------+----------|\n| AINSEMLedgerHandler | transfer          | 2725  | 0       | 0        |\n|---------------------+-------------------+-------+---------+----------|\n| AINSEMLedgerHandler | transferFrom      | 2722  | 0       | 0        |\n|---------------------+-------------------+-------+---------+----------|\n| AINSEMLedgerHandler | zeroRecipient     | 2672  | 0       | 0        |\n╰---------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 59821024269921008709197346\n  Bound result 33730629401808583029917989\n  Bound result 100\n  Bound result 18446744073709551615\n  Bound result 100\n  Bound result 8871\n  Bound result 100\n  Bound result 115792089237316195423570985008687907853269984665640439039476030751986839193106\n  Bound result 0\n  Bound result 1\n  Bound result 1334\n  Bound result 0\n  Bound result 100\n  Bound result 20297125585398141389003613339912762861032194\n  Bound result 163173192806048831472835225\n  Bound result 171081249709623317880637276\n  Bound result 1\n  Bound result 0\n  Bound result 1360\n  Bound result 18446744073709551615\n  Bound result 0\n  Bound result 99\n  Bound result 101\n  Bound result 101\n  Bound result 115792089237316195423570985008687907853269984665640439039457584007913129640112\n  Bound result 7219300382573212443495318545323883091327903059355817\n  Bound result 0\n  Bound result 0\n  Bound result 99\n  Bound result 8389\n  Bound result 8774\n  Bound result 0\n  Bound result 0\n  Bound result 60978533566687083820414617\n  Bound result 115792089237316195423570985008687907853269984665640314039539321731280157192610\n  Bound result 83\n  Bound result 115792089237316195423570985008687907853269984665640314039439321731281400019025\n  Bound result 101\n\n[PASS] test_sequenceBurnClaimRotateRevokeAndFail() (gas: 6951265)\nLogs:\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 100\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 21.70s (21.71s CPU time)\n\nRan 5 test suites in 21.71s (24.01s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true},{"durationMs":84,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AINSEM.approve(address,uint256)\",\"AINSEM.transfer(address,uint256)\",\"AINSEM.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":88,\"foundry.toml\":22,\"src/AINSEM.sol\":89,\"test/AINSEM.t.sol\":373,\"test/AINSEMAdversarial.t.sol\":214,\"test/AINSEMInvariant.t.sol\":107,\"test/AINSEMRegistry.t.sol\":129,\"test/AINSEMStateful.t.sol\":233,\"test/helpers/LaunchFactoryMock.sol\":27},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a83b71996546b125fa086f22c2d48869502486d32168e23e567b140e0cdff765","verifiedTreeHash":"2a55e2011edf4d111cbabb55c4ca238f2a5fd90b","verifierVersion":"0.1.0+e6140b7a"}]}