{"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":"b6f1132a-4f80-44ca-b87f-e59cf6d5f051","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"fbaf099971398972e6e902f7a4c334a232ea55f4244bdc633c5e4f4f31da79b7","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":"09979a26a3330ef219878d51c1f946609994a38851eebfdd5e237466a5de9d28","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":"c4c7c30807378ad2e1bc35687d9c7e56f19eef3a1a87e9d9079a282ce2b193da","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":"b7265d801c8432e33c331e9d0a2b35636b23d1d1b7bad07d7f170081df0b7ac0","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":"a67c849b3a5c8ba4cbe25c07490c2c5ee029434c83d1f2c4c65439937fd40154","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":"371a98773d1a0daa607478a13d9c1d7244dcd0570f79470216346d831a392b42","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"2b6051d9eca6066592926dc193ab77a6eca1da1d87fa19badc9e975b17f57c29","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"755b3765e5000d4f7dcf92912669ea8ed7e1a4eae19e499d205201feb7890568","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: Paperclash (PAPER).\nToken name: Paperclash\nToken symbol: PAPER\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: X：x.com/paperclash_xyz","parentJobId":null,"planHash":"a09a65f06c484766f1b429ae14e286f4352a79398e5ccaa924722c95f8026069","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"b6f1132a-4f80-44ca-b87f-e59cf6d5f051","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2614-paperclash"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52552","feedbackHash":"1d62c5669273581df5c60bc0aebdfc92a554410d0ce520b08e05ecc92b2df376","nodeKey":"audit_economics","submissionHash":"fbaf099971398972e6e902f7a4c334a232ea55f4244bdc633c5e4f4f31da79b7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53932","feedbackHash":"b6fa922998422cdf1c454750341e9dc2696a9de4080b7ab279bbb64a460f0b95","nodeKey":"audit_flow","submissionHash":"09979a26a3330ef219878d51c1f946609994a38851eebfdd5e237466a5de9d28","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51040","feedbackHash":"24a44ef19b24427a6ca14ef0f055149b294bd101d346ea4578c55a0a37dec54d","nodeKey":"audit_judge","submissionHash":"c4c7c30807378ad2e1bc35687d9c7e56f19eef3a1a87e9d9079a282ce2b193da","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52265","feedbackHash":"a25cfa87f741d2e9e7493293847fd53964c3ea4931452ff23d9c5b6b357347e7","nodeKey":"audit_math","submissionHash":"b7265d801c8432e33c331e9d0a2b35636b23d1d1b7bad07d7f170081df0b7ac0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51473","feedbackHash":"284f43613e9b0a6d88d783d024d17b06dd4f4283cbbfc222a55502db16b0ecea","nodeKey":"audit_permissions","submissionHash":"a67c849b3a5c8ba4cbe25c07490c2c5ee029434c83d1f2c4c65439937fd40154","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52138","feedbackHash":"a7eb11f5bb375ac40d407decd96a3c1c918a76114e26bc0d185321c5d1c5e0fb","nodeKey":"build_contract_project","submissionHash":"371a98773d1a0daa607478a13d9c1d7244dcd0570f79470216346d831a392b42","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52180","feedbackHash":"c8a4392f2e2c2e246b4a3ca7a30b83151059baf42f9ab9151ac13b5e87a5045c","nodeKey":"manifest","submissionHash":"2b6051d9eca6066592926dc193ab77a6eca1da1d87fa19badc9e975b17f57c29","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52419","feedbackHash":"e6040b0d1f959f91c8edd3d8301f9916833f0750cb0949161f140c439cdd23f3","nodeKey":"write_foundry_tests","submissionHash":"755b3765e5000d4f7dcf92912669ea8ed7e1a4eae19e499d205201feb7890568","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"1383548ec7ab3a5d9828459d20a025532c91364b61a52151f6f72a5f18607c56","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8109087d965ddf6c","findings":[{"citation":"resolved","description":"Area: Execution Trace (operation interleaving across transactions). permit() is callable by anyone holding a valid signature (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol:42-59: deadline check, _useNonce(owner), ECDSA.recover, signer == owner, _approve). Because the nonce is consumed on the first submission, a second submission of the same signature reverts with ERC2612InvalidSigner. The allowance is set exactly once and no value is at risk; the only effect is that a contract which calls permit() and then transferFrom() in one transaction reverts if anyone relays the signature first. This is OpenZeppelin's documented security consideration for ERC20Permit and is inherent to the standard, so it is not a defect in this token. It is recorded so the author can tell frontend/periphery integrators to wrap permit() in try/catch or to check allowance() before calling it. Not a blocker; no fix to the token is proposed.","line":17,"path":"src/PaperclashToken.sol","reproduction":"State: signer S holds a key, has nonce 0. S signs Permit(owner=S, spender=B, value=5, nonce=0, deadline=now+1). Tx1 (from any address A != S): token.permit(S, B, 5, deadline, v, r, s) -> allowance(S,B)=5, nonces(S)=1. Tx2 (from S, or from an integrator contract doing permit then transferFrom): token.permit(S, B, 5, deadline, v, r, s) -> reverts ERC2612InvalidSigner(recovered, S) because the struct hash now uses nonce 1. Expected by a naive integrator: Tx2 succeeds. Actual: Tx2 reverts; allowance stays 5. Verified with a scratch Foundry test (test_permitFrontrunDoesNotChangeOutcome) that passes on this code: allowance(S,B)==5 and nonces(S)==1 after the two calls.","severity":"info","snippet":"contract PaperclashToken is ERC20, ERC20Permit {","title":"ERC-2612 permit can be relayed by a third party before the signer's own call, reverting integrator flows that bundle permit()+transferFrom() (standard ERC20Permit behaviour, not a token defect)"}],"hash":"09979a26a3330ef219878d51c1f946609994a38851eebfdd5e237466a5de9d28","nodeId":"7b9f21dd-b84f-467c-b79f-1c293ad8493e","outcome":"completed","summary":"Review complete. The control-flow audit of the Paperclash token found no defects; the findings file holds one informational note and full coverage.\n\n**What I checked (Execution Trace, Periphery, First Principles)**\n\n- **All four entry points trace clean.** approve, permit, transfer and transferFrom go straight into unmodified OpenZeppelin 5.4.0 code. Every guard is in place: zero-address checks, exact balance and allowance reverts, nonce consumption before signature recovery, high-s and bad-v rejection, deadline handling, and chain-id rebinding of the EIP-712 domain. Verified with 15 scratch tests plus the project's 33 existing tests, all passing.\n- **Periphery is pristine.** The vendored OpenZeppelin tree differs textually from the npm 5.4.0 tarball, but only by forge-fmt reflow. Compiling the token against the pristine upstream library produced byte-identical creation and runtime bytecode.\n- **First principles hold.** The constructor mints exactly 1e27 to msg.sender once, there are no constructor arguments, no owner, no mint or privileged path in the ABI, no receive or fallback, and no transfer hook. Every launch flow is an exact ordinary transfer.\n- **Static-analysis leads** (aderyn large-numeric-literal) confirmed benign: the literal equals 1e27 as the brief requires.\n\n**Recorded**\n\n- One **info** note: a third party can relay a holder's permit signature first, so an integrator that bundles permit and transferFrom in one transaction reverts. This is standard ERC20Permit behaviour, not a token defect, and is recorded for integrator documentation only.\n- Nine coverage rows, all `holds`: the four listed entry points plus the constructor, vendored-library integrity, opcode and fallback surface, launch-flow exactness, and the deploy script.\n\nScratch tests were removed and no repository file was changed. Findings are in `.imd-findings.json` at the repository root.","treeHash":null,"usage":{"cachedInputTokens":549443,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":17740,"runtime":"claude","turns":29,"wallClockMs":257726}},{"artifacts":[],"attempt":1,"bundleHash":"22c90f7087ce295cdd33e5bbb3410dbfd31a9f6da776a7241dd0dccceeee394e","device":"c722c2e9ac9aa084","findings":[],"hash":"2b6051d9eca6066592926dc193ab77a6eca1da1d87fa19badc9e975b17f57c29","nodeId":"10abba33-bb5a-40cc-b059-c2a6c5123277","outcome":"completed","summary":"Done. I wrote launch.json for the Paperclash (PAPER) custom token launch, and it is the only file changed in the working tree.\n\n**What the manifest says**\n\n- Kind is custom_token. The token contract is PaperclashToken, name Paperclash, symbol PAPER, 18 decimals.\n- constructorArgs is empty, matching the accepted constructor, which takes no parameters and mints the whole supply to msg.sender.\n- totalSupply is the 1,000,000,000 tokens in minor units exactly as the constructor mints them.\n- contracts is empty. The accepted tree has no application contracts, only the token.\n- pool and economics are copied verbatim from the launch terms: IMD pair at the given address, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's poolBps, opening cap and remainderTo.\n- notes describe only PaperclashToken and come to well under the 4,000 character limit.\n\n**Verification**\n\n- The manifest parses as JSON with only the schema's top-level keys.\n- The compiled ABI confirms zero constructor parameters, matching the empty constructorArgs.\n- forge build succeeded, and the existing suite of 33 tests passed with the verifier's fuzz seed.\n- A scratch test deploying the token from a stand-in factory confirmed name, symbol, decimals, supply and that the whole balance lands on the deployer.\n- git status shows launch.json as the only new or changed path.","treeHash":"1ac2cba3212b898f0906ebb5dd82e0806382942c","usage":{"cachedInputTokens":134743,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3586,"runtime":"claude","turns":10,"wallClockMs":82344}},{"artifacts":[],"attempt":1,"bundleHash":"1133f7241e56fde74bed749ae11c7f5409e9916eb4b9369dbadb2ce5d678c491","device":"62491201fe455e89","findings":[],"hash":"371a98773d1a0daa607478a13d9c1d7244dcd0570f79470216346d831a392b42","nodeId":"7d197ef6-c74b-484b-bd39-f2151151d239","outcome":"completed","summary":"The Paperclash token project is complete and verified. All three required checks pass: forge build, forge test, and forge fmt --check, with the compiler pinned to 0.8.26 and `bytecode_hash = \"none\"`.\n\n**What was built**\n\n- `src/PaperclashToken.sol` is a fixed-supply ERC-20 named Paperclash with symbol PAPER. The constructor mints 1,000,000,000 tokens at 18 decimals once to the deployer, which is the launch factory. It inherits OpenZeppelin ERC20 and ERC20Permit only. There is no owner, mint, pause, blacklist, tax, burn-from or upgrade path, and the contract takes no constructor arguments.\n- `script/DeployPaperclash.s.sol` separates a plain `deploy()` function from the broadcasting `run()`. It reads no environment variables.\n- `test/PaperclashToken.t.sol` holds 33 tests: metadata and supply, exact transfers, allowance paths, permit success and failure (expired, wrong signer, replay), reverts for insufficient balance, zero receiver and missing allowance, a probe of 24 common admin selectors from both a stranger and the deployer, a bytecode walk for DELEGATECALL, CALLCODE and SELFDESTRUCT, launch-flow tests that the swarm share and the full split arrive whole, and four fuzz tests.\n- `README.md` documents assumptions, the deployment parameters for the manifest step, the no-op \"After launch\" responsibilities and the security posture.\n- `lib/` vendors forge-std v1.11.0 and OpenZeppelin Contracts v5.4.0 as ordinary files, fetched from GitHub release tarballs. No submodules and no git metadata remain.\n\n**Verification**\n\n- Tests ran with an empty environment and the verifier's fuzz seed. All 33 passed, reproduced after a clean rebuild.\n- The protected floor test's requirements are covered: supply minted whole to the deployer, decimals 18, no supply growth, no privileged hand over holder balances, and no forbidden opcodes in reachable runtime.\n\n**Not done and why**\n\n- Slither is not installed on this machine, so it did not run. The code avoids the six blocking detector patterns by construction.\n- No launch.json or .imd-blocked.json was written. The manifest is IMD's step, and nothing in the brief required requester input.\n- Nothing was committed, since the brief did not ask for a commit. The new files are untracked in the working tree, ready for the submission step.","treeHash":"f7c51d63fc65a46a9780b51db327187d4c027b8e","usage":{"cachedInputTokens":684303,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":18926,"runtime":"claude","turns":22,"wallClockMs":347928}},{"artifacts":[],"attempt":1,"bundleHash":"3607191e1262369376e2cca7dff24527d4d9b97d8ce287834dfb73c206e28fa1","device":"7e50667f872c7f5e","findings":[],"hash":"755b3765e5000d4f7dcf92912669ea8ed7e1a4eae19e499d205201feb7890568","nodeId":"27348097-b08a-4640-9e0f-ef0d0d2e52a6","outcome":"completed","summary":"I've added two new test files for Paperclash (PAPER). `forge build` succeeds, and `forge test` passes 65 of 65 tests with the verifier's fuzz seed. I found no defects, so there is no `.imd-findings.json`.\n\nThe token is a plain OpenZeppelin 5.4 ERC-20 with gasless approvals by signature (`permit`). It mints 1,000,000,000 × 10¹⁸ once to the deployer and has no owner, mint, tax or freeze functions. The existing `test/PaperclashToken.t.sol` already covered metadata, the mint, the main transfer and allowance failures, permit basics, the absence of admin functions, and the launch split, so I left it unchanged and built on it.\n\n**`test/PaperclashToken.invariant.t.sol`**: random call sequences over the token.\n- A handler drives `transfer`, `approve`, `transferFrom`, `permit` (with real signatures, sometimes replaying an old nonce) and time jumps. It uses six actors, including the contract that deployed the token and holds the supply.\n- Amounts sometimes go one wei past what is allowed, so calls that should fail are made too. The handler keeps its own record of expected balances, allowances and nonces.\n- After every call these must hold:\n  - the total supply never changes;\n  - the actors' balances add up to the whole supply;\n  - every balance, allowance and nonce matches the handler's record;\n  - no call succeeded that should have failed, or failed that should have succeeded;\n  - nothing ends up on the token contract or the zero address.\n- An end-of-run check fails if no transfer succeeded, so a run that moves nothing can't pass. Settings: 256 runs × 64 calls, set in the file.\n- I also confirmed in a throwaway copy that every run reaches the calls that should fail.\n\n**`test/PaperclashToken.edges.t.sol`**: 31 edge-case unit and fuzz tests.\n- **Amounts:** moving the whole supply in one transfer, then one wei more; the full supply plus one wei; the maximum `uint256`.\n- **Odd senders and recipients:**\n  - transfers to yourself, and pulling from yourself, which still needs an allowance;\n  - the zero address as recipient or as owner;\n  - zero-amount pulls, which need no allowance.\n- **Allowances:** a new approval replaces the old one rather than adding to it; setting zero revokes; spending exactly to zero; allowances are per spender; an unlimited allowance is still capped by the balance.\n- **Permit:**\n  - the signing domain is the standard one, and it changes when the chain ID changes, so a signature from one chain doesn't work on another;\n  - a permit works exactly at its deadline and fails one second after;\n  - it rejects the high-s variant of a valid signature, an invalid `v`, any edited field, a future nonce, and nonces used out of order;\n  - it rejects a zero spender (without using up the nonce) and a forged signature for the zero address;\n  - fuzzed: the value set is exact, and a signature from any other key fails.\n- **Failed calls:** a fuzz test checks that a failed `transferFrom` leaves balances and allowances untouched.\n\nOne test asserts behaviour you might not want: tokens sent to the token contract's own address are accepted and can never be recovered. That is normal for an ERC-20 and not a defect, but the test makes any change to it a deliberate one.\n\n**Not committed:** git has no author identity set on this machine, so the commit failed. The two files are staged in `test/` and nothing outside `test/` was changed.","treeHash":"9c64868a37d0fa8b5839a52277311f74b243f71b","usage":{"cachedInputTokens":730458,"inputTokens":36,"model":"claude-opus-5-5","outputTokens":20969,"runtime":"claude","turns":21,"wallClockMs":339747}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"Access-control / asymmetry note, not a token defect. ERC20Permit.permit (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol:42-60) has no msg.sender check by design: anyone holding a valid (owner, spender, value, deadline, v, r, s) tuple may submit it. The signature is bound to the owner, spender, value, nonce, deadline, this contract and the chain id, so a front-runner cannot change any of those; it can only land the same approval first. The allowance the owner intended is still set and the spender can still spend it, but a contract that calls permit() and then transferFrom() in one transaction without try/catch will revert with ERC2612InvalidSigner because the nonce has already advanced. This is the documented ERC-2612 caveat (OpenZeppelin IERC20Permit 'Security Considerations'); the token's README does not mention it. No change to the token is needed; integrators should wrap permit() in try/catch or check allowance() before calling it, and the README could say so. Verified by a scratch Foundry test (removed) that: mallory submits alice's permit for bob; allowance(alice,bob)==50e18 and nonces(alice)==1; bob's identical permit() reverts; bob's transferFrom still moves 50e18.","line":17,"path":"src/PaperclashToken.sol","reproduction":"State: alice holds 100e18 PAPER, nonces(alice)==0. alice signs Permit(owner=alice, spender=bob, value=50e18, nonce=0, deadline=now+1h) under DOMAIN_SEPARATOR(). Step 1: mallory (any address) calls token.permit(alice, bob, 50e18, deadline, v, r, s) -> succeeds, allowance(alice,bob)=50e18, nonces(alice)=1. Step 2: bob calls token.permit(alice, bob, 50e18, deadline, v, r, s) with the same signature -> reverts ERC2612InvalidSigner(<other address>, alice) because the struct hash now uses nonce 1. Expected by an integrator that bundles permit+transferFrom: the bundle succeeds. Actual: the bundle reverts; bob must resubmit transferFrom alone (which then succeeds, moving 50e18). No funds are lost or misdirected.","severity":"info","snippet":"contract PaperclashToken is ERC20, ERC20Permit {","title":"permit() is submittable by anyone, so a third party can consume the owner's nonce ahead of the intended spender and make the spender's own permit() transaction revert (inherent ERC-2612 behaviour, no "}],"hash":"a67c849b3a5c8ba4cbe25c07490c2c5ee029434c83d1f2c4c65439937fd40154","nodeId":"5b95cf98-617b-4f97-bd02-86d8c5952c7a","outcome":"completed","summary":"The review is complete. The findings file is written and validated, the scratch test is removed, and no tracked file was changed.\n\n**Outcome:** no permission defect in Paperclash. The token is OpenZeppelin v5.4.0 `ERC20` plus `ERC20Permit` with a constructor that mints the fixed supply to the deployer and nothing else. The findings file holds one informational item and nine coverage rows, all four verifier entry points answered.\n\n**What I checked, per guide:**\n- **Access Control.** No role, modifier, initializer, setter, proxy, delegatecall, receive or fallback exists. The compiled selector list is exactly the ERC-20 and ERC-2612 surface plus three constants. The deployer has no bypass: a `transferFrom` from the deployer without allowance reverts. Internal mint, burn and approve paths are unreachable from outside.\n- **Trust Gap.** The only privileged moment is the constructor, which mints to `msg.sender`, matching the brief. The deployer afterwards is an ordinary holder. `permit` is bound to owner, spender, value, nonce, deadline, chain id and contract address, and the library rejects high-s and zero-recovery signatures.\n- **Asymmetry.** `approve` and `permit` both refuse a zero spender and write the same slot with the same semantics. `transfer` and `transferFrom` share one unmodified `_update` path with no tax, hook or exemption, so every launch flow moves exactly what it says.\n\n**Supply chain check.** The vendored OpenZeppelin library is plain files, so I compared every file in the token's compile set against the upstream v5.4.0 tarball. All are byte-identical or differ only by the project formatter's reflow. The `mocks` directory was dropped and nothing was added.\n\n**The one reported item** is informational. Anyone may submit a signed `permit`, so a front-runner can consume the owner's nonce first and make the spender's own bundled `permit` plus `transferFrom` revert. The allowance still lands and nothing is lost. This is standard ERC-2612 behaviour, so the token needs no change, but the README could warn integrators to wrap `permit` in try/catch.\n\n**Static analysis leads.** Slither reported nothing. Aderyn's large-numeric-literal note on the supply constant is a style remark. The constant equals 1e27 and the project tests assert it.\n\n**Not reached.** Nothing in my area was left unverified. Launch-manifest fields, pool economics and the factory's own code are outside this repository and were not reviewed.","treeHash":null,"usage":{"cachedInputTokens":696785,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":17444,"runtime":"claude","turns":29,"wallClockMs":242294}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8db4eebdd7bd2744","findings":[],"hash":"b7265d801c8432e33c331e9d0a2b35636b23d1d1b7bad07d7f170081df0b7ac0","nodeId":"96533369-a867-4863-9cf4-7057c9ecdbe4","outcome":"completed","summary":"The review is complete. The findings file is valid JSON and the working tree is clean apart from the ignored scratch directory.\n\n**Result: no defects found in the math, boundary or numerical-gap areas.** `.imd-findings.json` holds an empty findings list and seven coverage rows, all `holds`.\n\n**What the token is.** `src/PaperclashToken.sol` is 31 lines: OpenZeppelin v5.4.0 `ERC20` plus `ERC20Permit`, a constant supply of 1e27 minted once to `msg.sender`, no owner, no custom arithmetic, no external calls, no payable functions.\n\n**What I checked, per guide:**\n- **Math Precision.** The only arithmetic the project adds is the supply literal, which the compiler folds to exactly 1e27. That is the aderyn large-literal lead, and it is not a defect. The supply divides every launch basis-point split with zero remainder, so swarm, pool and remainder shares are exact. Balance writes in OpenZeppelin's `_update` are bounded by the supply and cannot overflow.\n- **Boundary.** Full-supply, supply-plus-one, max-uint, zero-value and self transfers behave as ERC-20 specifies. The allowance sentinel is exactly max-uint, and max-minus-one is decremented. Permit accepts a deadline equal to the current timestamp, rejects high-s and bad v values, rejects zero owner or spender, bumps the nonce only on success, and rebinds its domain separator on a chain-id change.\n- **Numerical Gap.** The sum of balances equals the total supply under fuzzing, and no post-constructor path can change the supply.\n\n**Library integrity.** I hashed every vendored OpenZeppelin file on the import graph against the upstream v5.4.0 release. Ten are byte-identical. ERC20Permit, ECDSA and IERC20Permit differ only in forge fmt line wrapping, which I diffed.\n\n**Evidence.** The project's 33 tests pass, and my 15 scratch tests in `test/scratch/MathBoundary.t.sol` pass. That directory is git-ignored and nothing in it is submitted.\n\n**Not reported.** Standard ERC-2612 permit front-running, where a third party submits a signed permit early and causes an integrator's bundled call to revert, is a known property of every OpenZeppelin permit token, causes no loss, and is outside the math area. The judge may want it noted as an integration caveat only.","treeHash":null,"usage":{"cachedInputTokens":548779,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13017,"runtime":"claude","turns":21,"wallClockMs":179614}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"df74f6c887684f20","findings":[{"citation":"resolved","description":"Both specialist findings (audit_flow id 1dc0527a..., audit_permissions id 583b5479...) describe the same root cause and are merged here. PaperclashToken inherits OpenZeppelin v5.4.0 ERC20Permit unchanged (vendored file matches upstream v5.4.0 apart from forge-fmt line wrapping). ERC20Permit.permit (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol lines 42-60) has no msg.sender restriction by design: anyone holding a valid (owner, spender, value, deadline, v, r, s) tuple may submit it. The signature binds owner, spender, value, nonce, deadline, this contract's address and chain id, so a relayer cannot alter the approval; it can only land it first. The owner's intended allowance is set exactly once and the spender can spend it, so no funds are lost, misdirected or frozen. The only effect is that a periphery contract that calls permit() and then transferFrom() in one transaction without try/catch reverts with ERC2612InvalidSigner if the signature was relayed first. This is OpenZeppelin's documented ERC-2612 security consideration and is not a defect in this token; it is kept at info so integrators are told to wrap permit() in try/catch or check allowance() first. No change to the token is proposed and it does not block the launch.","line":17,"path":"src/PaperclashToken.sol","reproduction":"Reproduced with a scratch Foundry test (test/scratch/PermitRelay.t.sol, run and removed; it passes on this code, confirming the behaviour). State: token deployed by the test, 100e18 PAPER transferred to alice (vm.addr(0xA11CE)), nonces(alice)==0. alice signs the EIP-712 digest keccak256(0x1901 || DOMAIN_SEPARATOR() || keccak256(abi.encode(PERMIT_TYPEHASH, alice, bob, 50e18, 0, block.timestamp+1h))). Step 1: vm.prank(mallory); token.permit(alice, bob, 50e18, deadline, v, r, s) -> succeeds; allowance(alice,bob)==50e18; nonces(alice)==1. Step 2: vm.prank(bob); same permit() call with the same signature -> reverts (ERC2612InvalidSigner, because the struct hash now uses nonce 1). Step 3: vm.prank(bob); transferFrom(alice, bob, 50e18) -> true; balanceOf(bob)==50e18; totalSupply unchanged at 1_000_000_000e18. Expected by a naive integrator bundling permit+transferFrom: step 2 succeeds. Actual: step 2 reverts, the allowance from step 1 stands, and no value is lost.","severity":"info","snippet":"contract PaperclashToken is ERC20, ERC20Permit {","title":"permit() may be relayed by any third party ahead of the spender, consuming the owner's nonce so an integrator's bundled permit()+transferFrom() reverts (inherent ERC-2612 behaviour, merged from audit_"}],"hash":"c4c7c30807378ad2e1bc35687d9c7e56f19eef3a1a87e9d9079a282ce2b193da","nodeId":"1e6eb911-2de9-4b16-8a6b-93e589839ddb","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing else depends on further tool calls.\n\n**Outcome:** the Paperclash token has no defects that block the launch. The findings file holds one merged info-level note and a nine-row coverage record, with all four entry points answered.\n\n**What I verified against the code**\n\n- The token is OpenZeppelin v5.4.0 ERC20 plus ERC20Permit with no overrides, no owner, and no mint, burn, pause or blacklist path. The constructor is the only mint and it mints exactly the manifest supply to the deployer.\n- The vendored OpenZeppelin files hash-match upstream v5.4.0 for ERC20, EIP712 and Nonces. ERC20Permit and ECDSA differ only in line wrapping.\n- Runtime bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT or CALL. Creation and runtime sizes are far below the protocol limits, and the constructor takes no arguments, so the factory's CREATE2 deployment works.\n- The manifest uses only schema keys, correct value types, lowercase addresses, an empty constructor argument list matching the parameter list, and a supply equal to what the constructor mints.\n- The project's 65 existing tests pass. The aderyn large-literal lead is a style note with no defect behind it.\n\n**Specialist findings:** the audit_flow and audit_permissions reports described the same root cause, the inherent ERC-2612 permit relay behaviour. I merged them into one info finding, reproduced it with a scratch test that I ran and then deleted, and kept it at info because no funds are lost, misdirected or frozen. The math, economics and tester reports had no findings, and I found nothing they missed.\n\nThe working tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":341436,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":8436,"runtime":"claude","turns":10,"wallClockMs":188564}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"809ae05b6282abad","findings":[],"hash":"fbaf099971398972e6e902f7a4c334a232ea55f4244bdc633c5e4f4f31da79b7","nodeId":"d70591b2-df0c-431d-890c-0c6617801230","outcome":"completed","summary":"Private list: nothing remains. The report is written and validated, the ABI confirms exactly the four listed state-changing entry points, the full suite passes, and the tracked tree is clean, so no further tool calls are needed.\n\n**Review complete: no defects found in the assigned economics area.** `.imd-findings.json` holds `{\"findings\": []}` plus eight coverage rows, all `holds`.\n\nWhat I verified:\n\n- **Supply and conservation.** The constructor's single `_mint` of `1_000_000_000 * 1e18` is the only supply-increasing path. `_mint`, `_burn` and `_update` are internal; no public mint or burn exists and probing the common admin selectors from stranger, holder and factory leaves `totalSupply` at 1e27. Fuzzed conservation across 256 runs and seven accounts holds.\n- **Launch flows.** The 10/60/30 split is integer-exact (`1e26 + 6e26 + 3e26 = 1e27`), so the factory keeps zero dust. The token moves exactly the requested amount with no fee, rebasing, hook, or callback, so the swarm share, pool seed and remainder all arrive whole.\n- **Entry points.** `approve`, `permit`, `transfer` and `transferFrom` are the only state-changing functions in the compiled ABI. The inherited OpenZeppelin code is pristine 5.4.0: zero-address rejection, allowance spend before transfer with atomic revert, low-s ECDSA, per-owner nonce, and an EIP-712 domain bound to \"Paperclash\", the chain and the contract address. Infinite allowance is not decremented, as documented.\n- **Manifest inputs.** `decimals()` is 18 and `totalSupply()` is exactly `1000000000000000000000000000`, matching the objective.\n\nEvidence: the project's 33 tests pass, and my independent scratch invariant suite (4 tests, gitignored under `test/scratch/`) passes. Runtime is 3,829 bytes, well under EIP-170, and the tracked tree is unmodified.\n\nLimitations: the protected floor tests cannot run here because they import v4-core and read `IMD_*` environment variables that this workspace lacks, so I traced their flows statically rather than executing them. The aderyn \"large numeric literal\" lead at `src/PaperclashToken.sol:25` is a false positive: `1e27` fits `uint256` and is the intended supply. I could not cross-check the README's pool and economics values against the job, because the supplied objective states no economics and no `launch.json` exists yet; the manifest step copies those from the job, so that is not a contract defect.","treeHash":null,"usage":{"cachedInputTokens":516224,"inputTokens":73485,"model":"claude-fable-5-1","outputTokens":27249,"runtime":"claude","turns":40,"wallClockMs":171320}}],"verification":[{"checks":[{"durationMs":1109,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.02s\nCompiler run successful!\n","passed":true},{"durationMs":122,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/PaperclashToken.t.sol:PaperclashTokenTest\n[PASS] testFuzz_roundTripLeavesBalancesUnchanged(uint256) (runs: 256, μ: 187884, ~: 189140)\nLogs:\n  Bound result 289628067462124969112036838\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 103300, ~: 103712)\nLogs:\n  Bound result 997266238352573326305560916\n  Bound result 997823001310735898480508974\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 91620, ~: 91814)\nLogs:\n  Bound result 64\n\n[PASS] testFuzz_transferFromWithinAllowanceIsExact(uint256,uint256,uint256) (runs: 256, μ: 218754, ~: 219839)\nLogs:\n  Bound result 5559\n  Bound result 5525\n  Bound result 790\n\n[PASS] test_approveAndTransferFrom() (gas: 218137)\n[PASS] test_approveZeroSpenderReverts() (gas: 32898)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8189)\n[PASS] test_deployScriptMintsToBroadcaster() (gas: 2265665)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 98641)\n[PASS] test_deployerIsWhoeverCallsTheConstructor() (gas: 14127)\n[PASS] test_holderToHolderTransfer() (gas: 135287)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 176579)\n[PASS] test_launchSplitSumsToSupply() (gas: 214002)\n[PASS] test_metadata() (gas: 47365)\n[PASS] test_noFreezeOrSeizeSelectorExists() (gas: 420075)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 579249)\n[PASS] test_permitCannotBeReplayed() (gas: 134512)\n[PASS] test_permitRevertsOnWrongSigner() (gas: 81788)\n[PASS] test_permitRevertsWhenExpired() (gas: 49767)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 115608)\n[PASS] test_permitThenTransferFrom() (gas: 225034)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2132456)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 18270)\n[PASS] test_swarmShareArrivesWholeAndIsClaimableWhole() (gas: 147900)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 144232)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 149853)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 96592)\n[PASS] test_transferMovesExactAmount() (gas: 90377)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96139)\n[PASS] test_transferToZeroAddressReverts() (gas: 91176)\n[PASS] test_transferWithNoBalanceReverts() (gas: 37704)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 17719)\n[PASS] test_zeroAmountTransferSucceeds() (gas: 44468)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 11.07ms (51.56ms CPU time)\n\nRan 1 test suite in 11.81ms (11.07ms CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":44,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PaperclashToken.approve(address,uint256)\",\"PaperclashToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"PaperclashToken.transfer(address,uint256)\",\"PaperclashToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":111,\"foundry.toml\":20,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployPaperclash.s.sol\":25,\"src/PaperclashToken.sol\":31,\"test/PaperclashToken.t.sol\":447},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2b6051d9eca6066592926dc193ab77a6eca1da1d87fa19badc9e975b17f57c29","verifiedTreeHash":"1ac2cba3212b898f0906ebb5dd82e0806382942c","verifierVersion":"0.1.0+260efc41"},{"checks":[{"durationMs":1092,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 997.36ms\nCompiler run successful!\n","passed":true},{"durationMs":122,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/PaperclashToken.t.sol:PaperclashTokenTest\n[PASS] testFuzz_roundTripLeavesBalancesUnchanged(uint256) (runs: 256, μ: 187884, ~: 189140)\nLogs:\n  Bound result 999999999999999999999999999\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 103300, ~: 103712)\nLogs:\n  Bound result 997266238352573326305560916\n  Bound result 997823001310735898480508974\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 91620, ~: 91814)\nLogs:\n  Bound result 572\n\n[PASS] testFuzz_transferFromWithinAllowanceIsExact(uint256,uint256,uint256) (runs: 256, μ: 218754, ~: 219839)\nLogs:\n  Bound result 5559\n  Bound result 5525\n  Bound result 790\n\n[PASS] test_approveAndTransferFrom() (gas: 218137)\n[PASS] test_approveZeroSpenderReverts() (gas: 32898)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8189)\n[PASS] test_deployScriptMintsToBroadcaster() (gas: 2265665)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 98641)\n[PASS] test_deployerIsWhoeverCallsTheConstructor() (gas: 14127)\n[PASS] test_holderToHolderTransfer() (gas: 135287)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 176579)\n[PASS] test_launchSplitSumsToSupply() (gas: 214002)\n[PASS] test_metadata() (gas: 47365)\n[PASS] test_noFreezeOrSeizeSelectorExists() (gas: 420075)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 579249)\n[PASS] test_permitCannotBeReplayed() (gas: 134512)\n[PASS] test_permitRevertsOnWrongSigner() (gas: 81788)\n[PASS] test_permitRevertsWhenExpired() (gas: 49767)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 115608)\n[PASS] test_permitThenTransferFrom() (gas: 225034)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2132456)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 18270)\n[PASS] test_swarmShareArrivesWholeAndIsClaimableWhole() (gas: 147900)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 144232)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 149853)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 96592)\n[PASS] test_transferMovesExactAmount() (gas: 90377)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96139)\n[PASS] test_transferToZeroAddressReverts() (gas: 91176)\n[PASS] test_transferWithNoBalanceReverts() (gas: 37704)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 17719)\n[PASS] test_zeroAmountTransferSucceeds() (gas: 44468)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 11.09ms (46.62ms CPU time)\n\nRan 1 test suite in 12.17ms (11.09ms CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":44,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PaperclashToken.approve(address,uint256)\",\"PaperclashToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"PaperclashToken.transfer(address,uint256)\",\"PaperclashToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":111,\"foundry.toml\":20,\"remappings.txt\":2,\"script/DeployPaperclash.s.sol\":25,\"src/PaperclashToken.sol\":31,\"test/PaperclashToken.t.sol\":447},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1689,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":483,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PaperclashToken.sol:25: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"371a98773d1a0daa607478a13d9c1d7244dcd0570f79470216346d831a392b42","verifiedTreeHash":"f7c51d63fc65a46a9780b51db327187d4c027b8e","verifierVersion":"0.1.0+260efc41"},{"checks":[{"durationMs":1889,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.80s\nCompiler run successful!\n","passed":true},{"durationMs":9144,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/PaperclashToken.t.sol:PaperclashTokenTest\n[PASS] testFuzz_roundTripLeavesBalancesUnchanged(uint256) (runs: 256, μ: 187924, ~: 189122)\nLogs:\n  Bound result 999999999999999999999999999\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 103223, ~: 103711)\nLogs:\n  Bound result 176521102961803383456034887\n  Bound result 364970130144721339938895071\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 91525, ~: 91826)\nLogs:\n  Bound result 589\n\n[PASS] testFuzz_transferFromWithinAllowanceIsExact(uint256,uint256,uint256) (runs: 256, μ: 218645, ~: 219839)\nLogs:\n  Bound result 5559\n  Bound result 5525\n  Bound result 790\n\n[PASS] test_approveAndTransferFrom() (gas: 218137)\n[PASS] test_approveZeroSpenderReverts() (gas: 32898)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8189)\n[PASS] test_deployScriptMintsToBroadcaster() (gas: 2265665)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 98641)\n[PASS] test_deployerIsWhoeverCallsTheConstructor() (gas: 14127)\n[PASS] test_holderToHolderTransfer() (gas: 135287)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 176579)\n[PASS] test_launchSplitSumsToSupply() (gas: 214002)\n[PASS] test_metadata() (gas: 47365)\n[PASS] test_noFreezeOrSeizeSelectorExists() (gas: 420075)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 579249)\n[PASS] test_permitCannotBeReplayed() (gas: 134512)\n[PASS] test_permitRevertsOnWrongSigner() (gas: 81788)\n[PASS] test_permitRevertsWhenExpired() (gas: 49767)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 115608)\n[PASS] test_permitThenTransferFrom() (gas: 225034)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2132456)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 18270)\n[PASS] test_swarmShareArrivesWholeAndIsClaimableWhole() (gas: 147900)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 144232)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 149853)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 96592)\n[PASS] test_transferMovesExactAmount() (gas: 90377)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96139)\n[PASS] test_transferToZeroAddressReverts() (gas: 91176)\n[PASS] test_transferWithNoBalanceReverts() (gas: 37704)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 17719)\n[PASS] test_zeroAmountTransferSucceeds() (gas: 44468)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 46.86ms (145.47ms CPU time)\n\nRan 31 tests for test/PaperclashToken.edges.t.sol:PaperclashTokenEdgesTest\n[PASS] testFuzz_approveOverwritesRatherThanAdds(uint256,uint256) (runs: 256, μ: 92833, ~: 92964)\n[PASS] testFuzz_failedTransferFromLeavesStateUntouched(uint256,uint256,uint256) (runs: 1000, μ: 187931, ~: 188225)\nLogs:\n  Bound result 36\n  Bound result 123395959967949674385806311\n  Bound result 3060977744235945751450\n\n[PASS] testFuzz_permitFromAnyOtherKeyReverts(uint256) (runs: 1000, μ: 81050, ~: 81028)\nLogs:\n  Bound result 100000000000000000000\n\n[PASS] testFuzz_permitSetsExactValue(uint256,uint256) (runs: 1000, μ: 116667, ~: 117239)\nLogs:\n  Bound result 244\n\n[PASS] testFuzz_selfTransferIsANoOp(uint256,uint256) (runs: 256, μ: 113066, ~: 113499)\nLogs:\n  Bound result 963544908170045311270714365\n  Bound result 10243314\n\n[PASS] test_allowanceIsPerSpender() (gas: 145320)\n[PASS] test_allowanceSpentExactlyToZero() (gas: 212978)\n[PASS] test_approveToZeroRevokes() (gas: 169842)\n[PASS] test_domainSeparatorFollowsChainId() (gas: 103530)\n[PASS] test_domainSeparatorIsTheStandardOne() (gas: 20597)\n[PASS] test_eachDeploymentIsIndependent() (gas: 58240)\n[PASS] test_maxAllowanceStillBoundedByBalance() (gas: 151294)\n[PASS] test_maxUintTransferReverts() (gas: 38175)\n[PASS] test_oneWeiOverTheSupplyReverts() (gas: 38082)\n[PASS] test_permitAtExactDeadlineSucceeds() (gas: 103261)\n[PASS] test_permitForFutureNonceReverts() (gas: 75974)\n[PASS] test_permitForZeroOwnerCannotBeForged() (gas: 63460)\n[PASS] test_permitOneSecondPastDeadlineReverts() (gas: 50082)\n[PASS] test_permitRejectsHighSMalleatedSignature() (gas: 151921)\n[PASS] test_permitRejectsInvalidV() (gas: 75791)\n[PASS] test_permitToZeroSpenderReverts() (gas: 75137)\n[PASS] test_permitWithTamperedValueReverts() (gas: 196993)\n[PASS] test_permitsMustBeUsedInNonceOrder() (gas: 221711)\n[PASS] test_selfTransferAboveBalanceStillReverts() (gas: 93976)\n[PASS] test_selfTransferFromSpendsOwnAllowance() (gas: 190277)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 161149)\n[PASS] test_transferFromZeroAddressReverts() (gas: 63491)\n[PASS] test_transferToTokenContractIsAcceptedAndStuck() (gas: 73363)\n[PASS] test_wholeSupplyCanMoveInOneTransfer() (gas: 110837)\n[PASS] test_zeroAmountTransferFromNeedsNoAllowance() (gas: 57959)\n[PASS] test_zeroTransferToZeroAddressStillReverts() (gas: 32835)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 48.51ms (194.87ms CPU time)\n\nRan 1 test for test/PaperclashToken.invariant.t.sol:PaperclashInvariantTest\n[PASS]\nPaperclashInvariantTest invariants:\n[PASS] invariant_allowancesAndNoncesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_everyCallBehavedAsSpecified\n[PASS] invariant_holdersAccountForTheWholeSupply\n[PASS] invariant_tokenContractHoldsNothingUnsent\n[PASS] invariant_totalSupplyNeverChanges\n PaperclashInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------+--------------+-------+---------+----------╮\n| Contract          | Selector     | Calls | Reverts | Discards |\n+===============================================================+\n| PaperclashHandler | approve      | 3267  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | permit       | 3234  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | transfer     | 3332  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | transferFrom | 3238  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | warp         | 3313  | 0       | 0        |\n╰-------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 330833632606246452714950032\n  Bound result 6\n  Bound result 28142510944238217805828320\n  Bound result 2278\n  Bound result 95\n  Bound result 141936\n  Bound result 6175\n  Bound result 253\n  Bound result 10088\n  Bound result 1143231\n  Bound result 16331800122830084076662121\n  Bound result 682\n  Bound result 0\n  Bound result 7000000000000000000\n  Bound result 244\n  Bound result 2592000\n  Bound result 2592000\n  Bound result 9181993191794191660\n  Bound result 21707818\n  Bound result 7031\n  Bound result 7444\n  Bound result 190012\n  Bound result 2317225287264671854\n  Bound result 3565\n  Bound result 86\n  Bound result 2\n  Bound result 28127056306992535679377759\n  Bound result 0\n  Bound result 244\n  Bound result 298187102286703802833777349\n  Bound result 381077\n  Bound result 202005918702982260787094572\n  Bound result 5000000000000000000\n  Bound result 6006\n  Bound result 0\n  Bound result 6000\n  Bound result 3079\n  Bound result 7552\n  Bound result 5\n  Bound result 10975511940755994778497313269757078097869739010116371925\n  Bound result 6736587\n  Bound result 60000000000000000000\n  Bound result 3266\n  Bound result 0\n  Bound result 1111113\n  Bound result 127\n  Bound result 733\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1126\n  Bound result 500000000000000000000\n  Bound result 1782\n  Bound result 64\n  Bound result 5879\n  Bound result 2966\n  Bound result 909843\n  Bound result 31536000\n  Bound result 238\n  Bound result 2314762\n  Bound result 2592000\n  Bound result 244\n  Bound result 0\n  Bound result 127\n  Bound result 254\n  Bound result 2821\n  Bound result 2286462\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.02s (9.02s CPU time)\n\nRan 3 test suites in 9.02s (9.12s CPU time): 65 tests passed, 0 failed, 0 skipped (65 total tests)\n","passed":true},{"durationMs":44,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PaperclashToken.approve(address,uint256)\",\"PaperclashToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"PaperclashToken.transfer(address,uint256)\",\"PaperclashToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":111,\"foundry.toml\":20,\"remappings.txt\":2,\"script/DeployPaperclash.s.sol\":25,\"src/PaperclashToken.sol\":31,\"test/PaperclashToken.edges.t.sol\":384,\"test/PaperclashToken.invariant.t.sol\":265,\"test/PaperclashToken.t.sol\":447},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"755b3765e5000d4f7dcf92912669ea8ed7e1a4eae19e499d205201feb7890568","verifiedTreeHash":"9c64868a37d0fa8b5839a52277311f74b243f71b","verifierVersion":"0.1.0+260efc41"}]}