{"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":"44bbdb43-124b-4e4d-9ef3-4417a61f5e2a","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"84cb83df08c8c2e0bf1dfc0e268b0b8989365ed2f8822079492d6240be3c106d","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":"29e7f4a98c740d3fc82f8b3ab9b3904e4c0df14fda9242bc496cde4616f7a1ab","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":"52808d38568942e082386dbd733dbe4e75483515e1441a3557db76c3e58deee5","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":"e05a46b34819b452cf93734c544b1aafaabcf83bef79ca9861a1a2dcd4aab449","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":"084e34b3acfa893873472b377b3e43c62efd1949081ac637039d3a4ea7ea626f","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":"da3b159fa097426d2086d1015963a07244723ba33876e01675542870100b79fa","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":"7dc8cea59061da62df4008aaccf59e3073310b5bf994112ebd760cd5b1fc7b6b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"c2cf94d58704d29827ac705e9e35f8254588564860e197ecfa68a23ac1a4efaf","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: plea (PLEA).\nToken name: plea\nToken symbol: PLEA\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"180072b19a5c8de46f15cf000a1eada0ee0fb186a5e27ba1ea4d43a6255fade0","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"44bbdb43-124b-4e4d-9ef3-4417a61f5e2a","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2090-plea"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51305","feedbackHash":"6eec8c3eb32fa1f046fba74650f00711250d8c650f88901101b5a47af347b0e5","nodeKey":"audit_economics","submissionHash":"84cb83df08c8c2e0bf1dfc0e268b0b8989365ed2f8822079492d6240be3c106d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52685","feedbackHash":"a98733871dc60306617b8df2766412a74fc5af80e9d9a06139ad95c6178080c8","nodeKey":"audit_flow","submissionHash":"29e7f4a98c740d3fc82f8b3ab9b3904e4c0df14fda9242bc496cde4616f7a1ab","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52597","feedbackHash":"fd6f8960015bd585abbf3b059f0742b97bc0138b7896f840e7b83c33efbeb3c6","nodeKey":"audit_judge","submissionHash":"52808d38568942e082386dbd733dbe4e75483515e1441a3557db76c3e58deee5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51512","feedbackHash":"4eea746d86fe9da6a1a3fe3ede6d422e33a03675536531eb21981e8485826dfc","nodeKey":"audit_math","submissionHash":"e05a46b34819b452cf93734c544b1aafaabcf83bef79ca9861a1a2dcd4aab449","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51234","feedbackHash":"b6522f5743c6fa69967cbbdf2b77eb1d6827ba144b2c1343c906e7f7947a12fd","nodeKey":"audit_permissions","submissionHash":"084e34b3acfa893873472b377b3e43c62efd1949081ac637039d3a4ea7ea626f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52344","feedbackHash":"e7ccc9aad22c340008dbb41f14c105924fadf1338702080545fc3d308470e191","nodeKey":"build_contract_project","submissionHash":"da3b159fa097426d2086d1015963a07244723ba33876e01675542870100b79fa","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51013","feedbackHash":"a809b51c2d611049fcb2503e8017ce73fa493dba1567e7440400af1077281963","nodeKey":"manifest","submissionHash":"7dc8cea59061da62df4008aaccf59e3073310b5bf994112ebd760cd5b1fc7b6b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50977","feedbackHash":"b375d77a53075bc60fe8091df9a5fb96ab9e6bf512ad3fe132f20ba17ee4b8f0","nodeKey":"write_foundry_tests","submissionHash":"c2cf94d58704d29827ac705e9e35f8254588564860e197ecfa68a23ac1a4efaf","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6232c288d7d45c213129dc60fad9f5a9542ff04bf9f8526d16d182971bdd94ba","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d00f790fc692b1a4","findings":[{"citation":"resolved","description":"PleaToken inherits OpenZeppelin v5.4.0 ERC20 unchanged (vendored files verified byte-identical to upstream v5.4.0). Its approve(spender, value) overwrites the allowance unconditionally, as ERC-20 specifies. Trust-gap seam access x asymmetry: the owner authorises a spender for X, and the only party who can decide the ordering of 'spend old allowance' versus 'owner replaces allowance' is the spender (or a block builder). If the owner replaces a non-zero allowance A with B in one transaction, a spender who front-runs that transaction with transferFrom(owner, _, A) ends up able to move A + B instead of max(A, B). This is the well-known ERC-20 design property, not a defect introduced by this code; OpenZeppelin v5 intentionally removed increaseAllowance/decreaseAllowance and the README (line 60) already instructs holders to revoke to zero and confirm before setting a new allowance. It is recorded here so the judge has the one asymmetry that exists in this token on file, with a reproduction. Recommended action: none in code; keep the README guidance. Adding increaseAllowance/decreaseAllowance would be a scope decision for the requester, not a required fix.","line":8,"path":"src/PleaToken.sol","reproduction":"State: owner O holds 1,000,000,000e18 PLEA. 1) O calls approve(S, 100e18). 2) O broadcasts approve(S, 50e18) intending to lower the allowance. 3) S front-runs with transferFrom(O, S, 100e18): succeeds, allowance 0. 4) O's approve(S, 50e18) executes: allowance 50e18. 5) S calls transferFrom(O, S, 50e18): succeeds. Actual: S moved 150e18. Expected by O: at most 100e18 ever spendable. Verified with a Foundry test under test/scratch (removed): balanceOf(S) == 150e18 after the sequence.","severity":"info","snippet":"contract PleaToken is ERC20 {","title":"Standard ERC-20 approve race: a spender can spend both the old and the new allowance when a non-zero allowance is replaced (inherent to the standard, documented, no code change required)"}],"hash":"084e34b3acfa893873472b377b3e43c62efd1949081ac637039d3a4ea7ea626f","nodeId":"90aad866-57b0-4e96-a2cb-0b892ec1001b","outcome":"completed","summary":"The review is complete. The findings file is written and validated, the scratch directory is removed, and the working tree has no stray files.\n\n**Outcome: no defect found in the PLEA token's permission model.** The file `.imd-findings.json` holds one informational note and six coverage rows.\n\n**What I checked, per the Access Control, Trust Gap and Asymmetry guides**\n\n- **Permission map.** The compiled ABI exposes only the nine standard ERC-20 methods plus the public supply constant. There is no owner, minter, pauser, blacklist, initializer, upgrade path, receive or fallback, and no payable function. Storage is OpenZeppelin's five slots only.\n- **Constructor and deployment phase.** The whole supply is minted once to the immediate creator with no arguments. Under a CREATE2 factory called by an externally owned account, the factory holds everything and the origin holds nothing. The factory keeps no power afterwards and cannot pull from a holder it was never approved by.\n- **Inconsistent guards and escalation.** Every writer of balances and allowances goes through the unchanged OpenZeppelin `_update` and `_approve` paths. The only authorization is the per-spender allowance, and the unlimited allowance is the only branch that differs, which is standard behavior.\n- **Asymmetry pairs.** Transfer versus transferFrom, happy path versus revert path, and zero-address sentinels all mirror each other. Failed transferFrom calls leave allowance and balances untouched.\n- **Dependency integrity.** I fetched OpenZeppelin v5.4.0 from upstream and diffed it against the vendored copies. They are byte-identical and match the lock file checksums.\n- **Launch flows.** The existing suite and my probes confirm transfers to the distributor, pool counterparty and requester arrive whole, and the supply never changes.\n\n**The one note recorded (severity info).** A spender can front-run an owner's replacement of a non-zero allowance and spend both the old and new amounts. This is the standard ERC-20 approve race, not a defect this code introduced. The README already tells holders to revoke to zero first. I recorded it with a reproduction so the judge has the single asymmetry present on file, and recommended no code change.\n\n**Static analysis leads.** Slither reported nothing. Aderyn's large-numeric-literal line is style only and was not reported.\n\n**Coverage.** All three listed entry points have rows. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":761362,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":13074,"runtime":"claude","turns":35,"wallClockMs":196248}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"776c025db24644e8","findings":[],"hash":"29e7f4a98c740d3fc82f8b3ab9b3904e4c0df14fda9242bc496cde4616f7a1ab","nodeId":"030aa4b4-9e88-48b3-be88-2ec98a53f366","outcome":"completed","summary":"Review complete. No defects found in the assigned area, and `.imd-findings.json` holds an empty findings list with eight coverage rows. The working tree is otherwise untouched.\n\n**What I checked**\n\n- **Execution Trace.** Traced `transfer`, `transferFrom` and `approve` through the vendored OpenZeppelin `_transfer`, `_update`, `_approve` and `_spendAllowance`. Zero-address sentinels revert on every path, including a zero-value `transferFrom` from the zero address, so no mint path exists after construction. Self-transfers net to zero, infinite allowance is never decremented but stays bounded by balance, and failed paths revert atomically. The approve race is standard ERC-20 behaviour, documented in the README, and not reported as a defect.\n- **Periphery.** Fetched the five vendored OpenZeppelin files from the upstream v5.4.0 tag and compared SHA-256 digests. All five match exactly, so the base contract the token trusts is unmodified.\n- **First Principles.** The constructor mints exactly one billion tokens with 18 decimals to the immediate creator, which is the factory under CREATE2. Name, symbol and decimals match the objective. The ABI exposes no mint, burn, owner, pause or upgrade selectors, there is no receive or fallback, and the runtime contains no CALL-family, CREATE, DELEGATECALL, CALLCODE or SELFDESTRUCT opcodes.\n- **Static analysis lead.** The aderyn large-numeric-literal note on line 10 is style only. The constant evaluates to exactly 10^27.\n\n**Evidence run**\n\n- Existing suite: 34 tests pass, including 128 invariant sequences.\n- Ten scratch probes covering the edge paths above all passed, then the scratch directory was removed.\n- `forge fmt --check` passes.\n\n**Coverage record.** All three listed entry points are marked `holds`, plus rows for the constructor, fixed-supply and no-privilege invariants, the vendored library check, and the aderyn lead.","treeHash":null,"usage":{"cachedInputTokens":565086,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13236,"runtime":"claude","turns":29,"wallClockMs":228422}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9f3c23750c16c22c","findings":[{"citation":"resolved","description":"Merged from audit_permissions (its only finding); audit_economics, audit_math, audit_flow and write_foundry_tests reported nothing. PleaToken inherits OpenZeppelin v5.4.0 ERC20 unchanged: I hashed the five vendored files (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol) and they are byte-identical to the upstream v5.4.0 tag. ERC20.approve (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:120) overwrites the allowance unconditionally, so a spender who front-runs a holder's replacement approve can spend the old and the new allowance. This is the ERC-20 design property, not a defect introduced by this code; the README's 'After launch' section already tells holders to revoke to zero and confirm before setting a new allowance. Reproduced and kept on record as a trust assumption only. Recommended action: none in code. Adding increaseAllowance/decreaseAllowance would be a scope decision for the requester, not a required fix, and must not block admission.","line":8,"path":"src/PleaToken.sol","reproduction":"Foundry test (run under test/scratch, removed): deploy PleaToken from O (O holds 1,000,000,000e18). 1) prank O: approve(S, 100e18). 2) prank S: transferFrom(O, S, 100e18) succeeds, allowance 0. 3) prank O: approve(S, 50e18) (O's intended reduction, mined after S's spend). 4) prank S: transferFrom(O, S, 50e18) succeeds. Expected by O: at most 100e18 ever spendable by S. Actual: balanceOf(S) == 150e18. Observed exactly that: the test asserting balanceOf(S) == 150e18 passes on the code as it is.","severity":"info","snippet":"contract PleaToken is ERC20 {","title":"Standard ERC-20 approve replacement race (inherent to the standard, documented in README, no code change required)"}],"hash":"52808d38568942e082386dbd733dbe4e75483515e1441a3557db76c3e58deee5","nodeId":"8decc1ab-5348-48a4-a912-80a8365d4839","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing else is needed.\n\n**Outcome:** the PLEA token holds. No defect was found, and the one specialist finding is an inherent ERC-20 property, kept only as an informational note that requires no code change.\n\n**What I verified**\n\n- The token is a 17-line contract inheriting OpenZeppelin v5.4.0 ERC20 with a single constructor mint to msg.sender. The SHA-256 of all five vendored OpenZeppelin files matches the upstream v5.4.0 tag and the project's lock file.\n- All three state-changing entry points (approve, transfer, transferFrom) are the unmodified OpenZeppelin paths. I traced their checks, state changes and revert paths, and the project's 50 tests plus the stateful invariant suite pass with the requested fuzz seed. The formatter check passes.\n- Deployability under the factory model holds. The constructor takes no arguments, matching the manifest's empty constructorArgs, and the sizes are well under the limits.\n\n| Artifact | Size | Limit |\n| --- | --- | --- |\n| creation code | 2,634 bytes | 49,152 |\n| runtime | 1,753 bytes | 24,576 |\n\n- The runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT. The ABI exposes no mint, burn, owner, pause or blacklist function.\n- launch.json uses only schema keys, its totalSupply equals the constructor mint, and the paired currency on chain 1 answers as IMD with 18 decimals.\n\n**Specialist findings**\n\n- The audit_permissions note on the approve replacement race reproduced exactly as stated: a spender front-running a replacement approve moved 150e18 against an intended ceiling of 100e18. This is the ERC-20 standard's own behavior, the README already documents the revoke-then-approve mitigation, and I kept it at info with an explicit statement that no change is required and it must not block admission.\n- The other four areas reported nothing, and my own pass found nothing they missed.\n\nThe findings file at the repository root holds one info finding and seven coverage rows covering every listed entry point plus the constructor, deployability, manifest and dependency checks. The scratch test I used for the reproduction has been removed, so no tracked file changed.","treeHash":null,"usage":{"cachedInputTokens":555750,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":8788,"runtime":"claude","turns":11,"wallClockMs":142018}},{"artifacts":[],"attempt":1,"bundleHash":"ba23d719c4b10b31d58eddeff84f1931a2b7197f9a620e302462529a1439bda8","device":"84a29c6575331b77","findings":[],"hash":"7dc8cea59061da62df4008aaccf59e3073310b5bf994112ebd760cd5b1fc7b6b","nodeId":"c2f0e6ba-ed2a-4b0e-b235-d0fa9825eac0","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/44bbdb43-124b-4e4d-9ef3-4417a61f5e2a/c2f0e6ba-ed2a-4b0e-b235-d0fa9825eac0/launch.json) matching `PleaToken`, its exact supply, empty constructor arguments, and required pool and economics values.\n\n`forge build` succeeded; all 34 repository tests passed with the supplied fuzz seed. Manifest field and constructor ABI checks passed. Only `launch.json` changed.","treeHash":"19adaae8f83fe75dd243602783f061ec19faba70","usage":{"cachedInputTokens":171776,"inputTokens":36648,"model":"gpt-6-astra","outputTokens":2375,"runtime":"codex","turns":3,"wallClockMs":69268}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4576f670afa0131d","findings":[],"hash":"84cb83df08c8c2e0bf1dfc0e268b0b8989365ed2f8822079492d6240be3c106d","nodeId":"2770af89-c076-41de-b5d7-ebffb5934a8d","outcome":"completed","summary":"The review is complete. No defects found in the Economic Security, Invariant or Flow Gap areas, and the findings file records that with full coverage.\n\n**What I reviewed.** `src/PleaToken.sol` is an unmodified OpenZeppelin v5.4.0 ERC20 with one constructor that mints 10^27 units to the immediate deployer. I compared every vendored library file against the upstream mirror and found only header and comment differences. The verifier's offline build, all 34 existing tests, formatting and a second fuzz seed with 3,000 runs all pass.\n\n**Area results.**\n- **Economic Security.** There are no external dependencies, oracles, callbacks or payable paths. Transfers move exact amounts with no fee, rebase, pause or blacklist. Sentinel addresses behave per the standard: transfer and approve to the zero address revert. Decimals are 18 as the brief requires.\n- **Invariant.** Total supply is fixed at construction and nothing in the contract can reach a mint or burn afterwards. Sum of balances equals total supply under the existing stateful invariant tests.\n- **Flow Gap.** I ran a scratch test against a real Uniswap v4 PoolManager covering every launch leg: factory to distributor and on to a claimant, a single-sided seed settled by plain transfer, a trader buying with ETH and selling everything back, and the remainder to the requester. Every leg moved exactly the manager's delta and the three legs summed to the supply. The scratch test was removed afterwards.\n\n**Trust assumptions.** The contract has no owner, minter, pauser, upgrade or recovery function, and its runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT. The only inherent ERC-20 properties worth noting are the approve-overwrite race and irrecoverable tokens sent to the token's own address. Both are standard behavior the README documents, so I did not report them as defects.\n\n**Coverage.** The findings file holds an empty findings list plus eight coverage rows: the three entry points, each marked holds, and five invariant and flow rows describing what was traced and run. The working tree is unchanged apart from `.imd-findings.json`.","treeHash":null,"usage":{"cachedInputTokens":1173237,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":22063,"runtime":"claude","turns":26,"wallClockMs":371071}},{"artifacts":[],"attempt":1,"bundleHash":"0b3bf101434d3419895ee94f8c7a022aaba221e988899def887b7a5391e59e78","device":"77cba07fd04368e3","findings":[],"hash":"c2cf94d58704d29827ac705e9e35f8254588564860e197ecfa68a23ac1a4efaf","nodeId":"936d597e-93aa-4980-bbc2-023ab52a6d7e","outcome":"completed","summary":"Added 16 boundary and failure-path tests, plus stronger invariants tracking every actor’s balances and allowances.\n\n`forge build` and the full offline `forge test` passed with the specified seed, including 32,768 invariant calls.\n\nOnly `test/` changed. No defects found.","treeHash":"cff4e3622ea909e1a2cdc52c76d812ad5ef2f963","usage":{"cachedInputTokens":883200,"inputTokens":70894,"model":"gpt-6-astra","outputTokens":11106,"runtime":"codex","turns":6,"wallClockMs":325122}},{"artifacts":[],"attempt":1,"bundleHash":"dfb00ebc28c690d492d19b891b9b2fdd3d31151bc8508ee6ea91a9f53e241b81","device":"ab846a7d68ed31f8","findings":[],"hash":"da3b159fa097426d2086d1015963a07244723ba33876e01675542870100b79fa","nodeId":"8c39bd46-3d9c-48c0-a49e-f4ec2fad07b5","outcome":"completed","summary":"Implemented [PleaToken](src/PleaToken.sol): 1,000,000,000 PLEA with 18 decimals, minted once to the deployer, with no administrative powers.\n\nVendored dependencies and documented deployment and operations in [README.md](README.md).\n\nValidation passed: `forge build`, all 34 local tests with the requested fuzz seed, and `forge fmt --check`. Full launch/pool admission checks remain with the network verifier.","treeHash":"cee3b48985b38dc408777dced3dd81a4e865fe34","usage":{"cachedInputTokens":617728,"inputTokens":51649,"model":"gpt-6-astra","outputTokens":16096,"runtime":"codex","turns":5,"wallClockMs":428902}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8c9c4986ca881107","findings":[],"hash":"e05a46b34819b452cf93734c544b1aafaabcf83bef79ca9861a1a2dcd4aab449","nodeId":"18e7c314-df30-4e45-a0b5-934a277b4403","outcome":"completed","summary":"The review is complete. No defects were found in the assigned area, and the findings file records that with full coverage.\n\n**Result:** `.imd-findings.json` holds zero findings and seven coverage rows. All three entry points are marked `holds`, plus four rows for the invariants and seams I checked.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides:**\n- The token is `src/PleaToken.sol`, a ten-line subclass of OpenZeppelin's ERC-20 with a constructor mint and nothing else. I confirmed the vendored OpenZeppelin files are byte-identical to upstream v5.4.0 by fetching and hashing the upstream sources.\n- The supply constant is a compile-time expression evaluated at arbitrary precision and equals exactly 1e27. That resolves the one aderyn lead (large numeric literal) as a non-issue.\n- Transfer and delegated-transfer arithmetic: the balance and allowance checks precede the unchecked subtractions, so balance+1, max uint, and allowance-above-balance inputs all revert with the correct custom error and leave state untouched. Receiver balances cannot overflow because all balances sum to 1e27. The max-uint allowance sentinel is never decremented, and max-minus-one is decremented exactly.\n- Zero and sentinel boundaries: zero-value transfers succeed, any call involving the zero address reverts, and a zero-address `transferFrom` cannot mint even for a zero amount. The contract has no receive or fallback, so plain ETH sends revert.\n- Launch flow math: the swarm's ten percent, its two and eight percent slices, and the pool share all divide 1e27 with no remainder, and the token applies no fee or exemption, so every launch leg moves exactly what it says.\n- No divisions, rate multiplications, downcasts or scale conversions exist, so there are no precision-times-invariant seams to exploit.\n\n**Evidence run:** `forge build`, the project's 34 tests with the README's fuzz seed, `forge fmt --check`, and a scratch suite of ten boundary probes (1024 fuzz runs on the balance edge). All passed. The scratch directory was removed afterwards and the tree is otherwise unchanged.\n\n**Not covered:** nothing in my area was left unreached. Outside it, I did not run a full access-control or economic pass, though the token exposes no privileged function, proxy, delegatecall or selfdestruct for one to examine.","treeHash":null,"usage":{"cachedInputTokens":508724,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":10875,"runtime":"claude","turns":19,"wallClockMs":165376}}],"verification":[{"checks":[{"durationMs":1270,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.20s\nCompiler run successful!\n","passed":true},{"durationMs":808,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/PleaTokenLaunch.t.sol:PleaTokenLaunchTest\n[PASS] testFuzz_Create2DeploysWithNoArgumentsOrExternalDependencies(bytes32) (runs: 1024, μ: 62757, ~: 62867)\n[PASS] test_FactoryReceivesEntireSupplyInsteadOfTransactionOrigin() (gas: 77714)\n[PASS] test_LaunchAllocationClaimAndPoolTransfersArriveWhole() (gas: 427297)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 39.69ms (44.12ms CPU time)\n\nRan 30 tests for test/PleaToken.t.sol:PleaTokenTest\n[PASS] testFuzz_ApprovalsAreIndependent(address,uint256,uint256) (runs: 1024, μ: 195082, ~: 196431)\n[PASS] testFuzz_DelegatedTransferPreservesBalancesAndAllowance(uint256,uint256) (runs: 1024, μ: 164204, ~: 165171)\nLogs:\n  Bound result 4928\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129635104\n\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 126700, ~: 127039)\nLogs:\n  Bound result 0\n  Bound result 10000000000000000000\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 1024, μ: 93072, ~: 93207)\nLogs:\n  Bound result 8\n\n[PASS] testFuzz_TransferFromAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 122691, ~: 123379)\nLogs:\n  Bound result 400890906051311290873795349\n  Bound result 29477825679\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 166816)\n[PASS] test_ApproveEmitsEventWithoutMovingTokens() (gas: 88776)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 37632)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_DeployerCannotSpendAnotherHoldersTokensWithoutApproval() (gas: 94987)\n[PASS] test_InfiniteAllowanceIsNotDecreased() (gas: 189572)\n[PASS] test_MetadataAndEntireSupplyBelongToDeployer() (gas: 107671)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1111744)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 1034566)\n[PASS] test_SelfTransferPreservesBalanceAndEmitsEvent() (gas: 43718)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 40210)\n[PASS] test_TransferEntireSupply() (gas: 75777)\n[PASS] test_TransferFromByHolderAlsoRequiresAllowance() (gas: 42598)\n[PASS] test_TransferFromExhaustsExactAllowance() (gas: 161855)\n[PASS] test_TransferFromMovesExactAmountAndSpendsAllowance() (gas: 172614)\n[PASS] test_TransferFromRejectsInsufficientAllowanceAtomically() (gas: 115769)\n[PASS] test_TransferFromRejectsInsufficientBalanceAndRestoresAllowance() (gas: 126176)\n[PASS] test_TransferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 114179)\n[PASS] test_TransferFromToSelfSpendsAllowanceWithoutChangingBalance() (gas: 103272)\n[PASS] test_TransferFromZeroAddressCannotMintEvenZeroTokens() (gas: 57123)\n[PASS] test_TransferMovesExactAmountAndEmitsEvent() (gas: 91551)\n[PASS] test_TransferRejectsInsufficientBalance() (gas: 55120)\n[PASS] test_TransferRejectsZeroRecipientEvenForZeroAmount() (gas: 71883)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73332)\n[PASS] test_ZeroTransferFromNeedsNoAllowanceAndEmitsEvent() (gas: 81429)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 42.34ms (215.77ms CPU time)\n\nRan 1 test for test/PleaToken.invariant.t.sol:PleaTokenInvariantTest\n[PASS]\nPleaTokenInvariantTest invariants:\n[PASS] invariant_AllTokensRemainAccountedFor\n[PASS] invariant_SupplyNeverChangesAndZeroAddressNeverHoldsTokens\n PleaTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------------+----------------------+-------+---------+----------╮\n| Contract         | Selector             | Calls | Reverts | Discards |\n+======================================================================+\n| PleaTokenHandler | approve              | 2075  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| PleaTokenHandler | attemptOverAllowance | 2048  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| PleaTokenHandler | transfer             | 2072  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| PleaTokenHandler | transferFrom         | 1997  | 0       | 0        |\n╰------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 490313233650758522928240046\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 403240313507797238414180922\n  Bound result 640\n  Bound result 127136079491866217503198962\n  Bound result 9\n  Bound result 345\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 8757\n  Bound result 0\n  Bound result 5\n  Bound result 1283\n  Bound result 3683\n  Bound result 12440\n  Bound result 1\n  Bound result 3\n  Bound result 15\n  Bound result 73943457099796204371998473\n  Bound result 12\n  Bound result 1\n  Bound result 1284\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 717.04ms (715.32ms CPU time)\n\nRan 3 test suites in 718.35ms (799.06ms CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PleaToken.approve(address,uint256)\",\"PleaToken.transfer(address,uint256)\",\"PleaToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":12,\"LICENSE\":21,\"README.md\":65,\"dependencies.lock.json\":58,\"foundry.toml\":18,\"launch.json\":20,\"remappings.txt\":2,\"src/PleaToken.sol\":17,\"test/PleaToken.invariant.t.sol\":109,\"test/PleaToken.t.sol\":359,\"test/PleaTokenLaunch.t.sol\":95},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7dc8cea59061da62df4008aaccf59e3073310b5bf994112ebd760cd5b1fc7b6b","verifiedTreeHash":"19adaae8f83fe75dd243602783f061ec19faba70","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1645,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.56s\nCompiler run successful!\n","passed":true},{"durationMs":9704,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/PleaTokenLaunch.t.sol:PleaTokenLaunchTest\n[PASS] testFuzz_Create2DeploysWithNoArgumentsOrExternalDependencies(bytes32) (runs: 1024, μ: 62759, ~: 62867)\n[PASS] test_FactoryReceivesEntireSupplyInsteadOfTransactionOrigin() (gas: 77714)\n[PASS] test_LaunchAllocationClaimAndPoolTransfersArriveWhole() (gas: 427297)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 94.16ms (94.83ms CPU time)\n\nRan 16 tests for test/PleaTokenEdges.t.sol:PleaTokenEdgesTest\n[PASS] testFuzz_ApprovalReplacementAfterPartialSpend(uint256,uint256,uint256) (runs: 1000, μ: 392947, ~: 392862)\nLogs:\n  Bound result 884323312438543434223417118\n  Bound result 380859489852244298095980417\n  Bound result 464356722279588258804347639\n\n[PASS] testFuzz_BalanceFailureCanBeRetriedAfterFunding(uint256,uint256) (runs: 1000, μ: 335322, ~: 335716)\nLogs:\n  Bound result 959510850428407811063898200\n  Bound result 969210234236019330658959976\n\n[PASS] testFuzz_OnlyTheApprovedSpenderCanUseAnAllowance(uint256) (runs: 1000, μ: 294499, ~: 294318)\nLogs:\n  Bound result 90\n\n[PASS] testFuzz_SplitTransfersAndRoundTripConserveExactUnits(uint256,uint256) (runs: 1000, μ: 249607, ~: 249675)\nLogs:\n  Bound result 5\n  Bound result 1\n\n[PASS] test_ApprovalAboveSupplyDoesNotAuthorizeAnOverdraft() (gas: 201832)\n[PASS] test_InfiniteApprovalCanBecomeFiniteThenBeRevoked() (gas: 300174)\n[PASS] test_MaximumDelegatedTransferCannotCreateTokensWithInfiniteApproval() (gas: 129436)\n[PASS] test_MaximumMinusOneApprovalIsFinite() (gas: 210739)\n[PASS] test_MaximumTransferRevertsWithoutOverflowOrBalanceChanges() (gas: 65348)\n[PASS] test_OneUnitRoundTripAndEmptySenderRejection() (gas: 226828)\n[PASS] test_SelfApprovedHolderConsumesItsOwnAllowance() (gas: 267567)\n[PASS] test_TransferToTokenContractDoesNotBurnOrTax() (gas: 92308)\n[PASS] test_ZeroApprovalToZeroSpenderStillReverts() (gas: 110345)\n[PASS] test_ZeroCallerCannotTransferOrApproveEvenZero() (gas: 100768)\n[PASS] test_ZeroDelegatedTransferFromEmptyHolderPreservesInfiniteApproval() (gas: 136878)\n[PASS] test_ZeroDelegatedTransferToZeroReceiverStillReverts() (gas: 122014)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 94.17ms (308.98ms CPU time)\n\nRan 30 tests for test/PleaToken.t.sol:PleaTokenTest\n[PASS] testFuzz_ApprovalsAreIndependent(address,uint256,uint256) (runs: 1024, μ: 195144, ~: 196443)\n[PASS] testFuzz_DelegatedTransferPreservesBalancesAndAllowance(uint256,uint256) (runs: 1024, μ: 164249, ~: 165183)\nLogs:\n  Bound result 410265694\n  Bound result 75771256779247358946220653749383803792324847378524\n\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 126741, ~: 127063)\nLogs:\n  Bound result 15778\n  Bound result 23485\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 1024, μ: 93079, ~: 93207)\nLogs:\n  Bound result 965168136343757077737755440\n\n[PASS] testFuzz_TransferFromAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 122720, ~: 123379)\nLogs:\n  Bound result 410265694\n  Bound result 997173926320816833984582\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 166816)\n[PASS] test_ApproveEmitsEventWithoutMovingTokens() (gas: 88776)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 37632)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_DeployerCannotSpendAnotherHoldersTokensWithoutApproval() (gas: 94987)\n[PASS] test_InfiniteAllowanceIsNotDecreased() (gas: 189572)\n[PASS] test_MetadataAndEntireSupplyBelongToDeployer() (gas: 107671)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1111744)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 1034566)\n[PASS] test_SelfTransferPreservesBalanceAndEmitsEvent() (gas: 43718)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 40210)\n[PASS] test_TransferEntireSupply() (gas: 75777)\n[PASS] test_TransferFromByHolderAlsoRequiresAllowance() (gas: 42598)\n[PASS] test_TransferFromExhaustsExactAllowance() (gas: 161855)\n[PASS] test_TransferFromMovesExactAmountAndSpendsAllowance() (gas: 172614)\n[PASS] test_TransferFromRejectsInsufficientAllowanceAtomically() (gas: 115769)\n[PASS] test_TransferFromRejectsInsufficientBalanceAndRestoresAllowance() (gas: 126176)\n[PASS] test_TransferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 114179)\n[PASS] test_TransferFromToSelfSpendsAllowanceWithoutChangingBalance() (gas: 103272)\n[PASS] test_TransferFromZeroAddressCannotMintEvenZeroTokens() (gas: 57123)\n[PASS] test_TransferMovesExactAmountAndEmitsEvent() (gas: 91551)\n[PASS] test_TransferRejectsInsufficientBalance() (gas: 55120)\n[PASS] test_TransferRejectsZeroRecipientEvenForZeroAmount() (gas: 71883)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73332)\n[PASS] test_ZeroTransferFromNeedsNoAllowanceAndEmitsEvent() (gas: 81429)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 94.21ms (478.07ms CPU time)\n\nRan 1 test for test/PleaToken.invariant.t.sol:PleaTokenInvariantTest\n[PASS]\nPleaTokenInvariantTest invariants:\n[PASS] invariant_AllTokensRemainAccountedFor\n[PASS] invariant_EveryBalanceAndAllowanceMatchesTheActionLedger\n[PASS] invariant_SupplyNeverChangesAndZeroAddressNeverHoldsTokens\n PleaTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+--------------------------------+-------+---------+----------╮\n| Contract         | Selector                       | Calls | Reverts | Discards |\n+================================================================================+\n| PleaTokenHandler | approve                        | 3506  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | approveBoundary                | 3699  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | attemptInvalidApproval         | 3735  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | attemptInvalidReceiver         | 3575  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | attemptOverAllowance           | 3646  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | attemptOverBalance             | 3702  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | attemptTransferFromOverBalance | 3737  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | transfer                       | 3615  | 0       | 0        |\n|------------------+--------------------------------+-------+---------+----------|\n| PleaTokenHandler | transferFrom                   | 3553  | 0       | 0        |\n╰------------------+--------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5642\n  Bound result 14\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 210927374733623685686153412\n  Bound result 471684509092934670636157375966103542420166230996\n  Bound result 209\n  Bound result 10000000000000000000\n  Bound result 2378\n  Bound result 3000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 7243\n  Bound result 132\n  Bound result 42000000000000000000\n  Bound result 244\n  Bound result 11\n  Bound result 0\n  Bound result 242\n  Bound result 7\n  Bound result 4429669784896142161088321627572631977520848565327333201486737\n  Bound result 1\n  Bound result 0\n  Bound result 6212\n  Bound result 0\n  Bound result 10\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 12031\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1189\n  Bound result 262\n  Bound result 3620\n  Bound result 6000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.61s (9.61s CPU time)\n\nRan 4 test suites in 9.62s (9.90s CPU time): 50 tests passed, 0 failed, 0 skipped (50 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PleaToken.approve(address,uint256)\",\"PleaToken.transfer(address,uint256)\",\"PleaToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":12,\"LICENSE\":21,\"README.md\":65,\"dependencies.lock.json\":58,\"foundry.toml\":18,\"remappings.txt\":2,\"src/PleaToken.sol\":17,\"test/PleaToken.invariant.t.sol\":203,\"test/PleaToken.t.sol\":359,\"test/PleaTokenEdges.t.sol\":285,\"test/PleaTokenLaunch.t.sol\":95},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c2cf94d58704d29827ac705e9e35f8254588564860e197ecfa68a23ac1a4efaf","verifiedTreeHash":"cff4e3622ea909e1a2cdc52c76d812ad5ef2f963","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1343,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.26s\nCompiler run successful!\n","passed":true},{"durationMs":764,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/PleaTokenLaunch.t.sol:PleaTokenLaunchTest\n[PASS] testFuzz_Create2DeploysWithNoArgumentsOrExternalDependencies(bytes32) (runs: 1024, μ: 62757, ~: 62867)\n[PASS] test_FactoryReceivesEntireSupplyInsteadOfTransactionOrigin() (gas: 77714)\n[PASS] test_LaunchAllocationClaimAndPoolTransfersArriveWhole() (gas: 427297)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 40.54ms (41.32ms CPU time)\n\nRan 30 tests for test/PleaToken.t.sol:PleaTokenTest\n[PASS] testFuzz_ApprovalsAreIndependent(address,uint256,uint256) (runs: 1024, μ: 195082, ~: 196431)\n[PASS] testFuzz_DelegatedTransferPreservesBalancesAndAllowance(uint256,uint256) (runs: 1024, μ: 164204, ~: 165171)\nLogs:\n  Bound result 141176850326936500\n  Bound result 1224589502830844110091642142409109281063763890309918495258418569767378\n\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 126700, ~: 127039)\nLogs:\n  Bound result 410265694\n  Bound result 75771256779247358946220653749383803792324847378524\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 1024, μ: 93072, ~: 93207)\nLogs:\n  Bound result 965168136343757077737755440\n\n[PASS] testFuzz_TransferFromAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 122691, ~: 123379)\nLogs:\n  Bound result 3600872649\n  Bound result 742183167922927628829309222\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 166816)\n[PASS] test_ApproveEmitsEventWithoutMovingTokens() (gas: 88776)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 37632)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_DeployerCannotSpendAnotherHoldersTokensWithoutApproval() (gas: 94987)\n[PASS] test_InfiniteAllowanceIsNotDecreased() (gas: 189572)\n[PASS] test_MetadataAndEntireSupplyBelongToDeployer() (gas: 107671)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1111744)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 1034566)\n[PASS] test_SelfTransferPreservesBalanceAndEmitsEvent() (gas: 43718)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 40210)\n[PASS] test_TransferEntireSupply() (gas: 75777)\n[PASS] test_TransferFromByHolderAlsoRequiresAllowance() (gas: 42598)\n[PASS] test_TransferFromExhaustsExactAllowance() (gas: 161855)\n[PASS] test_TransferFromMovesExactAmountAndSpendsAllowance() (gas: 172614)\n[PASS] test_TransferFromRejectsInsufficientAllowanceAtomically() (gas: 115769)\n[PASS] test_TransferFromRejectsInsufficientBalanceAndRestoresAllowance() (gas: 126176)\n[PASS] test_TransferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 114179)\n[PASS] test_TransferFromToSelfSpendsAllowanceWithoutChangingBalance() (gas: 103272)\n[PASS] test_TransferFromZeroAddressCannotMintEvenZeroTokens() (gas: 57123)\n[PASS] test_TransferMovesExactAmountAndEmitsEvent() (gas: 91551)\n[PASS] test_TransferRejectsInsufficientBalance() (gas: 55120)\n[PASS] test_TransferRejectsZeroRecipientEvenForZeroAmount() (gas: 71883)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73332)\n[PASS] test_ZeroTransferFromNeedsNoAllowanceAndEmitsEvent() (gas: 81429)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 40.65ms (212.78ms CPU time)\n\nRan 1 test for test/PleaToken.invariant.t.sol:PleaTokenInvariantTest\n[PASS]\nPleaTokenInvariantTest invariants:\n[PASS] invariant_AllTokensRemainAccountedFor\n[PASS] invariant_SupplyNeverChangesAndZeroAddressNeverHoldsTokens\n PleaTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------------+----------------------+-------+---------+----------╮\n| Contract         | Selector             | Calls | Reverts | Discards |\n+======================================================================+\n| PleaTokenHandler | approve              | 2075  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| PleaTokenHandler | attemptOverAllowance | 2048  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| PleaTokenHandler | transfer             | 2072  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| PleaTokenHandler | transferFrom         | 1997  | 0       | 0        |\n╰------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 490313233650758522928240046\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 403240313507797238414180922\n  Bound result 640\n  Bound result 127136079491866217503198962\n  Bound result 9\n  Bound result 345\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 8757\n  Bound result 0\n  Bound result 5\n  Bound result 1283\n  Bound result 3683\n  Bound result 12440\n  Bound result 1\n  Bound result 3\n  Bound result 15\n  Bound result 73943457099796204371998473\n  Bound result 12\n  Bound result 1\n  Bound result 1284\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 674.15ms (672.55ms CPU time)\n\nRan 3 test suites in 675.41ms (755.35ms CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PleaToken.approve(address,uint256)\",\"PleaToken.transfer(address,uint256)\",\"PleaToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":12,\"LICENSE\":21,\"README.md\":65,\"dependencies.lock.json\":58,\"foundry.toml\":18,\"remappings.txt\":2,\"src/PleaToken.sol\":17,\"test/PleaToken.invariant.t.sol\":109,\"test/PleaToken.t.sol\":359,\"test/PleaTokenLaunch.t.sol\":95},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":445,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":219,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PleaToken.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"da3b159fa097426d2086d1015963a07244723ba33876e01675542870100b79fa","verifiedTreeHash":"cee3b48985b38dc408777dced3dd81a4e865fe34","verifierVersion":"0.1.0+c3fba9eb"}]}