{"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":"2d4933b1-3200-4279-a385-bbaf7497bcee","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"9b2bc3ef535ddaf16801b655e42d70f631b6c71858055bd696bc35bc44768430","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":"3d71c6de375de6ff5897b387bffc5d755ccb75578285685ebadeabf2eea1b38b","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":"24f33262f197a04630b5441c862f357f177a7633d091b4f679113e47a0f282db","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":"fa233a63c784438b0f45ec53b5944d450ee87e990c24f0415fa4297ee41425ac","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":"bf60fc483d878892b236359c04a9c89c7f46889346e213ee81a6e9ccd65383be","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":"655982f3393f69325bb606ed0d79069ac5226c520ef7b66cbac053a73be8afd4","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":"4d53155a67dc04b4840172a38fb54b627d565130bace53eef2a76447b1e23920","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"63473c4583259e61bdf9c201a1ceb736f471791896dfcf75798dfd264bc396d8","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: NOTES (NOTES).\nToken name: NOTES\nToken symbol: NOTES\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"4e0adcd5789e41066287e22089b7f32e537f7337a721299b4d3a8758186f1ec0","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"2d4933b1-3200-4279-a385-bbaf7497bcee","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1866-notes"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52272","feedbackHash":"58fc2ca1192c63b69ea19221382127e3782c0f067f685b88ce6c541b9f66ff45","nodeKey":"audit_economics","submissionHash":"9b2bc3ef535ddaf16801b655e42d70f631b6c71858055bd696bc35bc44768430","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53936","feedbackHash":"1b52345b4971c586788720549450eec05a388a2720c41717d6b1850c3375d62b","nodeKey":"audit_flow","submissionHash":"3d71c6de375de6ff5897b387bffc5d755ccb75578285685ebadeabf2eea1b38b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52174","feedbackHash":"34e7969ef3f67d8f3195797cfd2a4cc0b69cbc3d09274ae907345fcbcb9e674c","nodeKey":"audit_judge","submissionHash":"24f33262f197a04630b5441c862f357f177a7633d091b4f679113e47a0f282db","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51304","feedbackHash":"4e54be40bd514f1e3396e942c0875081742f437f5bdc107c3ef15822d05c91ac","nodeKey":"audit_math","submissionHash":"fa233a63c784438b0f45ec53b5944d450ee87e990c24f0415fa4297ee41425ac","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51566","feedbackHash":"a32c3f7ee925ac938ad440bea91b11c43a4ddde7b0d9de3bb68e6d8f4bd46211","nodeKey":"audit_permissions","submissionHash":"bf60fc483d878892b236359c04a9c89c7f46889346e213ee81a6e9ccd65383be","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51459","feedbackHash":"585dfb0807d027b0d7ad1d9f77438d904fda4b4475cfa82d7a5432e9704e2f43","nodeKey":"build_contract_project","submissionHash":"655982f3393f69325bb606ed0d79069ac5226c520ef7b66cbac053a73be8afd4","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51430","feedbackHash":"07ad28314e627660d31d4ad06cfc35b911973f38ff8a66f39b8a602bb7ccefe0","nodeKey":"manifest","submissionHash":"4d53155a67dc04b4840172a38fb54b627d565130bace53eef2a76447b1e23920","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52583","feedbackHash":"f5c030ed6bcb31b9b430505ad53d9a83307ef5d380d0398fa931c07cfcb36f1d","nodeKey":"write_foundry_tests","submissionHash":"63473c4583259e61bdf9c201a1ceb736f471791896dfcf75798dfd264bc396d8","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5239fdb2a63373f86c4f125e63cede7af8e92ee077f111b54b66201172f9647c","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b4f6137e7c93a2b3","findings":[{"citation":"resolved","description":"Merged from audit_permissions (the only specialist finding; no other area reported it). NOTES inherits the vendored OpenZeppelin v5.0.x ERC20 unchanged. approve(spender, value) writes the allowance absolutely (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol, `_allowances[owner][spender] = value;`) while transferFrom spends it relatively (`_approve(owner, spender, currentAllowance - value, false)` in _spendAllowance). A replacement approve that lands after the old allowance was spent grants a fresh allowance on top of what was already moved. This is the ERC-20 standard's known behaviour, inherent to the requested plain fixed-supply token, and README.md already states that approve replaces the allowance. It is a holder-side approval-hygiene note, not a permission bypass: nothing moves without the holder's own approve. Reproduced; kept at info, no change to the accepted design recommended.","line":8,"path":"src/NOTES.sol","reproduction":"Deploy NOTES from `factory`; factory.transfer(alice, 200e18). 1) alice: approve(bob, 100e18). 2) bob: transferFrom(alice, bob, 100e18) -> allowance(alice,bob) == 0, bob holds 100e18. 3) alice: approve(bob, 50e18). 4) bob: transferFrom(alice, bob, 50e18). Actual: balanceOf(bob) == 150e18, balanceOf(alice) == 50e18. If alice intended 50e18 as bob's total, she needed approve(bob, 0) confirmed first. Verified by running test/scratch/JudgeChecks.t.sol::test_approveReplaceOrdering on this tree (passes, i.e. the sequence executes exactly as stated).","severity":"info","snippet":"contract NOTES is ERC20 {","title":"approve overwrites while transferFrom decrements: standard ERC-20 allowance-replacement ordering, documented in README, no revision required"}],"hash":"24f33262f197a04630b5441c862f357f177a7633d091b4f679113e47a0f282db","nodeId":"3ac136e3-5c97-4cf4-affa-bdf6b3b56b7f","outcome":"completed","summary":"Review complete. The findings file is written and the tree is otherwise unchanged.\n\n**Outcome:** the NOTES token is clean. No defect that would open a revision.\n\n**What I checked**\n\n- The contract is a 17-line wrapper over the vendored OpenZeppelin v5 ERC20. I read the vendored ERC20 and Context sources in full and they match upstream logic with no modifications.\n- The constructor takes no arguments and mints exactly the manifest's supply to msg.sender. Decimals return 18. Both agree with launch.json.\n- Creation and runtime bytecode are far under the deployment limits, and an opcode walk of the runtime found no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- There is no owner, mint, burn, pause, blacklist, fee or exemption path, so every launch flow moves exactly what it says.\n- The project's own 49 tests pass with the pinned fuzz seed. I also ran my own scratch tests for supply, exact transfers, allowance guards and ETH rejection, and removed them afterwards.\n- The protected tests could not run here because they import v4-core and a floor directory not in this tree. I verified the behaviours they assert directly instead.\n\n**Specialist findings**\n\nOnly audit_permissions reported anything: the standard approve-overwrite versus transferFrom-decrement ordering. I reproduced the exact sequence in a scratch test and kept it as a single info finding, since it is inherent ERC-20 behaviour, documented in the README, and not a permission bypass. The static-analysis lead about the large numeric literal is a style note on the supply constant and does not reproduce as a defect.\n\n**Coverage:** all three entry points answered as holds, plus four invariant rows for the constructor, deployability, forbidden opcodes and library integrity.","treeHash":null,"usage":{"cachedInputTokens":481011,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":6855,"runtime":"claude","turns":11,"wallClockMs":109590}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1f78880cc572868c","findings":[],"hash":"3d71c6de375de6ff5897b387bffc5d755ccb75578285685ebadeabf2eea1b38b","nodeId":"03251f1c-2ca7-4efc-814f-12f11ed22616","outcome":"completed","summary":"Review complete: no defects found. The findings file is written with an empty list and a full coverage record.\n\n**What was reviewed.** The NOTES token at `src/NOTES.sol` is a 17-line contract inheriting unmodified OpenZeppelin v5.0.2 ERC20, with one constructor mint of 1,000,000,000 × 10^18 to msg.sender and no other functions. I applied the Senior Auditor's Mindset and the three assigned guides, Execution Trace, Periphery and First Principles, to the three state-changing entry points and the constructor.\n\n**Execution trace.** Each of approve, transfer and transferFrom was traced through the inherited internals to final state. Zero-address sentinels revert on both sides, the max-uint allowance path is the only special branch and is documented, failed transfers revert whole so no allowance is consumed, and no fallback, receive or payable path exists. A scratch test reproducing the factory, distributor, remainder and pool-style pull flows showed every amount arrives exactly.\n\n**Periphery.** The token trusts five vendored OpenZeppelin files. I fetched each from upstream at the commit recorded in DEPENDENCIES.json and the SHA-256 hashes match byte for byte, so the base contract and Context are genuine and unmodified.\n\n**First principles.** Supply is written only by the constructor mint and cannot grow or be seized afterward. Decimals, name, symbol and supply match the task statement. The compiled ABI contains no mint, burn, pause or owner surface, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n\n**Checks run.** Build with solc 0.8.26, all 34 project unit, fuzz and invariant tests under the README's seed, forge fmt check, and my scratch test. All passed. The aderyn large-numeric-literal lead is a style note on the supply constant and is not a defect. The protected Uniswap v4 harness could not be run locally since it needs the verifier's v4-core and environment, so pool seeding and swaps were verified only as plain transfers.\n\n**Coverage.** All three listed entry points plus the constructor, the supply invariant, the vendored periphery, fallback paths and the absent launch.json are recorded as holds in `.imd-findings.json`. The scratch directory was removed, leaving the findings file as the only change.","treeHash":null,"usage":{"cachedInputTokens":692527,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":9208,"runtime":"claude","turns":23,"wallClockMs":168230}},{"artifacts":[],"attempt":1,"bundleHash":"3462a3800eccd1267da07a43b5643280437357b369ddea7681922bf1b77e3f2f","device":"2a5d68f89de314cb","findings":[],"hash":"4d53155a67dc04b4840172a38fb54b627d565130bace53eef2a76447b1e23920","nodeId":"16b8f22e-cc0e-4c50-a90e-8f391bb7e145","outcome":"completed","summary":"Done. The manifest is written and the only new file in the tree is launch.json.\n\n**What the accepted tree contains.** A single contract, NOTES in src/NOTES.sol, built on the vendored OpenZeppelin ERC20. Its constructor takes no arguments and mints one billion tokens at 18 decimals once to msg.sender. There are no application contracts, no owner, and no initialization calls.\n\n**What launch.json says.**\n- kind is custom_token, token.contract is NOTES with name and symbol NOTES, decimals 18, empty constructorArgs, and totalSupply of 10^27 minor units, exactly what the constructor mints.\n- contracts is an empty list, matching the accepted tree.\n- pool and economics are copied verbatim from the launch reference: IMD pair address, fee 12500, tick spacing 60, the one-to-one provenance price, poolBps 8800, the 2,500 IMD opening cap, and the requester's remainder address.\n- notes is a single string of about 1,070 characters describing only the NOTES contract and the launch flows.\n\n**Checks.** The build compiles cleanly on Solidity 0.8.26. The full suite passes with the verifier's fuzz seed, 34 tests across 3 suites with 0 failures. The manifest parses as JSON with only the six schema keys, and git shows launch.json as the sole change.","treeHash":"6733dc0728d8aea04cc4014aa571d6ee47fc508e","usage":{"cachedInputTokens":188172,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2653,"runtime":"claude","turns":9,"wallClockMs":57884}},{"artifacts":[],"attempt":1,"bundleHash":"40c54ad6998cd03197045dcb4b2bef9af98e0139ed82a4578409fdd3ce92cdc3","device":"6d3b3ab49d68191e","findings":[],"hash":"63473c4583259e61bdf9c201a1ceb736f471791896dfcf75798dfd264bc396d8","nodeId":"cc47381f-8a89-489a-975e-52da6ed3e60e","outcome":"completed","summary":"Added 15 boundary and failure-path tests, and expanded invariants across four actors.\n\n`forge build` and seeded `forge test` pass: **49 tests**, including **32,768 invariant calls**.\n\nOnly `test/` changed. No implementation defects found in these checks.","treeHash":"d9e33a04e0e2280de89edc4776dc91c7eec30a0b","usage":{"cachedInputTokens":706304,"inputTokens":75375,"model":"gpt-6-astra","outputTokens":11156,"runtime":"codex","turns":5,"wallClockMs":409112}},{"artifacts":[],"attempt":1,"bundleHash":"c52f2db60b855bf48fa9acb0191230d60cfa2237edd705513243307df5d254be","device":"b5370e603753d2ab","findings":[],"hash":"655982f3393f69325bb606ed0d79069ac5226c520ef7b66cbac053a73be8afd4","nodeId":"11e2a4fd-b8fc-4a67-be7f-abeee51d6ba3","outcome":"completed","summary":"Implemented NOTES with 1,000,000,000 tokens, 18 decimals, minted once to the deployer.\n\nIncludes vendored dependencies, deployment documentation, and success, failure, fuzz, and invariant tests.\n\nVerified with Solidity 0.8.26:\n- `forge build` passed.\n- `forge test` passed with the specified seed.\n- `forge fmt --check` passed.","treeHash":"f11ff3bd0642a36d555afad9c1ffce7674acba3e","usage":{"cachedInputTokens":467072,"inputTokens":54225,"model":"gpt-6-astra","outputTokens":15792,"runtime":"codex","turns":5,"wallClockMs":535151}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ef31844bb462de78","findings":[],"hash":"9b2bc3ef535ddaf16801b655e42d70f631b6c71858055bd696bc35bc44768430","nodeId":"b44ec1de-9f17-4eca-9df0-a31d415e8cf6","outcome":"completed","summary":"The review is complete. The findings file holds an empty findings list and a full coverage record, and the only other change in the tree is that file (the scratch test is removed).\n\n**Result: no defects found in the economics area.** The token is a single constructor mint on top of the unmodified OpenZeppelin v5.0.2 ERC20. I hashed every vendored file against the upstream commit the dependency manifest names and all five match, so there is no hidden override of transfer, allowance or supply logic.\n\nWhat I checked against the Economic Security, Invariant and Flow Gap guides:\n\n- **Supply conservation.** The compiled ABI exposes only approve, transfer and transferFrom as state-changing. There is no mint, burn, owner, pause or upgrade path, so supply cannot grow after launch and no privileged hand can move or freeze a balance.\n- **Launch flows arrive whole.** With no fee, burn or rebase, the swarm share, the pool seed through the PoolManager, the remainder and every claim move exactly the stated amount. The 10/88/2 split of 1e27 is dust-free, and a scratch test confirmed it along with full rollback on an overdraw.\n- **Round trips and allowance residuals.** Finite allowances decrement exactly, the max allowance is untouched, a failed transferFrom restores both allowance and balance, and self-transfers neither create nor destroy value. The project's 128-run stateful invariant suite also passes against a reference ledger.\n- **Sentinel addresses.** Transfers and approvals involving the zero address revert rather than silently succeeding.\n- **Economic parameters.** The pool share and remainder are exact integers. The implied opening price is inside the Uniswap v4 tick range. The price itself is derived by the deployer, so the token carries no price dependency.\n\nThe static-analysis lead about a large numeric literal is the supply constant and is not a defect.\n\nOne item I could not verify and left out of the findings: the README states an intended launch chain by name and ID. That is a policy field outside the manifest and outside the token code, so the launch operator should confirm it matches the job before admission.","treeHash":null,"usage":{"cachedInputTokens":631630,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":10329,"runtime":"claude","turns":24,"wallClockMs":152380}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d0653dc91b6e2259","findings":[{"citation":"resolved","description":"Asymmetry guide, set <-> spend pair. NOTES inherits OpenZeppelin v5.0.2 ERC20 unchanged, so approve(spender, value) overwrites the allowance (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:291 `_allowances[owner][spender] = value;`) while transferFrom decrements it (ERC20.sol:312). The write is absolute and the spend is relative, so a replacement approve that lands after a spend of the old allowance grants a fresh allowance on top of what was already spent. This is the ERC-20 standard's known allowance-replacement race, inherent to the requested design (a plain fixed-supply ERC-20), and README.md already documents it under 'After launch' and advises limited approvals. OZ v5 removed increaseAllowance/decreaseAllowance, so the token offers no relative-adjustment path; adding one would widen the requested ABI. No change to the accepted design is recommended. Recorded so the judge has the set/spend asymmetry on file; it is a holder-side approval-hygiene note, not a permission bypass: nobody can move a balance without that holder's own approve.","line":8,"path":"src/NOTES.sol","reproduction":"State: factory transfers 200e18 NOTES to alice. 1) alice: approve(bob, 100e18). 2) bob: transferFrom(alice, bob, 100e18) -> allowance 0, bob holds 100e18. 3) alice (intending to reduce bob to 50e18 total): approve(bob, 50e18). 4) bob: transferFrom(alice, bob, 50e18). Actual: bob holds 150e18, alice 50e18. Expected by alice: bob capped at 100e18 total. Verified with a Foundry test (test/scratch/ReviewChecks.t.sol, test_approveReplaceOrdering, passes on this code, i.e. the sequence executes as described). Mitigation is on the holder's side: approve(bob, 0) first and confirm inclusion, then approve the new amount.","severity":"info","snippet":"contract NOTES is ERC20 {","title":"approve/transferFrom ordering asymmetry: a spender can combine an old and a replacement allowance (standard ERC-20 behaviour, already documented, no revision required)"}],"hash":"bf60fc483d878892b236359c04a9c89c7f46889346e213ee81a6e9ccd65383be","nodeId":"d52bd92e-2ed0-4b56-a93f-be275fecb3fe","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing else is needed from the environment: the JSON parses, the cited snippet matches line 8 of the source, and the working tree is clean apart from ignored paths.\n\n**Outcome: no defects in the permission model.** NOTES is a 17-line wrapper over an unmodified OpenZeppelin v5.0.2 ERC20 that mints 1e27 units to the constructor caller once. There is no owner, role, modifier, initializer, proxy, hook, callback, or admin function, so the Access Control, Trust Gap and Asymmetry checklists have no privileged surface to attack.\n\n**What I verified**\n\n- **Dependency integrity.** Every vendored OpenZeppelin file hashes to the value in DEPENDENCIES.json, and I read the ERC20 implementation in full. It is the genuine upstream logic.\n- **Compiled ABI.** Only approve, transfer, transferFrom and views exist. No mint, burn, pause, blacklist or ownership calls. Runtime is free of DELEGATECALL, CALLCODE and SELFDESTRUCT.\n- **Access control.** The deployer cannot pull a holder's balance without that holder's approval. Confirmed by a scratch test that reverts with the insufficient-allowance error.\n- **Supply.** The constant equals one billion times 1e18. The burn path is unreachable because transfers to the zero address revert, so supply can neither grow nor shrink. The aderyn large-literal lead is a correct value, not a defect.\n- **Trust gap.** No pricing formula, fee recipient, or settable parameter lives in the token, so no seam exists to exploit. The only trust assumption is that the constructor's caller is the factory, which the launch process guarantees and the README documents.\n- **Existing suite.** All 34 project tests pass under forge 1.8.3 with solc 0.8.26.\n\n**Recorded finding (info only).** The set-versus-spend asymmetry between approve and transferFrom lets a spender combine an old allowance with a replacement one if the spend lands first. This is standard ERC-20 behaviour, inherent to the requested plain-token design, and already documented in the README. I recorded it with a concrete call sequence so the judge has the pair on file, and stated that no revision is required.\n\n**Coverage.** All three listed entry points have rows, plus six invariant and trust-assumption rows. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":762212,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":10896,"runtime":"claude","turns":17,"wallClockMs":175555}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4be5e039e1c77ce3","findings":[],"hash":"fa233a63c784438b0f45ec53b5944d450ee87e990c24f0415fa4297ee41425ac","nodeId":"54647aa3-d933-4b07-9c11-781919200b58","outcome":"completed","summary":"The review is complete and the report is written.\n\n**Result: no defects found in the math area.** `.imd-findings.json` holds an empty findings list and seven coverage rows, all `holds`, covering the three listed entry points plus the constructor constant, the fixed-supply invariant, and the Boundary and Numerical Gap guide categories.\n\nWhat I checked:\n- **Source.** `src/NOTES.sol` is a 16-line OpenZeppelin v5.0.2 ERC20 with one constant. The vendored OZ files match the SHA-256 hashes in DEPENDENCIES.json, so the inherited arithmetic is the audited upstream code.\n- **Math Precision.** The only arithmetic the token adds is the compile-time constant for one billion tokens at 18 decimals, which equals the README and manifest supply exactly. There are no divisions, scale conversions, casts or fee formulas, so none of the guide's rounding, truncation, overflow or decimal-mismatch modes has a site to fire. The aderyn \"large numeric literal\" lead is stylistic and the literal is exact.\n- **Boundary.** No external calls, payable functions, sentinel-address branches or bytes decoding exist. I exercised the inherited edges in a scratch Foundry test: zero transfer, self-transfer, full balance and balance plus one, max uint, zero addresses, exact and infinite allowance, max minus one allowance decrement, and allowance larger than balance. All behaved as the standard specifies.\n- **Numerical Gap.** Every amount moves verbatim, so no precision-at-an-edge seam can drift the supply or balance invariants. The project's own 30 unit tests and invariant suite pass, and a 2000-run fuzz conservation check held.\n\nThe scratch test was removed and no tracked file was changed. The one scratch failure during the run was a bug in my own test, not in the token, and was fixed before the final run.","treeHash":null,"usage":{"cachedInputTokens":656669,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":7666,"runtime":"claude","turns":12,"wallClockMs":163371}}],"verification":[{"checks":[{"durationMs":1480,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.37s\nCompiler run successful!\n","passed":true},{"durationMs":2099,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/NOTESLaunch.t.sol:NOTESLaunchTest\n[PASS] test_Create2FactoryReceivesAllSupply() (gas: 43789)\n[PASS] test_FactoryNeedsHolderApprovalAfterDistribution() (gas: 229097)\n[PASS] test_LaunchDistributionClaimsAndPoolCustodyTransferExactAmounts() (gas: 935479)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.08ms (968.21µs CPU time)\n\nRan 30 tests for test/NOTES.t.sol:NOTESTest\n[PASS] testFuzz_AllowanceCannotBeOverspent(uint256,uint256) (runs: 512, μ: 133156, ~: 133867)\nLogs:\n  Bound result 97\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639842\n\n[PASS] testFuzz_DelegatedTransfersConserveSupply(uint256,uint256) (runs: 512, μ: 162602, ~: 164863)\nLogs:\n  Bound result 738035387603429733578414669\n  Bound result 771\n\n[PASS] testFuzz_OverdrawRevertsAndPreservesBalances(uint256) (runs: 512, μ: 69038, ~: 69383)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007915867967104\n\n[PASS] testFuzz_TransferToZeroRevertsWithoutBurning(uint256) (runs: 512, μ: 47795, ~: 47746)\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 512, μ: 92931, ~: 93131)\nLogs:\n  Bound result 1000000000000000000000000000\n\n[PASS] test_ApprovalOnlyChangesCallersAllowance() (gas: 142193)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 88705)\n[PASS] test_ApproveReplacesAllowanceAndCanRevokeIt() (gas: 174269)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 37617)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 9725)\n[PASS] test_ConstructorMintsToImmediateDeployer() (gas: 40885)\n[PASS] test_DeployerCannotSeizeHolderTokens() (gas: 94967)\n[PASS] test_EntireSupplyCanMoveAndReturn() (gas: 159465)\n[PASS] test_InfiniteAllowanceIsNotDecreased() (gas: 139400)\n[PASS] test_MetadataAndInitialSupply() (gas: 107627)\n[PASS] test_NativeCurrencyTransferReverts() (gas: 37336)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1153905)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 1033521)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51485)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 35930)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91487)\n[PASS] test_TransferFromEmitsEventAndSpendsFiniteAllowance() (gas: 241797)\n[PASS] test_TransferFromEmptyAccountReverts() (gas: 57404)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 136428)\n[PASS] test_TransferFromSelfConsumesAllowanceButPreservesBalance() (gas: 109522)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 114079)\n[PASS] test_TransferFromZeroAddressReverts() (gas: 44579)\n[PASS] test_UnapprovedSpenderCannotTransfer() (gas: 119751)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73377)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81423)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 18.49ms (94.84ms CPU time)\n\nRan 1 test for test/NOTESInvariant.t.sol:NOTESInvariantTest\n[PASS]\nNOTESInvariantTest invariants:\n[PASS] invariant_AllowancesMatchReferenceLedger\n[PASS] invariant_SupplyAndBalancesMatchReferenceLedger\n NOTESInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| NOTESHandler | approve           | 1617  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | rejectedOverdraw  | 1696  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | rejectedOverspend | 1619  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | transfer          | 1666  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | transferFrom      | 1594  | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1818\n  Bound result 0\n  Bound result 1\n  Bound result 344\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 272\n  Bound result 0\n  Bound result 163\n  Bound result 0\n  Bound result 0\n  Bound result 151\n  Bound result 931\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.00s (2.00s CPU time)\n\nRan 3 test suites in 2.00s (2.02s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"NOTES.approve(address,uint256)\",\"NOTES.transfer(address,uint256)\",\"NOTES.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":54,\"LICENSE\":21,\"README.md\":77,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/NOTES.sol\":17,\"test/NOTES.t.sol\":353,\"test/NOTESInvariant.t.sol\":112,\"test/NOTESLaunch.t.sol\":93},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4d53155a67dc04b4840172a38fb54b627d565130bace53eef2a76447b1e23920","verifiedTreeHash":"6733dc0728d8aea04cc4014aa571d6ee47fc508e","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":1600,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.52s\nCompiler run successful!\n","passed":true},{"durationMs":8981,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/NOTESLaunch.t.sol:NOTESLaunchTest\n[PASS] test_Create2FactoryReceivesAllSupply() (gas: 43789)\n[PASS] test_FactoryNeedsHolderApprovalAfterDistribution() (gas: 229097)\n[PASS] test_LaunchDistributionClaimsAndPoolCustodyTransferExactAmounts() (gas: 935479)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.07ms (940.89µs CPU time)\n\nRan 30 tests for test/NOTES.t.sol:NOTESTest\n[PASS] testFuzz_AllowanceCannotBeOverspent(uint256,uint256) (runs: 512, μ: 133389, ~: 133867)\nLogs:\n  Bound result 97\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639845\n\n[PASS] testFuzz_DelegatedTransfersConserveSupply(uint256,uint256) (runs: 512, μ: 163185, ~: 164863)\nLogs:\n  Bound result 452795631105906448789453696\n  Bound result 7539869703872694630787727\n\n[PASS] testFuzz_OverdrawRevertsAndPreservesBalances(uint256) (runs: 512, μ: 69038, ~: 69383)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007915867967104\n\n[PASS] testFuzz_TransferToZeroRevertsWithoutBurning(uint256) (runs: 512, μ: 47796, ~: 47746)\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 512, μ: 92914, ~: 93131)\nLogs:\n  Bound result 547941575388503384926288680\n\n[PASS] test_ApprovalOnlyChangesCallersAllowance() (gas: 142193)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 88705)\n[PASS] test_ApproveReplacesAllowanceAndCanRevokeIt() (gas: 174269)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 37617)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 9725)\n[PASS] test_ConstructorMintsToImmediateDeployer() (gas: 40885)\n[PASS] test_DeployerCannotSeizeHolderTokens() (gas: 94967)\n[PASS] test_EntireSupplyCanMoveAndReturn() (gas: 159465)\n[PASS] test_InfiniteAllowanceIsNotDecreased() (gas: 139400)\n[PASS] test_MetadataAndInitialSupply() (gas: 107627)\n[PASS] test_NativeCurrencyTransferReverts() (gas: 37336)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1153905)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 1033521)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51485)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 35930)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91487)\n[PASS] test_TransferFromEmitsEventAndSpendsFiniteAllowance() (gas: 241797)\n[PASS] test_TransferFromEmptyAccountReverts() (gas: 57404)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 136428)\n[PASS] test_TransferFromSelfConsumesAllowanceButPreservesBalance() (gas: 109522)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 114079)\n[PASS] test_TransferFromZeroAddressReverts() (gas: 44579)\n[PASS] test_UnapprovedSpenderCannotTransfer() (gas: 119751)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73377)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81423)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 151.50ms (532.97ms CPU time)\n\nRan 15 tests for test/NOTESAllowance.t.sol:NOTESAllowanceTest\n[PASS] testFuzz_AllowanceFailureWithSufficientBalanceIsAtomic(uint256,uint256) (runs: 1000, μ: 323011, ~: 323385)\nLogs:\n  Bound result 964004679971692208725666878\n  Bound result 978974017911275557224211067\n\n[PASS] testFuzz_DelegatedOverdrawPreservesApproval(uint256,uint256,bool,bool) (runs: 1000, μ: 266290, ~: 266384)\nLogs:\n  Bound result 999999999999999999999999998\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639946\n\n[PASS] testFuzz_DelegatedSelfTransferConsumesOnlyAllowance(uint256,uint256,uint256) (runs: 1000, μ: 269846, ~: 270909)\nLogs:\n  Bound result 322959778300978549142154804\n  Bound result 3063183775322372566623771847091605638890309246723136511777651285\n  Bound result 21986456277502603788415817\n\n[PASS] testFuzz_PartiallyFundedHolderCannotOverdraw(uint256,uint256,bool) (runs: 1000, μ: 261461, ~: 262038)\nLogs:\n  Bound result 555015259665336504209612422\n  Bound result 57361909722438933100925736094\n\n[PASS] testFuzz_SpendersCannotBorrowEachOthersAllowance(uint256,uint256) (runs: 1000, μ: 560053, ~: 560358)\nLogs:\n  Bound result 10633449462\n  Bound result 6083488\n\n[PASS] testFuzz_SplitTransfersRoundTripWithoutFees(uint256,uint256) (runs: 1000, μ: 539389, ~: 539481)\nLogs:\n  Bound result 64578852493993978597592972\n  Bound result 865500352298033120771417136\n\n[PASS] test_ApprovalBeforeFundingCanBeUsedAfterFunding() (gas: 419938)\n[PASS] test_ExhaustedAllowanceDoesNotResetWhenHolderIsFundedAgain() (gas: 357368)\n[PASS] test_HolderNeedsSelfApprovalToUseTransferFrom() (gas: 382180)\n[PASS] test_MaximumFiniteAllowanceIsDecremented() (gas: 282269)\n[PASS] test_MaximumTransferAmountsRevertWithoutOverflow() (gas: 281581)\n[PASS] test_OneBaseUnitMovesDirectlyAndWithAllowance() (gas: 369584)\n[PASS] test_UnlimitedApprovalCanBeReducedRevokedAndGrantedAgain() (gas: 699716)\n[PASS] test_ZeroReceiverRejectsZeroAmountWithFiniteAndInfiniteApproval() (gas: 459720)\n[PASS] test_ZeroTransfersPreserveFiniteAndInfiniteApprovals() (gas: 521941)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 154.57ms (864.20ms CPU time)\n\nRan 1 test for test/NOTESInvariant.t.sol:NOTESInvariantTest\n[PASS]\nNOTESInvariantTest invariants:\n[PASS] invariant_AllowancesMatchReferenceLedger\n[PASS] invariant_SupplyAndBalancesMatchReferenceLedger\n NOTESInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------+---------------------------+-------+---------+----------╮\n| Contract     | Selector                  | Calls | Reverts | Discards |\n+=======================================================================+\n| NOTESHandler | approve                   | 3599  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | changeApproval            | 3615  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | rejectedDelegatedOverdraw | 3624  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | rejectedOverdraw          | 3486  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | rejectedOverspend         | 3653  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | rejectedZeroReceiver      | 3668  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | rejectedZeroSpender       | 3625  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | transfer                  | 3789  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| NOTESHandler | transferFrom              | 3709  | 0       | 0        |\n╰--------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 18\n  Bound result 8477\n  Bound result 688\n  Bound result 8793\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129639942\n  Bound result 250000000000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640064039457584007913129644592\n  Bound result 4551904466503808553274387687428062\n  Bound result 23\n  Bound result 288564999931089141705337316\n  Bound result 0\n  Bound result 8\n  Bound result 172201404282578290809177393596235873158498\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640025474457652918771424302707\n  Bound result 3\n  Bound result 3714247999\n  Bound result 0\n  Bound result 6\n  Bound result 115792089237316195423570985008687907853269984665640025474457652918771424302740\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640352604457515097054834977349\n  Bound result 3801\n  Bound result 255\n  Bound result 115792089237316195423570985008687907853269984665640025474457652918771424302865\n  Bound result 123000000000000000000\n  Bound result 124999999999999999999999997\n  Bound result 1151\n  Bound result 2924\n  Bound result 345864051825721058543970743691303523927587602563\n  Bound result 4\n  Bound result 99\n  Bound result 115792089237316195423570985008687907853269984665640352604457515097054834982688\n  Bound result 330\n  Bound result 48\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129637359\n  Bound result 40\n  Bound result 1488\n  Bound result 96\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129643055\n  Bound result 35615302387562314847160401\n  Bound result 4054342774\n  Bound result 6454\n  Bound result 10\n  Bound result 5\n  Bound result 417\n  Bound result 218876687544052739559950477\n  Bound result 10322\n  Bound result 2\n  Bound result 615971066132081484706216212252500550998410529305927268626903594654\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129653477\n  Bound result 2048\n  Bound result 242\n  Bound result 3\n  Bound result 0\n  Bound result 8819128048766616228\n  Bound result 202\n  Bound result 0\n  Bound result 0\n  Bound result 5407\n  Bound result 1\n  Bound result 9214\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.88s (8.88s CPU time)\n\nRan 4 test suites in 8.89s (9.19s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"NOTES.approve(address,uint256)\",\"NOTES.transfer(address,uint256)\",\"NOTES.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":54,\"LICENSE\":21,\"README.md\":77,\"foundry.toml\":21,\"remappings.txt\":2,\"src/NOTES.sol\":17,\"test/NOTES.t.sol\":353,\"test/NOTESAllowance.t.sol\":287,\"test/NOTESInvariant.t.sol\":228,\"test/NOTESLaunch.t.sol\":93},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"63473c4583259e61bdf9c201a1ceb736f471791896dfcf75798dfd264bc396d8","verifiedTreeHash":"d9e33a04e0e2280de89edc4776dc91c7eec30a0b","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":1254,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.18s\nCompiler run successful!\n","passed":true},{"durationMs":1839,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/NOTESLaunch.t.sol:NOTESLaunchTest\n[PASS] test_Create2FactoryReceivesAllSupply() (gas: 43789)\n[PASS] test_FactoryNeedsHolderApprovalAfterDistribution() (gas: 229097)\n[PASS] test_LaunchDistributionClaimsAndPoolCustodyTransferExactAmounts() (gas: 935479)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 15.42ms (1.04ms CPU time)\n\nRan 30 tests for test/NOTES.t.sol:NOTESTest\n[PASS] testFuzz_AllowanceCannotBeOverspent(uint256,uint256) (runs: 512, μ: 133156, ~: 133867)\nLogs:\n  Bound result 738035387603429733578414669\n  Bound result 115792089237316195423570985008687907853269984665639826004069980578179551226037\n\n[PASS] testFuzz_DelegatedTransfersConserveSupply(uint256,uint256) (runs: 512, μ: 162602, ~: 164863)\nLogs:\n  Bound result 97\n  Bound result 4\n\n[PASS] testFuzz_OverdrawRevertsAndPreservesBalances(uint256) (runs: 512, μ: 69038, ~: 69383)\nLogs:\n  Bound result 323657212846966561994956127762084439037140377934821979342508227705\n\n[PASS] testFuzz_TransferToZeroRevertsWithoutBurning(uint256) (runs: 512, μ: 47795, ~: 47746)\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 512, μ: 92931, ~: 93131)\nLogs:\n  Bound result 653130926818796898764665867\n\n[PASS] test_ApprovalOnlyChangesCallersAllowance() (gas: 142193)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 88705)\n[PASS] test_ApproveReplacesAllowanceAndCanRevokeIt() (gas: 174269)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 37617)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 9725)\n[PASS] test_ConstructorMintsToImmediateDeployer() (gas: 40885)\n[PASS] test_DeployerCannotSeizeHolderTokens() (gas: 94967)\n[PASS] test_EntireSupplyCanMoveAndReturn() (gas: 159465)\n[PASS] test_InfiniteAllowanceIsNotDecreased() (gas: 139400)\n[PASS] test_MetadataAndInitialSupply() (gas: 107627)\n[PASS] test_NativeCurrencyTransferReverts() (gas: 37336)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1153905)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 1033521)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51485)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 35930)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91487)\n[PASS] test_TransferFromEmitsEventAndSpendsFiniteAllowance() (gas: 241797)\n[PASS] test_TransferFromEmptyAccountReverts() (gas: 57404)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 136428)\n[PASS] test_TransferFromSelfConsumesAllowanceButPreservesBalance() (gas: 109522)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 114079)\n[PASS] test_TransferFromZeroAddressReverts() (gas: 44579)\n[PASS] test_UnapprovedSpenderCannotTransfer() (gas: 119751)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73377)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81423)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 16.46ms (87.39ms CPU time)\n\nRan 1 test for test/NOTESInvariant.t.sol:NOTESInvariantTest\n[PASS]\nNOTESInvariantTest invariants:\n[PASS] invariant_AllowancesMatchReferenceLedger\n[PASS] invariant_SupplyAndBalancesMatchReferenceLedger\n NOTESInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| NOTESHandler | approve           | 1617  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | rejectedOverdraw  | 1696  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | rejectedOverspend | 1619  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | transfer          | 1666  | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| NOTESHandler | transferFrom      | 1594  | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1818\n  Bound result 0\n  Bound result 1\n  Bound result 344\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 272\n  Bound result 0\n  Bound result 163\n  Bound result 0\n  Bound result 0\n  Bound result 151\n  Bound result 931\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.75s (1.75s CPU time)\n\nRan 3 test suites in 1.75s (1.78s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"NOTES.approve(address,uint256)\",\"NOTES.transfer(address,uint256)\",\"NOTES.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":54,\"LICENSE\":21,\"README.md\":77,\"foundry.toml\":21,\"remappings.txt\":2,\"src/NOTES.sol\":17,\"test/NOTES.t.sol\":353,\"test/NOTESInvariant.t.sol\":112,\"test/NOTESLaunch.t.sol\":93},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":429,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":216,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/NOTES.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"655982f3393f69325bb606ed0d79069ac5226c520ef7b66cbac053a73be8afd4","verifiedTreeHash":"f11ff3bd0642a36d555afad9c1ffce7674acba3e","verifierVersion":"0.1.0+8fbf00a5"}]}