{"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":"690a359e-03e5-426b-ac92-5aa60bfc96f6","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"fcc71c64924202669962bdda933eed33d792a14e6cf60fe8140d26e98d88e573","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"2fddfd2649246300f493df5f94bc46b2a27046dc88c0882eb255f868d0392ee7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3ec734463ed07bcc13ac643164edebca4a4d2f192a965e69577a1897035e3121","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"a8ef2ce1f4693b67ba4f31054019995802a6f40ff7d7529fa5729308b6b447f0","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"1a06656f74e2a976465e3fe605427af7f624362955d16739c05e9f4ba5499304","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d9bb657d812aaf996ba1982eafe8bbd8249645ef1c17e9ee78824fc7b16822b2","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"a1075d5e693daa7d44691ed5aab54af4e648490fbeb8001b8e151daee90274d6","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"6e9b886094ed67275a1cac4e237ac23c711258cabaf8af70711f85142eb84fa4","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: pleaimd (PLEA).\nToken name: pleaimd\nToken symbol: PLEA\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"9ca8d245e04e3287eac855194953c926c2ef16fc24a378c7bf55149b4faf83e5","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"690a359e-03e5-426b-ac92-5aa60bfc96f6","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2650-pleaimd"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52258","feedbackHash":"af13785e12870c7f447a0e597f40a296d93d9ec7e3f5b2495edc59ba8d0b842a","nodeKey":"audit_economics","submissionHash":"fcc71c64924202669962bdda933eed33d792a14e6cf60fe8140d26e98d88e573","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51020","feedbackHash":"2a6200d6c9d93c98ee220ab0a31680870da8cb90526d05dfcca1ce62093412cb","nodeKey":"audit_flow","submissionHash":"2fddfd2649246300f493df5f94bc46b2a27046dc88c0882eb255f868d0392ee7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50995","feedbackHash":"082ae1c8fc5980ecc0d3f32338ec7050bba814e4276536072c780f6a9260139f","nodeKey":"audit_judge","submissionHash":"3ec734463ed07bcc13ac643164edebca4a4d2f192a965e69577a1897035e3121","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52666","feedbackHash":"41c3285a5cfcd9bb19dc4ae957443133b043caa3c460a64f7dc96226dc0ee2fb","nodeKey":"audit_math","submissionHash":"a8ef2ce1f4693b67ba4f31054019995802a6f40ff7d7529fa5729308b6b447f0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51484","feedbackHash":"8779009b0f9af78c4210a1318d480da7be4dfa85c473ede9fb42adf29c3825b4","nodeKey":"audit_permissions","submissionHash":"1a06656f74e2a976465e3fe605427af7f624362955d16739c05e9f4ba5499304","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52158","feedbackHash":"9f63f19c37fed96bf63a919619d19e791e1bf3e533dc7d2179ef4716c87e4b86","nodeKey":"build_contract_project","submissionHash":"d9bb657d812aaf996ba1982eafe8bbd8249645ef1c17e9ee78824fc7b16822b2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50954","feedbackHash":"9d0331b3f492e05b84acc275a731ecf464539bc3fd494ec660c563f0384f07a1","nodeKey":"manifest","submissionHash":"a1075d5e693daa7d44691ed5aab54af4e648490fbeb8001b8e151daee90274d6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52590","feedbackHash":"c0b8ad50249a3edc8a848a0565651910f51f88acf1cdae5723f396c179b94e93","nodeKey":"write_foundry_tests","submissionHash":"6e9b886094ed67275a1cac4e237ac23c711258cabaf8af70711f85142eb84fa4","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3491f72bb6eb5d26fc4c9a5d3fddcbb6e674f18a930f3c147cc5e10bf05d7c19","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6ed09c2eb1ff6aec","findings":[],"hash":"1a06656f74e2a976465e3fe605427af7f624362955d16739c05e9f4ba5499304","nodeId":"f1411234-3a51-4b6f-9f29-811f586079f9","outcome":"completed","summary":"I found no defects in the permissions area of `src/PleaToken.sol`. I wrote `.imd-findings.json` with an empty findings list and a coverage row for each of the six entry points, all marked `holds`, plus one row for the \"no privileged role\" invariant. The project's existing tests all pass (38 of 38).\n\n**Access Control.** The contract has no owner, no modifiers and no admin functions, and the constructor takes no arguments and gives no one a role. The whole supply (10^27 minor units) goes to `msg.sender` once, and nothing can mint afterwards. So nothing can pause, freeze, blacklist, seize or burn a holder's tokens. `burn` only destroys the caller's own balance, and there is no `burnFrom`.\n\n**Trust Gap.** Every write affects only the caller's own balance or allowances, or spends an allowance someone gave the caller (`transferFrom`). No function trusts a stored address or an external call: the token makes no outside calls and has no callbacks or hooks.\n\n**Asymmetry.**\n- `transfer` and `transferFrom` share the same internal transfer, so both reject sending to the zero address and check the balance the same way.\n- `increaseAllowance` reverts on overflow, and `decreaseAllowance` reverts if you try to lower an allowance below zero, before any unchecked subtraction.\n- An allowance of `type(uint256).max` counts as unlimited and is never reduced.\n- Granting an allowance to the zero address reverts.\n- `transferFrom(address(0), …)` can't be reached, because the zero address can never have approved anyone.\n\n**Launch flows.** There is no fee, burn or exemption on transfer, so what the factory sends to the distributor, to the pool and to the remainder address arrives in full. Trades through the PoolManager move exact amounts too.\n\n**Static analysis.** Aderyn's \"large numeric literal\" warning (line 27) is just the supply constant `1_000_000_000 * 10 ** 18`, which is correct, so it isn't a defect.\n\n**Not covered.** I didn't review `launch.json` because the tree doesn't have one yet, and I didn't run the protected floor tests here.","treeHash":null,"usage":{"cachedInputTokens":100603,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2327,"runtime":"claude","turns":4,"wallClockMs":44264}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a31e321b410aaa02","findings":[],"hash":"2fddfd2649246300f493df5f94bc46b2a27046dc88c0882eb255f868d0392ee7","nodeId":"a3807b29-f191-4289-9125-4969c87b8771","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written in the repository root with an empty findings list and nine coverage rows.\n\n**Outcome: no defects found** in the control-flow area (Execution Trace, Periphery, First Principles) of `src/PleaToken.sol`.\n\n**What I checked**\n\n- **All six entry points** traced from call to final state: zero-address guards, balance and allowance checks, the unchecked blocks and why they cannot wrap, error argument order, and event emission. Each gets a `holds` row with its reason.\n- **Execution Trace items**: the `type(uint256).max` allowance sentinel skips the decrement and the Approval event only, with no validation bypassed. Allowance is spent before the balance check, and a balance revert undoes the spend atomically. Self-transfer re-reads the debited slot so balances are conserved.\n- **First Principles items**: the sum of balances equals totalSupply from the constructor onward, which is the assumption the unchecked credit in the transfer helper rests on. A stateful fuzz run over transfer, transferFrom and burn across 4 actors held it for 128,000 calls with zero reverts.\n- **Periphery**: there are no libraries or inherited contracts. The three private helpers are reached only from the six entry points. Constants return the required name, symbol and decimals, and the supply constant equals the manifest value.\n- **Surface**: the compiled ABI has exactly the six nonpayable functions plus views. No payable function, receive, fallback, owner, mint, pause, blacklist or burnFrom exists. The existing opcode-scan test passes.\n\n**Leads I examined and left out**, since they are self-harm only or standard behaviour with no victim: approving the zero address reverts, including with amount zero, and tokens can be sent to the token's own address. The aderyn large-numeric-literal line is style only.\n\nScratch tests under `test/scratch/` were run and then removed, so the tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":556536,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":12800,"runtime":"claude","turns":23,"wallClockMs":282881}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b5e3297a04468fd3","findings":[{"citation":"resolved","description":"Reported by audit_math; reproduced. The addition at src/PleaToken.sol:113 is checked arithmetic, so when the existing allowance plus addedValue exceeds type(uint256).max the call reverts with the compiler's Panic(uint256) code 0x11 rather than one of the contract's four declared custom errors. README.md:25 states 'All failures revert with a typed error; nothing returns false'. Every other failure path (InsufficientBalance, InsufficientAllowance, TransferToZeroAddress, ApproveToZeroAddress) honours that; this one edge does not. No funds are at risk and state is unchanged by the revert: the allowance stays at its previous value. The project's own test (test/PleaToken.t.sol:189) uses a bare vm.expectRevert() for this case, which hides the mismatch. Minimal fix: either amend README.md:25 to document the Panic on allowance overflow, or add a typed error (e.g. AllowanceOverflow) guarded by `if (addedValue > type(uint256).max - current) revert ...` before the addition. The adjacent boundary is intended: approve(spender, max-1) then increaseAllowance(spender, 1) reaches exactly type(uint256).max, which transferFrom then treats as unlimited.","line":113,"path":"src/PleaToken.sol","reproduction":"State: fresh PleaToken deployed by `deployer`. Calls: (1) vm.prank(deployer); token.approve(alice, type(uint256).max); (2) vm.prank(deployer); token.increaseAllowance(alice, 1). Expected per README.md:25: revert with one of the contract's custom errors. Actual: revert data is abi.encodeWithSignature(\"Panic(uint256)\", 0x11). Verified with a Foundry test (test/scratch/Judge.t.sol::test_increaseAllowanceOverflowIsPanic) using vm.expectRevert(abi.encodeWithSignature(\"Panic(uint256)\", 0x11)), which passes against the current code; allowance(deployer, alice) remains type(uint256).max afterwards.","severity":"info","snippet":"        _approve(msg.sender, spender, allowance[msg.sender][spender] + addedValue);","title":"increaseAllowance overflow reverts with Panic(0x11) instead of a typed error, contradicting README"}],"hash":"3ec734463ed07bcc13ac643164edebca4a4d2f192a965e69577a1897035e3121","nodeId":"6a6480d7-2b96-4f1d-aecf-970a74e666f1","outcome":"completed","summary":"Review complete. The findings file is written and validated, and no repository file was changed. Only the ignored test/scratch/ directory and the findings file were created.\n\n**Outcome:** one finding kept, at info severity. The token is otherwise sound.\n\n- **Kept (info):** the audit_math finding that increaseAllowance overflow reverts with the compiler's Panic code rather than a typed error, which contradicts the README's promise that all failures use a typed error. I reproduced it with a scratch Foundry test: approve the maximum allowance, then increase by one, and the revert data is Panic 0x11 with the allowance unchanged. No funds are at risk, so it stays at info.\n- **Dropped or merged:** nothing. The other three specialists and the tester reported no findings, so there were no duplicates to merge.\n\n**My own pass found nothing further.** I traced all six entry points plus the constructor and the launch invariants. Self-transfer, transferFrom from the zero address, burn underflow, the exact-maximum allowance boundary, ether rejection and creation code size all behave as documented. The manifest's empty constructor arguments and supply match the code. The project's own suite passes with 79 tests and 7 invariants, and the reachable-opcode test confirms no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n\n**Coverage:** all six listed entry points answered, five hold and one carries the info finding, plus two invariant rows.","treeHash":null,"usage":{"cachedInputTokens":277433,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":6770,"runtime":"claude","turns":14,"wallClockMs":107938}},{"artifacts":[],"attempt":1,"bundleHash":"53c16266c3edf1534bae91b9f297ab306af53168553ffbc74ba6af5ee4d19343","device":"99e4819277ea59fc","findings":[],"hash":"6e9b886094ed67275a1cac4e237ac23c711258cabaf8af70711f85142eb84fa4","nodeId":"67d18c5f-0cec-4662-8ac8-b29743c7e496","outcome":"completed","summary":"I added two test files under `test/`. With the verifier's fuzz seed, `forge build` and `forge test` both pass: 71 tests, 0 failing. I found nothing wrong in `src/PleaToken.sol`, so I didn't write `.imd-findings.json`.\n\n**`test/PleaToken.invariant.t.sol`** covers the \"holds value\" requirement. A handler drives the token with random call sequences from five accounts, set to 256 runs of 100 calls each (about 25,600 calls per campaign). It calls transfer, approve, increase/decrease allowance, transferFrom and burn with bounded inputs, sometimes using an unlimited allowance. It also tries five calls that should fail: transferring more than the balance, spending more than the allowance, burning more than the balance, lowering an allowance below zero, and sending to the zero address. The handler keeps its own record of what every balance and allowance should be, and these must hold after every call:\n- Total supply equals the initial supply minus everything burned, and never goes up.\n- The five accounts' balances add up to the total supply; the token contract and the zero address hold nothing.\n- Every balance and every allowance matches the handler's record. An unlimited allowance is never reduced.\n- None of the calls that should fail ever succeeds.\n- Name, symbol and decimals never change.\n\nA short unit test confirms the handler really moves tokens, so the invariants can't pass just because nothing happened.\n\n**`test/PleaToken.edge.t.sol`** adds 31 edge-case and failure-path tests beyond the existing suite:\n- **Self-dealing:** you need an allowance to `transferFrom` your own balance, and a `transferFrom` back to the same account uses up allowance without changing the balance.\n- **Which check comes first:** a failed `transferFrom` leaves the allowance unspent, and when both the allowance and the balance are short, the allowance error is reported first.\n- **Unlimited allowance:** spending it logs only a Transfer, with no Approval event. One below the maximum behaves as a normal limited allowance. An unlimited allowance still can't move more than the owner holds.\n- **Rejected inputs:** allowance changes for the zero address revert. Raising an allowance past the maximum fails with an overflow error.\n- **Supply edges:** burning the whole supply works. Burns can't reach other people's balances. Nothing can be pulled out of the zero address. Ether is refused.\n- **Launch flow:** deploying the token and moving the 10% swarm share, the pool seed and the remainder in one transaction delivers exact amounts.\n- **Fuzz tests:** 1,000 runs each.\n\nOne harmless quirk, not reported as a defect: `transferFrom(address(0), x, 0)` succeeds and logs a zero-value Transfer from the zero address. Indexers usually read that as a mint, but it can never move any value.\n\nI didn't touch `src/` or any config files. The new files aren't committed yet.","treeHash":"b58cd7bc7cc5700684948ea53829beee375206e6","usage":{"cachedInputTokens":705086,"inputTokens":25,"model":"claude-opus-5-5","outputTokens":20191,"runtime":"claude","turns":17,"wallClockMs":265912}},{"artifacts":[],"attempt":1,"bundleHash":"f1e2de84a1d67780ed29e918598b4168f8a7f65cc4dd198a351003defc73cdc4","device":"cc309a7afc70b0b1","findings":[],"hash":"a1075d5e693daa7d44691ed5aab54af4e648490fbeb8001b8e151daee90274d6","nodeId":"e96414eb-0d92-4056-a382-08473de23dad","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/690a359e-03e5-426b-ac92-5aa60bfc96f6/e96414eb-0d92-4056-a382-08473de23dad/launch.json) matching `PleaToken`, its supply and constructor, and the exact pool/economics settings.\n\nManifest checks and `forge build` passed. All 38 tests passed with the required fuzz seed. Only `launch.json` is included for submission.","treeHash":"d3789ddb0151c7225b90592a1f9d9828efb554b0","usage":{"cachedInputTokens":130560,"inputTokens":31913,"model":"gpt-6-astra","outputTokens":2223,"runtime":"codex","turns":3,"wallClockMs":57752}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30bcdea6dcb9ee40","findings":[{"citation":"resolved","description":"Boundary x precision seam. The addition at src/PleaToken.sol:113 is checked arithmetic, so when the existing allowance plus addedValue exceeds type(uint256).max the call reverts with the compiler's Panic(uint256) code 0x11 rather than one of the contract's declared custom errors. README.md:25 states 'All failures revert with a typed error; nothing returns false', and every other failure path (InsufficientBalance, InsufficientAllowance, TransferToZeroAddress, ApproveToZeroAddress) honours that. Integrators that decode revert data against the ABI's error list will see an unrecognised Panic on this one edge. No funds are at risk: the revert is correct and the allowance is unchanged; only the documented error contract is violated. The project's own test (test/PleaToken.t.sol:186-192) uses a bare vm.expectRevert() for this case, which hides the mismatch. Minimal fix: either document the Panic on overflow, or add a typed error (e.g. AllowanceOverflow(owner, spender, current, addedValue)) guarded by `if (current > type(uint256).max - addedValue) revert ...` before the addition. Adjacent boundary checked and found intended: approve(spender, max-1) then increaseAllowance(spender, 1) reaches exactly type(uint256).max and the allowance becomes the documented unlimited sentinel that transferFrom never decreases.","line":113,"path":"src/PleaToken.sol","reproduction":"State: fresh PleaToken deployed by `deployer`. Calls: (1) vm.prank(deployer); token.approve(alice, type(uint256).max); (2) vm.prank(deployer); token.increaseAllowance(alice, 1). Expected per README.md:25: revert with a typed custom error. Actual: revert data is abi.encodeWithSignature(\"Panic(uint256)\", 0x11) (arithmetic overflow). Verified with a Foundry test using vm.expectRevert(abi.encodeWithSignature(\"Panic(uint256)\", 0x11)) which passes against the current code.","severity":"info","snippet":"        _approve(msg.sender, spender, allowance[msg.sender][spender] + addedValue);","title":"increaseAllowance overflow reverts with Panic(0x11), contradicting the documented 'all failures revert with a typed error' guarantee"}],"hash":"a8ef2ce1f4693b67ba4f31054019995802a6f40ff7d7529fa5729308b6b447f0","nodeId":"ed62cb6e-e034-4c30-a412-1777234b7b4b","outcome":"completed","summary":"The findings file is valid, the quoted snippet matches line 113 exactly, and the working tree is clean apart from the gitignored findings file and scratch test.\n\n**Result: no math defect that moves or loses value. One info-level inconsistency recorded.**\n\nThe token at `src/PleaToken.sol` is a minimal fixed-supply ERC-20 with no division, multiplication, scaling, downcast or external call. Its entire arithmetic surface is four guarded subtractions in unchecked blocks, one checked addition, and the unchecked credit in the transfer path. I traced each against the Math Precision, Boundary and Numerical Gap guides.\n\n**What I verified**\n\n- **Conservation invariant.** The sum of all balances equals totalSupply after every writer, so the unchecked `balanceOf[to] += amount` and `totalSupply -= amount` cannot wrap. A 256-run Foundry invariant test with four actors driving random transfer, transferFrom, burn and infinite-approve calls never broke it.\n- **Boundaries.** Zero amounts, whole-supply transfers and burns, self-transfer, self-transferFrom, a transfer of type(uint256).max, and burning everything then one more all behave as specified with typed reverts.\n- **The max-allowance sentinel.** Reaching it via approve(max-1) then increaseAllowance(1) makes the allowance unlimited as documented. Decreasing from it by one makes it finite again and transferFrom decrements normally.\n- **Static-analysis lead.** The aderyn large-literal note on the supply constant is style only. The constant equals 1e27 exactly and matches the manifest supply.\n- **Existing checks.** The project's 38 tests pass and `forge fmt --check` is clean.\n\n**The one finding (info)**\n\nThe README states every failure reverts with a typed error. The overflow path in `increaseAllowance` instead reverts with the compiler's Panic code 0x11. Reproduction: approve a spender for type(uint256).max, then call increaseAllowance for that spender with 1. The allowance is unchanged and no funds are at risk, so this is a documentation or error-contract mismatch, not a loss.\n\n**Coverage**\n\nAll six verifier entry points have rows: five hold, and `increaseAllowance` points at the finding. Five extra rows record the conservation invariant, the supply constant, and each of the three guides. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":537359,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12135,"runtime":"claude","turns":19,"wallClockMs":202976}},{"artifacts":[],"attempt":1,"bundleHash":"4eafa4760dcae9c3dc25331af1974d0ad6be58a80ca45367b79d42dccf9963e2","device":"4dd67dae195771b6","findings":[],"hash":"d9bb657d812aaf996ba1982eafe8bbd8249645ef1c17e9ee78824fc7b16822b2","nodeId":"e7353e34-3d4e-4fb9-820d-42d473629f3d","outcome":"completed","summary":"The pleaimd (PLEA) token is built, tested, documented and committed as commit `6b94ff6` on `main`.\n\n**What was delivered**\n\n- `src/PleaToken.sol`: a self-contained ERC-20 named `PleaToken` whose `name()` is \"pleaimd\" and `symbol()` is \"PLEA\", 18 decimals. The constructor takes no arguments and mints the full 1,000,000,000 PLEA once to `msg.sender`, which is the factory at launch. There is no owner, mint, pause, blacklist, freeze, upgrade path, receive or fallback. Holders may burn only their own tokens, so the supply can shrink but never grow. Transfers carry no fee, so the swarm share, pool seed and swaps move exactly what they say.\n- `test/PleaToken.t.sol`: 38 tests covering metadata, supply minted to the deploying contract rather than tx.origin, transfer and transferFrom success paths, typed-error reverts for insufficient balance, insufficient allowance and zero-address targets, infinite allowance, burn, rejection of every privileged selector the launch floor probes, rejection of ether, and an opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT. Five fuzz tests check supply conservation and allowance accounting.\n- `foundry.toml`: solc pinned to 0.8.26, `bytecode_hash = \"none\"`, cbor metadata off, ffi off, no fs permissions, and the verifier's fuzz seed pinned.\n- `lib/forge-std` (v1.9.7) vendored as ordinary files with its `.git` removed, plus `remappings.txt`.\n- `README.md`: behaviour, assumptions, the manifest values for deployment, operational responsibilities and security notes.\n\n**Verification**\n\n| Check | Result |\n|-------|--------|\n| `forge build` (clean, empty env) | success, no warnings |\n| `forge test` with the verifier's fuzz seed | 38 passed, 0 failed |\n| `forge fmt --check` | clean |\n\nSlither was not available on this machine and did not run. The code avoids its six rejecting patterns by construction: no selfdestruct, no delegatecall, no library calls, no upgrade or initializer, no shifts and no `abi.encodePacked`.\n\n**Open items for the launch** are only the ones the manifest step owns: `token.contract` is `PleaToken`, `constructorArgs` is empty, and `totalSupply` is `1000000000000000000000000000`. There is nothing to configure after launch, since the contract has no settable state.","treeHash":"88a0b9c17ecb61e064c62e353e938c50ed3d70f1","usage":{"cachedInputTokens":364543,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":19294,"runtime":"claude","turns":18,"wallClockMs":223805}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76f57db4177175be","findings":[],"hash":"fcc71c64924202669962bdda933eed33d792a14e6cf60fe8140d26e98d88e573","nodeId":"c778399e-c9b3-4179-bf4e-62308ff6506e","outcome":"completed","summary":"The review of the PLEA token's economics is complete. The findings file holds an empty list and ten coverage rows, and the tree is otherwise unchanged apart from that file.\n\n**Result: no substantiated defect** in the Economic Security, Invariant or Flow Gap areas. The contract at `src/PleaToken.sol` is a self-contained fixed-supply ERC-20 with no external calls, no fee or rate parameters, no owner, and no mint path.\n\nWhat I checked and how:\n\n- **Economic Security.** No oracle, token or cross-contract dependency exists to break. The token delivers exactly the amount sent for every caller, so no flow uses an assumed amount that differs from the received one. Sentinel branches (zero `to`, zero `spender`) revert rather than silently succeed. The EIP-20 approve race is documented in the code and is self-harm only, so it is not reported.\n- **Invariant.** A 256-run handler invariant over all six entry points with seven actors (factory, distributor, pool manager, remainder, two traders, the token itself) held three properties: sum of balances equals totalSupply, totalSupply equals the initial supply minus burns, and on-chain allowances match a model. The unchecked arithmetic in `burn` and `_transfer` is guarded by the preceding balance checks and the conservation law.\n- **Flow Gap.** A scratch probe reproduced the launch legs (10% to distributor, claim, 70% seed through a sync/settle balance delta, 20% remainder, then a buy via v4's assembly return-value check and a sell back). Every leg arrived whole and supply stayed at 1e27.\n- **Existing suite.** All 38 project tests pass under the pinned fuzz seed.\n\nCoverage rows mark all six entry points as `holds`, plus rows for the two invariants, the launch flows, and the dependency surface. The static-analysis lead (large numeric literal at line 27) is a style note: the constant evaluates to exactly the manifest supply.\n\nNot reached: the protected Uniswap v4 floor test itself, since v4-core is not vendored here. My probe mimics its transfer and settle checks but is not the real PoolManager. No launch.json exists in the tree yet, so there was no manifest to check.","treeHash":null,"usage":{"cachedInputTokens":709976,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15946,"runtime":"claude","turns":23,"wallClockMs":327066}}],"verification":[{"checks":[{"durationMs":1831,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.74s\nCompiler run successful!\n","passed":true},{"durationMs":10649,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/PleaToken.edge.t.sol:PleaTokenEdgeTest\n[PASS] testFuzz_decreaseAllowance(uint256,uint256) (runs: 1000, μ: 93995, ~: 93224)\n[PASS] testFuzz_increaseAllowanceOverflowReverts(uint256,uint256) (runs: 1000, μ: 100066, ~: 100071)\nLogs:\n  Bound result 9388518201221695724867\n  Bound result 115792089237316195423570985008687907853269984665640564034942172985495976055900\n\n[PASS] testFuzz_strangerCannotMoveHolderFunds(address,uint256) (runs: 1000, μ: 52054, ~: 51862)\nLogs:\n  Bound result 3545\n\n[PASS] testFuzz_transferBetweenArbitraryHoldersConserves(address,address,uint256,uint256) (runs: 1000, μ: 167888, ~: 173096)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 100\n  Bound result 79\n\n[PASS] testFuzz_unlimitedAllowanceNeverDecreases(uint256,uint256) (runs: 1000, μ: 180667, ~: 181550)\nLogs:\n  Bound result 17\n  Bound result 127\n\n[PASS] test_RevertWhen_burnExceedsBalanceByOneWei() (gas: 51409)\n[PASS] test_RevertWhen_calledWithUnknownSelectorAndEther() (gas: 39777)\n[PASS] test_RevertWhen_decreaseAllowanceForZeroAddress() (gas: 34803)\n[PASS] test_RevertWhen_etherSentWithTransfer() (gas: 48213)\n[PASS] test_RevertWhen_increaseAllowanceForZeroAddress() (gas: 34802)\n[PASS] test_RevertWhen_pullingFromZeroAddress() (gas: 53448)\n[PASS] test_RevertWhen_spendingAnotherSpendersAllowance() (gas: 88110)\n[PASS] test_RevertWhen_transferFromLacksBothAllowanceAndBalance() (gas: 40619)\n[PASS] test_RevertWhen_transferFromSelfWithoutAllowance() (gas: 38513)\n[PASS] test_RevertWhen_transferToSelfExceedsBalance() (gas: 35870)\n[PASS] test_RevertWhen_transferToZeroEvenWithZeroAmount() (gas: 32557)\n[PASS] test_RevertWhen_unlimitedAllowanceExceedsBalance() (gas: 88611)\n[PASS] test_allowanceMaxMinusOneIsFinite() (gas: 126089)\n[PASS] test_approveAfterPartialSpendReplaces() (gas: 191840)\n[PASS] test_burnOnlyTouchesCallersBalance() (gas: 90635)\n[PASS] test_burnWholeSupply() (gas: 123188)\n[PASS] test_burnZero() (gas: 46282)\n[PASS] test_decreaseAllowanceToExactlyZero() (gas: 93438)\n[PASS] test_failedTransferFromLeavesAllowanceAndBalances() (gas: 125777)\n[PASS] test_failedTransferFromToZeroLeavesAllowance() (gas: 109959)\n[PASS] test_launchFlowsAreExact() (gas: 560343)\n[PASS] test_standardSelectors() (gas: 5446)\n[PASS] test_transferFromSelfWithSelfAllowance() (gas: 138450)\n[PASS] test_transferFromToSameAccountSpendsAllowanceKeepsBalance() (gas: 126205)\n[PASS] test_transferFromZeroAmountWithoutAllowance() (gas: 65717)\n[PASS] test_unlimitedAllowanceSpendEmitsOnlyTransfer() (gas: 119763)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 40.03ms (189.77ms CPU time)\n\nRan 38 tests for test/PleaToken.t.sol:PleaTokenTest\n[PASS] testFuzz_approveThenRead(address,uint256) (runs: 256, μ: 63575, ~: 63900)\n[PASS] testFuzz_burnOnlyShrinksSupply(uint256,uint256) (runs: 256, μ: 151190, ~: 151967)\nLogs:\n  Bound result 555331517156853181609751940\n  Bound result 4862\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97579, ~: 97710)\nLogs:\n  Bound result 2835717307\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 140294, ~: 170501)\nLogs:\n  Bound result 993628893877528486849555332510785747059138238789\n  Bound result 4862\n\n[PASS] testFuzz_transferRevertsAboveBalance(uint256) (runs: 256, μ: 41863, ~: 42192)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913130654651\n\n[PASS] test_RevertWhen_approveZeroAddress() (gas: 32527)\n[PASS] test_RevertWhen_burnExceedsBalance() (gas: 34896)\n[PASS] test_RevertWhen_decreaseAllowanceBelowZero() (gas: 86038)\n[PASS] test_RevertWhen_deployerPullsFromHolderWithoutAllowance() (gas: 98262)\n[PASS] test_RevertWhen_increaseAllowanceOverflows() (gas: 85581)\n[PASS] test_RevertWhen_sendingEther() (gas: 39087)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 92416)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 37680)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 88039)\n[PASS] test_RevertWhen_transferFromExceedsBalanceEvenWithAllowance() (gas: 149573)\n[PASS] test_RevertWhen_transferFromToZeroAddress() (gas: 85249)\n[PASS] test_RevertWhen_transferFromWithoutAllowance() (gas: 40664)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 32549)\n[PASS] test_approveOverwrites() (gas: 95196)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68037)\n[PASS] test_burnReducesSupplyAndBalance() (gas: 117248)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8150)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33910)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 141813)\n[PASS] test_metadata() (gas: 26726)\n[PASS] test_noConstructorArguments() (gas: 3704)\n[PASS] test_noPrivilegedSelectorsExist() (gas: 885920)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2640374)\n[PASS] test_supplyGoesToTheDeployingContractNotTxOrigin() (gas: 238249)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 34968)\n[PASS] test_transfer() (gas: 95904)\n[PASS] test_transferFromExactAllowance() (gas: 135735)\n[PASS] test_transferFromSpendsAllowance() (gas: 173201)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 136029)\n[PASS] test_transferHasNoFee() (gas: 142652)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43674)\n[PASS] test_transferWholeBalance() (gas: 78245)\n[PASS] test_transferZeroAmount() (gas: 47572)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 40.05ms (167.51ms CPU time)\n\nRan 2 tests for test/PleaToken.invariant.t.sol:PleaTokenInvariantTest\n[PASS]\nPleaTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_failurePathsAlwaysRevert\n[PASS] invariant_metadataConstant\n[PASS] invariant_supplyIsInitialLessBurned\n[PASS] invariant_supplyNeverIncreases\n PleaTokenInvariantTest invariants (runs: 256, calls: 25600, reverts: 0)\n\n╭------------------+-----------------------------+-------+---------+----------╮\n| Contract         | Selector                    | Calls | Reverts | Discards |\n+=============================================================================+\n| PleaTokenHandler | approve                     | 2319  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | burn                        | 2307  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | burnTooMuch                 | 2405  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | decreaseAllowance           | 2373  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | decreaseAllowanceBelowZero  | 2310  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | increaseAllowance           | 2314  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | transfer                    | 2308  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | transferFrom                | 2364  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | transferFromBeyondAllowance | 2311  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | transferToZero              | 2359  | 0       | 0        |\n|------------------+-----------------------------+-------+---------+----------|\n| PleaTokenHandler | transferTooMuch             | 2230  | 0       | 0        |\n╰------------------+-----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 883\n  Bound result 0\n  Bound result 10387\n  Bound result 242\n  Bound result 40\n  Bound result 404098525\n  Bound result 0\n  Bound result 2054630533300290462052022734601\n  Bound result 323\n  Bound result 400000000000000000000\n  Bound result 5401\n  Bound result 95\n  Bound result 0\n  Bound result 18446744073709551615\n  Bound result 89622809563556123081897041840816014639138942293158154584485133346364573191188\n  Bound result 307\n  Bound result 0\n  Bound result 6302\n  Bound result 0\n  Bound result 100000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 6845\n  Bound result 2792\n  Bound result 5270\n  Bound result 1458\n  Bound result 491\n  Bound result 351\n  Bound result 4000000000000000000\n  Bound result 9724\n  Bound result 0\n  Bound result 8607\n  Bound result 340282366920938463463374607431768211455\n  Bound result 22392763729629034350544211489782813337929543\n  Bound result 13421694836482022721020536788555327\n  Bound result 517\n  Bound result 1000000000000000000001\n  Bound result 1268\n  Bound result 340282366920938463463374607431768211455\n  Bound result 965\n  Bound result 8760496675504136135\n  Bound result 3\n  Bound result 1761658991447796679559134324\n  Bound result 3415\n  Bound result 8\n  Bound result 5915\n  Bound result 4465\n  Bound result 509\n  Bound result 601\n  Bound result 809\n  Bound result 152\n  Bound result 49\n  Bound result 6000000000000000000\n  Bound result 242\n  Bound result 57\n  Bound result 0\n  Bound result 1000000000000000000000\n  Bound result 300000000000000000000\n  Bound result 5\n  Bound result 242\n  Bound result 7369\n  Bound result 254\n  Bound result 127\n  Bound result 2000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639896\n  Bound result 790\n  Bound result 27\n  Bound result 0\n  Bound result 545498136710469622931016000\n  Bound result 1104\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 17\n  Bound result 15\n  Bound result 0\n  Bound result 3\n  Bound result 1\n  Bound result 8158\n  Bound result 5000000000000000000000\n  Bound result 0\n  Bound result 34144288215\n  Bound result 5\n  Bound result 34896371739021245815973937\n  Bound result 3\n  Bound result 9833\n  Bound result 0\n  Bound result 9452\n  Bound result 5\n  Bound result 5\n  Bound result 11\n  Bound result 852\n  Bound result 5999\n  Bound result 517\n  Bound result 3814\n\n[PASS] test_handlerSmoke() (gas: 1088530)\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 1\n  Bound result 500000000000000000000\n  Bound result 400000000000000000000\n  Bound result 1\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.53s (10.53s CPU time)\n\nRan 3 test suites in 10.53s (10.61s CPU time): 71 tests passed, 0 failed, 0 skipped (71 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PleaToken.approve(address,uint256)\",\"PleaToken.burn(uint256)\",\"PleaToken.decreaseAllowance(address,uint256)\",\"PleaToken.increaseAllowance(address,uint256)\",\"PleaToken.transfer(address,uint256)\",\"PleaToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":96,\"foundry.toml\":24,\"remappings.txt\":1,\"src/PleaToken.sol\":175,\"test/PleaToken.edge.t.sol\":389,\"test/PleaToken.invariant.t.sol\":319,\"test/PleaToken.t.sol\":430},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6e9b886094ed67275a1cac4e237ac23c711258cabaf8af70711f85142eb84fa4","verifiedTreeHash":"b58cd7bc7cc5700684948ea53829beee375206e6","verifierVersion":"0.1.0+d372f99e"},{"checks":[{"durationMs":861,"exitCode":0,"name":"build","output":"Compiling 21 files with Solc 0.8.26\nSolc 0.8.26 finished in 789.15ms\nCompiler run successful!\n","passed":true},{"durationMs":97,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/PleaToken.t.sol:PleaTokenTest\n[PASS] testFuzz_approveThenRead(address,uint256) (runs: 256, μ: 63652, ~: 63900)\n[PASS] testFuzz_burnOnlyShrinksSupply(uint256,uint256) (runs: 256, μ: 151015, ~: 151949)\nLogs:\n  Bound result 832555741706060328261164981\n  Bound result 121012498758422750387092687\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97681, ~: 97710)\nLogs:\n  Bound result 914221597463924790449487\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 139563, ~: 170501)\nLogs:\n  Bound result 993628893877528486849555332510785747059138238789\n  Bound result 4862\n\n[PASS] testFuzz_transferRevertsAboveBalance(uint256) (runs: 256, μ: 41862, ~: 42192)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457592075853238546178\n\n[PASS] test_RevertWhen_approveZeroAddress() (gas: 32527)\n[PASS] test_RevertWhen_burnExceedsBalance() (gas: 34896)\n[PASS] test_RevertWhen_decreaseAllowanceBelowZero() (gas: 86038)\n[PASS] test_RevertWhen_deployerPullsFromHolderWithoutAllowance() (gas: 98262)\n[PASS] test_RevertWhen_increaseAllowanceOverflows() (gas: 85581)\n[PASS] test_RevertWhen_sendingEther() (gas: 39087)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 92416)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 37680)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 88039)\n[PASS] test_RevertWhen_transferFromExceedsBalanceEvenWithAllowance() (gas: 149573)\n[PASS] test_RevertWhen_transferFromToZeroAddress() (gas: 85249)\n[PASS] test_RevertWhen_transferFromWithoutAllowance() (gas: 40664)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 32549)\n[PASS] test_approveOverwrites() (gas: 95196)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68037)\n[PASS] test_burnReducesSupplyAndBalance() (gas: 117248)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8150)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33910)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 141813)\n[PASS] test_metadata() (gas: 26726)\n[PASS] test_noConstructorArguments() (gas: 3704)\n[PASS] test_noPrivilegedSelectorsExist() (gas: 885920)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2640374)\n[PASS] test_supplyGoesToTheDeployingContractNotTxOrigin() (gas: 238249)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 34968)\n[PASS] test_transfer() (gas: 95904)\n[PASS] test_transferFromExactAllowance() (gas: 135735)\n[PASS] test_transferFromSpendsAllowance() (gas: 173201)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 136029)\n[PASS] test_transferHasNoFee() (gas: 142652)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43674)\n[PASS] test_transferWholeBalance() (gas: 78245)\n[PASS] test_transferZeroAmount() (gas: 47572)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 10.97ms (50.53ms CPU time)\n\nRan 1 test suite in 11.59ms (10.97ms CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PleaToken.approve(address,uint256)\",\"PleaToken.burn(uint256)\",\"PleaToken.decreaseAllowance(address,uint256)\",\"PleaToken.increaseAllowance(address,uint256)\",\"PleaToken.transfer(address,uint256)\",\"PleaToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":96,\"foundry.toml\":24,\"launch.json\":24,\"remappings.txt\":1,\"src/PleaToken.sol\":175,\"test/PleaToken.t.sol\":430},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a1075d5e693daa7d44691ed5aab54af4e648490fbeb8001b8e151daee90274d6","verifiedTreeHash":"d3789ddb0151c7225b90592a1f9d9828efb554b0","verifierVersion":"0.1.0+d372f99e"},{"checks":[{"durationMs":964,"exitCode":0,"name":"build","output":"Compiling 21 files with Solc 0.8.26\nSolc 0.8.26 finished in 874.18ms\nCompiler run successful!\n","passed":true},{"durationMs":111,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/PleaToken.t.sol:PleaTokenTest\n[PASS] testFuzz_approveThenRead(address,uint256) (runs: 256, μ: 63652, ~: 63900)\n[PASS] testFuzz_burnOnlyShrinksSupply(uint256,uint256) (runs: 256, μ: 151015, ~: 151949)\nLogs:\n  Bound result 832555741706060328261164981\n  Bound result 121012498758422750387092687\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97681, ~: 97710)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 139563, ~: 170501)\nLogs:\n  Bound result 312216854704488166495052301761\n  Bound result 23143003191605237194224157\n\n[PASS] testFuzz_transferRevertsAboveBalance(uint256) (runs: 256, μ: 41862, ~: 42192)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640943\n\n[PASS] test_RevertWhen_approveZeroAddress() (gas: 32527)\n[PASS] test_RevertWhen_burnExceedsBalance() (gas: 34896)\n[PASS] test_RevertWhen_decreaseAllowanceBelowZero() (gas: 86038)\n[PASS] test_RevertWhen_deployerPullsFromHolderWithoutAllowance() (gas: 98262)\n[PASS] test_RevertWhen_increaseAllowanceOverflows() (gas: 85581)\n[PASS] test_RevertWhen_sendingEther() (gas: 39087)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 92416)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 37680)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 88039)\n[PASS] test_RevertWhen_transferFromExceedsBalanceEvenWithAllowance() (gas: 149573)\n[PASS] test_RevertWhen_transferFromToZeroAddress() (gas: 85249)\n[PASS] test_RevertWhen_transferFromWithoutAllowance() (gas: 40664)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 32549)\n[PASS] test_approveOverwrites() (gas: 95196)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68037)\n[PASS] test_burnReducesSupplyAndBalance() (gas: 117248)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8150)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33910)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 141813)\n[PASS] test_metadata() (gas: 26726)\n[PASS] test_noConstructorArguments() (gas: 3704)\n[PASS] test_noPrivilegedSelectorsExist() (gas: 885920)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2640374)\n[PASS] test_supplyGoesToTheDeployingContractNotTxOrigin() (gas: 238249)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 34968)\n[PASS] test_transfer() (gas: 95904)\n[PASS] test_transferFromExactAllowance() (gas: 135735)\n[PASS] test_transferFromSpendsAllowance() (gas: 173201)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 136029)\n[PASS] test_transferHasNoFee() (gas: 142652)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43674)\n[PASS] test_transferWholeBalance() (gas: 78245)\n[PASS] test_transferZeroAmount() (gas: 47572)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 11.16ms (54.49ms CPU time)\n\nRan 1 test suite in 12.06ms (11.16ms CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PleaToken.approve(address,uint256)\",\"PleaToken.burn(uint256)\",\"PleaToken.decreaseAllowance(address,uint256)\",\"PleaToken.increaseAllowance(address,uint256)\",\"PleaToken.transfer(address,uint256)\",\"PleaToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":96,\"foundry.toml\":24,\"remappings.txt\":1,\"src/PleaToken.sol\":175,\"test/PleaToken.t.sol\":430},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":516,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":263,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PleaToken.sol:27: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d9bb657d812aaf996ba1982eafe8bbd8249645ef1c17e9ee78824fc7b16822b2","verifiedTreeHash":"88a0b9c17ecb61e064c62e353e938c50ed3d70f1","verifierVersion":"0.1.0+d372f99e"}]}