{"assessments":[],"deployments":[{"attestationHash":"067b89007166d7f68f14a056e91be6eed5b2cfd2ab28546954340818d9e21f4b","chainId":1,"contracts":[{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26273632,"name":"PoolInitializationGuard","role":"hook","txHash":"0x0efe31305afb10d518a80ba8bd414a1382f468550267fa77145f56886c23e6ea"},{"address":"0x579cc473399e4922e498798b3e5c6b293a5b2a5d","blockNumber":26273632,"name":"MerkleDistributor","role":"distributor","txHash":"0x0efe31305afb10d518a80ba8bd414a1382f468550267fa77145f56886c23e6ea"},{"address":"0x49977fb9bd19bbcff65d7ce6aed0c5c0406bb92a","blockNumber":26273632,"name":"Paperclash","role":"token","txHash":"0x0efe31305afb10d518a80ba8bd414a1382f468550267fa77145f56886c23e6ea"}],"id":"a766fc45-5905-45e3-8684-4acb8ffb06d8","manifestHash":"d1fa9ef90f4e2d0aeaa2696fe907f952310e64332fbf539f64f078c03d3be9cf","status":"live"}],"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":"c6aa5c7d-9528-4d43-87ad-2e76d56330ec","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"5331c16e83c5e79bbfc69b58694bfe5b80b716e917308dd189b4426050b2bbfc","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":"442d8976e7db45fc0961317f92c72533e3ef548d70ff670c8374215550c6e799","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":"cccd8b06b681d338d927c54a3d1de309cc00a4aff54094b6229c0b0c296d6550","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":"48c470aa28576705f40eda864a6df4011ba9a4488a7132d66268d73734790a17","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":"136fa1a97bacea7563c7f29e0e2aeebc64f737a2af6dba04e3b5850245196433","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":"d185748d889620d2a1ebaa1b806707588f0acd9696839506e5b9e509786e92c6","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":"393004a0ef2d76670791890c11d803e08cfb2602800611a9cd91c63d11ae6a60","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"f232a0e180a52a90a340b2de7b0152af1d4dfcd4de3494cf2d4199e248f6262b","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 (CLASH).\nToken name: paperclash\nToken symbol: CLASH\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: link this as a social on the coin https://x.com/robobet_fun","parentJobId":null,"planHash":"214329b9f8825f2751496c3c62b22f111dfd2fff4ada4158d2eb6fa815841677","previousHash":"af1282ef8b0d320bf3e95e49873bc73f48e9cdfae163fd0fa64193228f8a635c","projectId":"c6aa5c7d-9528-4d43-87ad-2e76d56330ec","publication":{"commit":"4abaf2ade970d456ca80b00d01b2d3461401cccf","deliveredAt":"2026-10-26T01:39:28.661Z","repoUrl":"https://github.com/identity-md-launches/launch-2589-paperclash"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"8f26bab7163cc819a45fb801dddd485c20ca20f028704df4cc8ba5efbdddb41a","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2d027bc56749d95c","findings":[{"citation":"resolved","description":"Asymmetry between the two balance-moving entry points: Paperclash.transfer can only ever name msg.sender as the `from` of the Transfer event, but Paperclash.transferFrom names its `from` argument, and the only guard on that argument is the allowance check in _spendAllowance (ERC20.sol:305-315). With value = 0 and allowance 0 the condition `0 < 0` is false, so no revert, _approve(from, spender, 0, false) rewrites the zero allowance to zero, and _transfer emits Transfer(from, to, 0). Any address can therefore emit Transfer(holder, X, 0) for any holder without that holder's consent. No balance or allowance changes, no permission over funds is gained, and the supply is unchanged, so this is not a permission bypass. It is the behaviour of the unmodified OpenZeppelin v5.0.2 ERC20 (vendored files are byte-identical to upstream, verified by SHA-256) and of the ERC-20 standard itself; the README (\"Zero-value transfers to valid addresses ... are supported\") and test/Paperclash.t.sol:301 test_ZeroTransferFromNeedsNoAllowance treat it as intended. The practical exposure is the well-known zero-value-transfer address-poisoning pattern: an attacker emits Transfer(victim, lookalikeAddress, 0) so the lookalike appears in the victim's transaction history and may be copy-pasted later. The token cannot prevent the off-chain mistake, and most wallets and explorers now filter zero-value transfers. Reported for completeness of the asymmetry pass; no code change is required for the launch. If the author wants to close it, the minimal change that keeps intended behaviour is an override of _spendAllowance (or _update) in src/Paperclash.sol that reverts when msg.sender != from and allowance(from, msg.sender) == 0, which would preserve zero-value self-transfers and all approved transfers.","line":308,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: Paperclash deployed by `factory`; factory.transfer(holder, 1 ether); allowance(holder, stranger) == 0. Call: vm.prank(stranger); token.transferFrom(holder, victim, 0). Expected under a strict reading of 'the caller must have allowance for from's tokens': revert ERC20InsufficientAllowance. Actual: returns true and emits exactly one log Transfer(holder, victim, 0) from the token address; balanceOf(holder) stays 1 ether, balanceOf(victim) stays 0, allowance stays 0. Verified with a Foundry test in test/scratch (recordLogs, one log, topics[1] == holder, topics[2] == victim, data == 0) which passes against the current code, i.e. the behaviour is present. The same call with value 1 reverts with ERC20InsufficientAllowance(stranger, 0, 1), confirming the asymmetry is confined to value 0.","severity":"info","snippet":"            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }","title":"transferFrom with value 0 lets any unapproved caller emit a Transfer event in another holder's name (inherited ERC-20 semantics, address-poisoning surface)"}],"hash":"136fa1a97bacea7563c7f29e0e2aeebc64f737a2af6dba04e3b5850245196433","nodeId":"b204febd-b20f-4347-8871-10347e4209fd","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one info note and nine coverage rows. The tree is otherwise unchanged (the scratch test was removed).\n\n**Outcome: no permission defects in the Paperclash token.** The access-control, trust-gap and asymmetry passes all come back clean.\n\nWhat I verified:\n- **Permission map is empty.** The constructor mints the full 1e27 supply to the caller and stores no owner, minter, pauser or initializer. The compiled ABI exposes only the ERC-20 functions plus two constant getters, with no receive or fallback.\n- **Guards are consistent.** Balances are written only through `_update`, reached from `transfer` with `from` fixed to the caller, or from `transferFrom` behind the allowance check. Allowances are written only by the owner's own `approve` or by exact decrement on spend.\n- **No hidden privilege in the library.** All five vendored OpenZeppelin files hash identically to upstream v5.0.2, so the inherited code is unmodified. The runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT on any reachable path.\n- **Launch flows cannot be shorted.** There is no fee, burn or exemption list, so the swarm share, pool seed and swaps move exact amounts. The existing 40 unit, fuzz and invariant tests pass with the pinned seed, and the formatter check passes.\n\nThe one item reported, at info severity, is the standard ERC-20 asymmetry between the two balance-moving paths. A caller with zero allowance can call `transferFrom` with value 0 against any holder and emit a Transfer event in that holder's name. No balance or allowance changes, and the README and the project's own test treat this as intended, so it does not need a fix before launch. I included it only to document the address-poisoning surface and a minimal optional override.\n\nCoverage rows: all three listed entry points are answered, two as holds and `transferFrom` as finding 1. Six further rows record the constructor role handout, the absent admin surface, library integrity, opcode scan, launch flows and the not-yet-present manifest. The only thing not reachable here was the network's Uniswap v4 protected harness, which needs the factory and manifest environment the verifier supplies.","treeHash":null,"usage":{"cachedInputTokens":554058,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12730,"runtime":"claude","turns":26,"wallClockMs":226264}},{"artifacts":[],"attempt":1,"bundleHash":"d6f4f0b694c6f499c2da5f1c6eae4eb8de7838875a14e4dd66feb92ef2c7dde0","device":"5d667e4b0751bcb5","findings":[],"hash":"393004a0ef2d76670791890c11d803e08cfb2602800611a9cd91c63d11ae6a60","nodeId":"8effa929-7eb5-4bd6-b3f3-447ee8373528","outcome":"completed","summary":"Done. `launch.json` is written and is the only new file in the tree.\n\n**What the manifest describes**\n\n- Token contract `Paperclash`, name \"paperclash\", symbol \"CLASH\", 18 decimals, empty constructorArgs. The compiled ABI confirms the constructor takes no parameters.\n- totalSupply is the constant the constructor mints to msg.sender: one billion tokens in base units.\n- contracts is empty. The accepted tree has no application contracts, only the token.\n- pool and economics are copied exactly as the launch gives them: native ETH, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's verbatim economics object.\n- notes explain the plain fixed-supply ERC-20, that it needs no exemptions for the distributor, PoolManager or factory flows, and that the X link is served by the on-chain `SOCIAL_URL()` getter and must be copied into the coin page's social field.\n\n**Checks run**\n\n- `forge build` compiled cleanly with Solidity 0.8.26.\n- `forge test` with the verifier's fuzz seed passed all 40 tests across both suites, including the invariant suite.\n- A script compared the manifest against the compiled ABI and the job's economics: constructor arity, supply, economics and top-level keys all match, and notes are well under the 4000-character limit.\n- `git status` shows only the untracked `launch.json`. No configuration, lib, or source file was touched.","treeHash":"19dbb55485627850456e8d9b6b7fe7efa5799949","usage":{"cachedInputTokens":133855,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3194,"runtime":"claude","turns":10,"wallClockMs":68951}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"63458a1bd2b2d376","findings":[{"citation":"resolved","description":"Periphery pass. lib/VENDORED.md line 3 states 'Sources are unchanged from the pinned upstream releases' and lib/SHA256SUMS is the manifest a reviewer or verifier uses to confirm that. Seven forge-std v1.9.7 files in the tree do not hash to the values listed, so the repository's own provenance check fails. I fetched the upstream v1.9.7 archive (SHA-256 45157353ab49... matches VENDORED.md) and diffed: every difference is a line reflow of the kind `forge fmt` produces (multi-line function signatures joined onto one line); after stripping all whitespace the files are identical to upstream, so no behaviour changed. The six OpenZeppelin v5.0.2 files, including the ERC20.sol the token inherits, are byte-identical to upstream and their hashes match. Impact is limited to test-only tooling and to the trustworthiness of the vendoring statement: the deployed token bytecode is unaffected. Fix: either restore the seven upstream files byte-for-byte (and exclude lib/ from forge fmt) or regenerate lib/SHA256SUMS from the files as committed and reword VENDORED.md to say forge-std was reformatted.","line":1,"path":"lib/SHA256SUMS","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected: every line reports OK, as VENDORED.md claims. Actual: `sha256sum: WARNING: 7 computed checksums did NOT match`, with FAILED for lib/forge-std/src/StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol. Confirming cause: download https://codeload.github.com/foundry-rs/forge-std/tar.gz/refs/tags/v1.9.7 and `diff` e.g. src/StdJson.sol: upstream lines 200-203 are a wrapped signature `function serialize(string memory jsonKey, string memory key, bool[] memory value)\\n internal\\n returns (string memory)\\n {`, the vendored copy has it on one line; `tr -d ' \\t\\n\\r'` on both files then sha256sum gives equal digests.","severity":"low","snippet":"0211b47e93dbeb6a7de6112470a77137038ed73b79b015847f013e49fcd7511f  lib/forge-std/src/StdJson.sol","title":"lib/SHA256SUMS and VENDORED.md provenance claim do not match seven vendored forge-std files"}],"hash":"442d8976e7db45fc0961317f92c72533e3ef548d70ff670c8374215550c6e799","nodeId":"41a6e1aa-1267-463f-bb68-7c5cf02b1d27","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root with one finding and nine coverage rows. The working tree is otherwise unchanged.\n\n**Outcome.** The Paperclash token is sound under all three control-flow lenses. It is a 20-line contract that inherits OpenZeppelin v5.0.2 ERC20 without overrides and mints 1e27 base units to the creating caller in its constructor. I found no defect in the token's code.\n\n**What I checked**\n\n- **Execution Trace.** Traced approve, transfer and transferFrom through the inherited code to storage. Zero-address checks, balance and allowance checks, and the unchecked arithmetic are all sound. transferFrom spends the allowance before moving the balance, and a revert in either step rolls back both. Infinite allowance never decrements, which is standard ERC-20 behaviour.\n- **Periphery.** I downloaded the upstream OpenZeppelin v5.0.2 archive and confirmed all six vendored files, including the inherited ERC20.sol, are byte-identical to upstream. No libraries, external calls or callbacks exist in the token.\n- **First Principles.** Name, symbol, 18 decimals, exact supply and the social URL constant all match the brief. The contract identifier fits the 32-byte manifest limit. The constructor is non-payable and takes no arguments, so there is no manifest ordering risk.\n- **Launch floor.** A scratch test modelled the factory deploying via CREATE2, moving the 10/80/10 splits exactly, and scanned the reachable runtime for DELEGATECALL, CALLCODE, SELFDESTRUCT and external calls. None are present. ETH and unknown selectors revert. The project's own 40 tests pass with the pinned fuzz seed and `forge fmt --check` is clean.\n\n**The one finding (low).** Seven vendored forge-std files fail the repository's own `sha256sum -c lib/SHA256SUMS`, contradicting the VENDORED.md statement that sources are unchanged from upstream. The differences are whitespace-only reflows and affect test tooling only, not the deployed bytecode. The fix is to restore the upstream bytes or regenerate the checksum file and reword the claim.\n\n**Not in the findings file.** The README states the chain is Ethereum mainnet, which the job text does not specify. That is a documentation assumption with no failing input, so I left it out of the report and note it here for the judge.\n\n**Coverage.** All three listed entry points plus the constructor are marked `holds`. Additional rows cover the fixed-supply invariant, the forbidden-opcode scan, the vendored-source check (marked `finding`), the metadata requirements and the aderyn literal lead. I could not run the protected Uniswap v4 harness because v4-core is not vendored here, so the actual seed and swap were modelled with plain transfers rather than executed.","treeHash":null,"usage":{"cachedInputTokens":672375,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":15501,"runtime":"claude","turns":25,"wallClockMs":260425}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f2101c240e0b52a9","findings":[{"citation":"resolved","description":"lib/VENDORED.md states every vendored source is unchanged from its pinned upstream release and lib/SHA256SUMS is supplied to prove it. Seven forge-std v1.9.7 files in the tree (src/StdJson.sol, src/interfaces/IMulticall3.sol, src/console.sol, src/Vm.sol, src/interfaces/IERC7540.sol, src/StdAssertions.sol, src/StdToml.sol) do not hash to the values listed, so the provenance check the README offers fails. I compared each against the raw upstream v1.9.7 file: the differences are line-wrapping only (the files were apparently run through forge fmt with the project's 120-column setting); with all whitespace stripped the contents are identical, so no semantic change was made. All five OpenZeppelin files, which are the only dependency compiled into the deployed token, hash exactly to upstream v5.0.2 and to SHA256SUMS. This is a documentation/integrity nit, not a code defect, and it is outside my assigned math area; I report it because the stated claim is concretely false on this tree and a verifier reproducing the checksum step will see it fail. No impact on the token's arithmetic, supply or launch flows.","line":3,"path":"lib/VENDORED.md","reproduction":"From the repository root run: sha256sum -c lib/SHA256SUMS. Expected: every listed file reports OK. Actual: 29 OK, 7 FAILED (StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol under lib/forge-std/src). Example: sha256sum lib/forge-std/src/Vm.sol gives a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 while SHA256SUMS lists (and upstream v1.9.7 hashes to) 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1. Confirm the change is whitespace-only: tr -d ' \\t\\r\\n' < lib/forge-std/src/Vm.sol | sha256sum equals the same command on the upstream v1.9.7 file. Fix: either restore the seven upstream files byte-for-byte, or regenerate lib/SHA256SUMS and amend the VENDORED.md sentence to say the files were reformatted.","severity":"info","snippet":"All dependency sources are ordinary files, with no submodules or install step. Sources are unchanged from the pinned upstream releases. Only the ERC-20 dependency closure is included from OpenZeppelin; forge-std includes its source tree and licenses for testing.","title":"Vendored forge-std files do not match lib/SHA256SUMS or the 'unchanged from upstream' claim (whitespace-only reformat; test-only dependency; outside the math area)"}],"hash":"48c470aa28576705f40eda864a6df4011ba9a4488a7132d66268d73734790a17","nodeId":"f1f67a6c-484d-4bf1-86c7-252e672d8530","outcome":"completed","summary":"The review is complete. The findings file is valid, the one cited snippet matches the tree line for line, and no tracked file was changed (only the ignored scratch test and the findings file were written).\n\n**Outcome: no math defects found in the Paperclash token.** The contract is 20 lines over unmodified OpenZeppelin v5.0.2 ERC-20, and nothing in the Math Precision, Boundary or Numerical Gap guides has a surface to act on.\n\nWhat I checked in my area:\n\n- **Supply constant and mint.** The constant evaluates at compile time to exactly 1e27, which divides by 10^18 into one billion whole tokens with no remainder. The single checked `_mint` from zero cannot overflow, and no mint or burn path exists in the ABI.\n- **Transfer and transferFrom arithmetic.** Both unchecked subtractions in OpenZeppelin's `_update` and `_spendAllowance` sit behind an explicit less-than revert. The unchecked credit cannot overflow because the sum of balances always equals total supply. I probed exact balance, balance plus one, max uint, zero, self-transfer of the whole balance, a max-minus-one allowance (it decrements and cannot wrap into the infinite sentinel), and revert atomicity.\n- **Launch split.** The 10/80/10 split of 1e27 in basis points leaves no rounding residue and no intermediate overflow. The token has no tax, so each launch flow moves exactly what it says.\n- **Boundaries.** There are no external calls, no payable path (plain and data-carrying ETH sends revert), no bytes decoding, no division, no downcast and no scale conversion.\n- **Tooling evidence.** All five vendored OpenZeppelin files hash byte-for-byte to upstream v5.0.2. The project suite passes (40 tests, invariants across 8192 handler calls with zero reverts), as do my seven scratch probes. The aderyn large-literal lead is style only.\n\nOne **info-level finding outside my area** is recorded: seven vendored forge-std files fail the checksum list the README points to. They differ from upstream v1.9.7 only in whitespace, so this is a documentation and provenance nit with no effect on the deployed token. The reproduction is a single `sha256sum -c lib/SHA256SUMS` command.\n\nCoverage: all three entry points are marked `holds`, plus five invariant and boundary rows. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":800316,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":13604,"runtime":"claude","turns":21,"wallClockMs":261124}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2dc755dfe7bd177c","findings":[{"citation":"resolved","description":"Outside the economics area; reported because it is reproducible and touches the provenance claim a reviewer relies on. lib/SHA256SUMS records the upstream forge-std v1.9.7 hashes (e.g. Vm.sol 9068805b...), but the vendored copies of Vm.sol, console.sol, StdAssertions.sol, StdJson.sol, StdToml.sol, interfaces/IMulticall3.sol and interfaces/IERC7540.sol were run through `forge fmt` (line_length 120) after vendoring, so their bytes differ and the checksum file fails. I downloaded the upstream v1.9.7 archive (SHA-256 45157353... matches VENDORED.md) and diffed: every difference is whitespace/line-wrapping only, no semantic change. All six OpenZeppelin v5.0.2 files are byte-identical to upstream, so the token's compiled bytecode is unaffected. Impact is limited to a false provenance statement for test tooling. Fix: either restore the upstream bytes for those 7 files or regenerate lib/SHA256SUMS and reword VENDORED.md to say forge-std was reformatted.","line":3,"path":"lib/VENDORED.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected (per VENDORED.md line 3): all 36 lines OK. Actual: 29 OK and 7 FAILED (lib/forge-std/src/StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol), exit code 1. `sha256sum lib/forge-std/src/Vm.sol` gives a1b1c829... while SHA256SUMS line 23 and upstream v1.9.7 give 9068805b...; `diff` against the upstream file shows only line-wrapping differences.","severity":"info","snippet":"All dependency sources are ordinary files, with no submodules or install step. Sources are unchanged from the pinned upstream releases. Only the ERC-20 dependency closure is included from OpenZeppelin; forge-std includes its source tree and licenses for testing.","title":"lib/VENDORED.md claims unchanged upstream sources, but 7 vendored forge-std files are reformatted and fail lib/SHA256SUMS"}],"hash":"5331c16e83c5e79bbfc69b58694bfe5b80b716e917308dd189b4426050b2bbfc","nodeId":"6f5e63a2-a1c1-4abb-b57c-cedcabc13276","outcome":"completed","summary":"The economics review of the CLASH token is complete and `.imd-findings.json` holds the result.\n\n**Outcome: no economic defect found.** The token is a plain OpenZeppelin v5.0.2 ERC-20 whose constructor mints the full 1e27 supply to the deploying caller. The six vendored OpenZeppelin files are byte-identical to the upstream v5.0.2 archive, which I downloaded and diffed. The compiled ABI exposes only approve, transfer and transferFrom as state-changing entry points, with no receive or fallback.\n\nWhat I checked against the Economic Security, Invariant and Flow Gap guides:\n\n- **Supply invariant.** The only mint is in the constructor. No burn, owner, admin or mint selector exists, so supply cannot grow after launch.\n- **Conservation.** Sum of balances equals totalSupply under the project's invariant suite and my own scratch fuzz test.\n- **Launch flows.** The 10% swarm, 80% pool and 10% remainder splits of 1e27 divide with no dust, and every transfer and transferFrom moves exactly the stated amount with no fee, callback or caller-dependent branch. Buy, sell and claim paths cannot arrive short.\n- **Token misbehaviour classes.** No fee-on-transfer, rebase, pause, blacklist, void return or sentinel-address surprises. Zero-address sender, receiver and spender all revert.\n- **Runtime.** An opcode-aware scan of the compiled runtime finds no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT. Decimals are 18 and the social URL constant matches the brief.\n- **Static-analysis lead.** The aderyn large-literal note is the supply constant, which equals exactly 1e27. Not a defect.\n\n**One informational finding** was recorded, outside my area. The vendoring note in `lib/VENDORED.md` says sources are unchanged from upstream, but seven forge-std files were reformatted after vendoring and fail the repository's own checksum file. The differences are whitespace only and affect test tooling, not the token bytecode. Running `sha256sum -c lib/SHA256SUMS` reproduces it.\n\nCoverage has rows for all three listed entry points, all marked holds, plus seven invariant and flow rows. The project suite of 40 tests and my 5 scratch tests all pass. I could not run the protected Uniswap v4 harness locally because v4-core is not vendored, which I noted in the coverage record. No repository files were changed. The scratch test lives in `test/scratch/`, which is not kept.","treeHash":null,"usage":{"cachedInputTokens":892964,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":15838,"runtime":"claude","turns":29,"wallClockMs":242315}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c79042525fc4a50d","findings":[{"citation":"resolved","description":"Three specialists (economics, flow, math) reported the same root cause; merged here as one finding. lib/VENDORED.md line 3 states the vendored sources are unchanged from upstream and lib/SHA256SUMS is the manifest that is supposed to prove it. Seven forge-std v1.9.7 files in the tree (lib/forge-std/src/StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol) were reformatted (forge fmt, line_length 120) after vendoring, so their bytes differ from upstream and the repository's own provenance check fails. I reproduced the checksum failure and confirmed for Vm.sol against the raw upstream v1.9.7 file that the difference is whitespace only (sha256 of both files with all whitespace stripped is identical: fe772424...). All six OpenZeppelin v5.0.2 files, including the ERC20.sol the token inherits, hash exactly to SHA256SUMS, so the deployed token bytecode is unaffected. Impact is limited to test-only tooling and a false provenance statement a verifier relies on. Severity low: no funds, supply or launch flow is affected. Fix: restore the seven upstream files byte-for-byte (and exclude lib/ from forge fmt), or regenerate lib/SHA256SUMS from the committed files and reword VENDORED.md to say forge-std was reformatted.","line":3,"path":"lib/VENDORED.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected (per VENDORED.md line 3): every one of the 36 lines reports OK, exit code 0. Actual: 29 OK, 7 FAILED (lib/forge-std/src/StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol), `sha256sum: WARNING: 7 computed checksums did NOT match`, exit code 1. Cause check: `curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.7/src/Vm.sol | tr -d ' \\t\\r\\n' | sha256sum` equals `tr -d ' \\t\\r\\n' < lib/forge-std/src/Vm.sol | sha256sum` (both fe772424ec5d5c1bbe4f3f375aea816279a5f036307e9a62874b93e85923f325), while the raw files differ. `sha256sum -c lib/SHA256SUMS | grep openzeppelin` shows all six OpenZeppelin lines OK.","severity":"low","snippet":"All dependency sources are ordinary files, with no submodules or install step. Sources are unchanged from the pinned upstream releases. Only the ERC-20 dependency closure is included from OpenZeppelin; forge-std includes its source tree and licenses for testing.","title":"lib/VENDORED.md claims unchanged upstream sources, but seven vendored forge-std v1.9.7 files are reformatted and fail lib/SHA256SUMS (merged: audit_economics, audit_flow, audit_math)"},{"citation":"resolved","description":"Reported by audit_permissions; reproduced. Paperclash.transferFrom's only guard on its `from` argument is _spendAllowance (ERC20.sol:305-315). With value 0 and allowance 0 the check `0 < 0` is false, so no revert; _approve rewrites 0 to 0 and _update emits Transfer(from, to, 0). Any address can therefore emit a zero-value Transfer event naming any holder as sender. No balance, allowance or supply changes, so this is not a permission bypass and no funds are at risk. It is the behaviour of unmodified OpenZeppelin v5.0.2 (vendored ERC20.sol hashes to upstream) and of the ERC-20 standard; README and test/Paperclash.t.sol test_ZeroTransferFromNeedsNoAllowance document it as intended. The only practical exposure is the known zero-value-transfer address-poisoning pattern in explorers and wallet histories, which the token cannot prevent on-chain and which most explorers now filter. No code change is required for launch. If the author wants to close it, override _spendAllowance in src/Paperclash.sol to revert when msg.sender != from and allowance(from, msg.sender) == 0, which keeps zero-value self-transfers and all approved transfers working.","line":308,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: vm.prank(factory); Paperclash t = new Paperclash(); vm.prank(factory); t.transfer(holder, 1 ether); allowance(holder, stranger) == 0. Call: vm.prank(stranger); t.transferFrom(holder, victim, 0). Expected under a strict reading of 'the caller must hold allowance for from': revert ERC20InsufficientAllowance. Actual (verified with a Foundry scratch test using vm.recordLogs): returns true and emits exactly one log, Transfer(address,address,uint256) with topics[1] == holder and topics[2] == victim and data 0; balanceOf(holder) stays 1 ether, balanceOf(victim) stays 0, allowance(holder, stranger) stays 0. The same call with value 1 reverts with ERC20InsufficientAllowance(stranger, 0, 1), so the behaviour is confined to value 0.","severity":"info","snippet":"            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }","title":"transferFrom with value 0 lets any unapproved caller emit Transfer(holder, X, 0) in another holder's name (inherited OpenZeppelin ERC-20 semantics; intended per README and tests; address-poisoning sur"}],"hash":"cccd8b06b681d338d927c54a3d1de309cc00a4aff54094b6229c0b0c296d6550","nodeId":"7bd8e0ff-0f8b-4c13-b23b-488290f883c4","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The working tree is otherwise clean, with the scratch test removed.\n\n**Outcome.** The token is a 20-line, unmodified OpenZeppelin v5.0.2 ERC-20 with no constructor arguments, no owner, and a single constructor mint. No specialist found a code defect, and my own pass agrees. Two findings are kept, both reproduced.\n\n- **Low, merged from three specialists.** The vendoring statement in `lib/VENDORED.md` claims all sources are unchanged from upstream, but seven forge-std files were reformatted after vendoring. Running the checksum file from the repository root fails on those seven. I confirmed against the raw upstream file for Vm.sol that the difference is whitespace only. All six OpenZeppelin files hash to upstream, so the deployed bytecode is unaffected. This is a provenance defect in test tooling, not a token defect.\n- **Info, from the permissions specialist.** A zero-value transferFrom with no allowance succeeds and emits a Transfer event naming another holder. I reproduced it with a scratch test. It is standard ERC-20 behavior, documented as intended in the README and the repo's own tests, with no balance or supply effect.\n\n**Coverage.** All three ABI entry points are answered. Approve and transfer hold. TransferFrom points at the info finding. I also recorded the supply invariant, the opcode and size checks, the manifest, and the aderyn lead as holding.\n\n**Verification done.** The repo's own 54 tests pass. A PUSH-aware scan of the compiled creation and runtime code finds no DELEGATECALL, CALLCODE or SELFDESTRUCT. The manifest matches the source: empty constructorArgs for a zero-parameter constructor, totalSupply equal to the minted constant, name and symbol identical. The protected floor tests could not run here because they import the launch harness that is not in this tree, so their result rests on the verifier's run.\n\nNo critical or high finding exists, so no proof test was required.","treeHash":null,"usage":{"cachedInputTokens":336754,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":8304,"runtime":"claude","turns":10,"wallClockMs":133166}},{"artifacts":[],"attempt":1,"bundleHash":"62dc29153aa6e24907ce3319581f73787f68c44ec799d65122bcce2177b37376","device":"99fdbd4812d28337","findings":[],"hash":"d185748d889620d2a1ebaa1b806707588f0acd9696839506e5b9e509786e92c6","nodeId":"15013dec-1c3e-486b-a95b-bf2ab84abc65","outcome":"completed","summary":"Implemented `Paperclash` with 1 billion CLASH, 18 decimals, minted once to the deployer. Includes the permanent social URL, vendored dependencies, and deployment documentation.\n\nValidation passed: `forge build`, `forge test` with the required seed, and `forge fmt --check`. All 40 tests passed.\n\nThe README documents publishing the social link on the coin page; no deployment or external publication was performed.","treeHash":"0d74b144d428d638bee3ba8d560527db7ab6e19b","usage":{"cachedInputTokens":465792,"inputTokens":48515,"model":"gpt-6-astra","outputTokens":15708,"runtime":"codex","turns":5,"wallClockMs":378782}},{"artifacts":[],"attempt":1,"bundleHash":"27b386c4b5135e1b272da963afdfcaf6f2fed68850d3a09e81b9cc3eb33c990d","device":"12e4af809be06118","findings":[],"hash":"f232a0e180a52a90a340b2de7b0152af1d4dfcd4de3494cf2d4199e248f6262b","nodeId":"341d2e82-80dd-4930-9571-8f93f60d8356","outcome":"completed","summary":"Added 14 tests and strengthened stateful invariants covering failure rollback, allowance boundaries, and transfer properties.\n\nOffline `forge build` and `forge test` pass with the required seed: 54 tests passed, including 32,768 invariant calls.\n\nOnly `test/` changed. No contract defects found.","treeHash":"6ca36a9d98fc847d2bdb39bc1a6bf6523785ea66","usage":{"cachedInputTokens":678144,"inputTokens":86808,"model":"gpt-6-astra","outputTokens":12298,"runtime":"codex","turns":6,"wallClockMs":374939}}],"verification":[{"checks":[{"durationMs":1281,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.20s\nCompiler run successful!\n","passed":true},{"durationMs":2690,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/Paperclash.t.sol:PaperclashTest\n[PASS] testFuzz_ArbitraryRecipientGetsExactAmount(address,uint256) (runs: 512, μ: 99774, ~: 99909)\nLogs:\n  Bound result 365139854359951853004906808\n\n[PASS] testFuzz_InsufficientAllowanceRevertsWithoutChanges(uint256,uint256) (runs: 512, μ: 127904, ~: 128439)\nLogs:\n  Bound result 678531406172176671687407126\n  Bound result 45262598647045993686844026\n\n[PASS] testFuzz_OverdrawRevertsAndPreservesBalances(uint256,uint256) (runs: 512, μ: 142110, ~: 142348)\nLogs:\n  Bound result 16822\n  Bound result 18\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 512, μ: 96744, ~: 96916)\nLogs:\n  Bound result 157586066999190\n\n[PASS] testFuzz_TransferFromAccountsForAllowance(uint256,uint256) (runs: 512, μ: 167186, ~: 169696)\nLogs:\n  Bound result 18\n  Bound result 7\n\n[PASS] test_AllowanceCanBeReplacedAndRevoked() (gas: 180503)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 93623)\n[PASS] test_ApproveMayExceedCurrentBalance() (gas: 78414)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 12291)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 174275)\n[PASS] test_Create2FactoryReceivesEverythingWithoutExternalConfiguration() (gas: 237230)\n[PASS] test_DeployerCannotMoveHolderTokensWithoutApproval() (gas: 98256)\n[PASS] test_EntireBalanceCanMove() (gas: 78306)\n[PASS] test_EntireSupplyBelongsToDeployer() (gas: 69568)\n[PASS] test_ExactAllowanceCanBeSpentOnlyOnce() (gas: 166701)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenBalanceIsInsufficient() (gas: 113661)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenRecipientIsZero() (gas: 108814)\n[PASS] test_InfiniteAllowanceIsUnchangedAndCanBeRevoked() (gas: 245149)\n[PASS] test_LaunchDistributionClaimsAndTradingTransfersAreExact() (gas: 409308)\n[PASS] test_MetadataAndSocialLink() (gas: 49683)\n[PASS] test_NativeEthIsRejected() (gas: 40127)\n[PASS] test_NoMintBurnAdminOrMetadataMutationEntryPoints() (gas: 1679315)\n[PASS] test_RevertWhenApproverIsZero() (gas: 33098)\n[PASS] test_RevertWhenCallerHasNoAllowanceEvenIfAnotherSpenderDoes() (gas: 108072)\n[PASS] test_RevertWhenSpenderIsZero() (gas: 32905)\n[PASS] test_RevertWhenTransferAmountIsUintMax() (gas: 45155)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 55187)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 120594)\n[PASS] test_RevertWhenTransferFromSenderIsZero() (gas: 37838)\n[PASS] test_RevertWhenTransferRecipientIsZero() (gas: 50188)\n[PASS] test_RevertWhenTransferSenderIsZero() (gas: 33122)\n[PASS] test_RevertWhenZeroTransferRecipientIsZero() (gas: 32907)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54208)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 96197)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 167362)\n[PASS] test_TransferFromOwnBalanceStillRequiresAllowance() (gas: 38442)\n[PASS] test_TransferFromToSameAccountStillConsumesAllowance() (gas: 110145)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73333)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 63892)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 20.35ms (104.88ms CPU time)\n\nRan 1 test for test/Paperclash.invariant.t.sol:PaperclashInvariantTest\n[PASS]\nPaperclashInvariantTest invariants:\n[PASS] invariant_AllAllowancesMatchTheModel\n[PASS] invariant_SupplyIsFixedAndAllBalancesMatchTheModel\n PaperclashInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------+--------------+-------+---------+----------╮\n| Contract          | Selector     | Calls | Reverts | Discards |\n+===============================================================+\n| PaperclashHandler | approve      | 2046  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | revoke       | 2074  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | transfer     | 2075  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | transferFrom | 1997  | 0       | 0        |\n╰-------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 610168816367520\n  Bound result 283827429032050832724431176\n  Bound result 0\n  Bound result 0\n  Bound result 18662740379706388989\n  Bound result 0\n  Bound result 825706437731338807545105829\n  Bound result 1\n  Bound result 16\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 783087680246161718198453946\n  Bound result 0\n  Bound result 5140\n  Bound result 940520603378589862190127639\n  Bound result 1000000000\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 1752\n  Bound result 957625571\n  Bound result 117300739\n  Bound result 6\n  Bound result 917264578\n  Bound result 3658\n  Bound result 3\n  Bound result 5083\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.57s (2.57s CPU time)\n\nRan 2 test suites in 2.58s (2.59s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":44,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Paperclash.approve(address,uint256)\",\"Paperclash.transfer(address,uint256)\",\"Paperclash.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":139,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/Paperclash.sol\":20,\"test/Paperclash.invariant.t.sol\":122,\"test/Paperclash.t.sol\":482},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"393004a0ef2d76670791890c11d803e08cfb2602800611a9cd91c63d11ae6a60","verifiedTreeHash":"19dbb55485627850456e8d9b6b7fe7efa5799949","verifierVersion":"0.1.0+f3653923"},{"checks":[{"durationMs":1178,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.09s\nCompiler run successful!\n","passed":true},{"durationMs":2538,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/Paperclash.t.sol:PaperclashTest\n[PASS] testFuzz_ArbitraryRecipientGetsExactAmount(address,uint256) (runs: 512, μ: 99774, ~: 99909)\nLogs:\n  Bound result 23\n\n[PASS] testFuzz_InsufficientAllowanceRevertsWithoutChanges(uint256,uint256) (runs: 512, μ: 127904, ~: 128439)\nLogs:\n  Bound result 14\n  Bound result 10625\n\n[PASS] testFuzz_OverdrawRevertsAndPreservesBalances(uint256,uint256) (runs: 512, μ: 142110, ~: 142348)\nLogs:\n  Bound result 12059403040371851\n  Bound result 78612899076400\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 512, μ: 96744, ~: 96916)\nLogs:\n  Bound result 180923338414242955203045720\n\n[PASS] testFuzz_TransferFromAccountsForAllowance(uint256,uint256) (runs: 512, μ: 167186, ~: 169696)\nLogs:\n  Bound result 78612899076400\n  Bound result 31629481682498\n\n[PASS] test_AllowanceCanBeReplacedAndRevoked() (gas: 180503)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 93623)\n[PASS] test_ApproveMayExceedCurrentBalance() (gas: 78414)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 12291)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 174275)\n[PASS] test_Create2FactoryReceivesEverythingWithoutExternalConfiguration() (gas: 237230)\n[PASS] test_DeployerCannotMoveHolderTokensWithoutApproval() (gas: 98256)\n[PASS] test_EntireBalanceCanMove() (gas: 78306)\n[PASS] test_EntireSupplyBelongsToDeployer() (gas: 69568)\n[PASS] test_ExactAllowanceCanBeSpentOnlyOnce() (gas: 166701)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenBalanceIsInsufficient() (gas: 113661)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenRecipientIsZero() (gas: 108814)\n[PASS] test_InfiniteAllowanceIsUnchangedAndCanBeRevoked() (gas: 245149)\n[PASS] test_LaunchDistributionClaimsAndTradingTransfersAreExact() (gas: 409308)\n[PASS] test_MetadataAndSocialLink() (gas: 49683)\n[PASS] test_NativeEthIsRejected() (gas: 40127)\n[PASS] test_NoMintBurnAdminOrMetadataMutationEntryPoints() (gas: 1679315)\n[PASS] test_RevertWhenApproverIsZero() (gas: 33098)\n[PASS] test_RevertWhenCallerHasNoAllowanceEvenIfAnotherSpenderDoes() (gas: 108072)\n[PASS] test_RevertWhenSpenderIsZero() (gas: 32905)\n[PASS] test_RevertWhenTransferAmountIsUintMax() (gas: 45155)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 55187)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 120594)\n[PASS] test_RevertWhenTransferFromSenderIsZero() (gas: 37838)\n[PASS] test_RevertWhenTransferRecipientIsZero() (gas: 50188)\n[PASS] test_RevertWhenTransferSenderIsZero() (gas: 33122)\n[PASS] test_RevertWhenZeroTransferRecipientIsZero() (gas: 32907)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54208)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 96197)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 167362)\n[PASS] test_TransferFromOwnBalanceStillRequiresAllowance() (gas: 38442)\n[PASS] test_TransferFromToSameAccountStillConsumesAllowance() (gas: 110145)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73333)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 63892)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 18.44ms (93.34ms CPU time)\n\nRan 1 test for test/Paperclash.invariant.t.sol:PaperclashInvariantTest\n[PASS]\nPaperclashInvariantTest invariants:\n[PASS] invariant_AllAllowancesMatchTheModel\n[PASS] invariant_SupplyIsFixedAndAllBalancesMatchTheModel\n PaperclashInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------+--------------+-------+---------+----------╮\n| Contract          | Selector     | Calls | Reverts | Discards |\n+===============================================================+\n| PaperclashHandler | approve      | 2046  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | revoke       | 2074  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | transfer     | 2075  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| PaperclashHandler | transferFrom | 1997  | 0       | 0        |\n╰-------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 610168816367520\n  Bound result 283827429032050832724431176\n  Bound result 0\n  Bound result 0\n  Bound result 18662740379706388989\n  Bound result 0\n  Bound result 825706437731338807545105829\n  Bound result 1\n  Bound result 16\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 783087680246161718198453946\n  Bound result 0\n  Bound result 5140\n  Bound result 940520603378589862190127639\n  Bound result 1000000000\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 1752\n  Bound result 957625571\n  Bound result 117300739\n  Bound result 6\n  Bound result 917264578\n  Bound result 3658\n  Bound result 3\n  Bound result 5083\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.44s (2.43s CPU time)\n\nRan 2 test suites in 2.44s (2.45s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Paperclash.approve(address,uint256)\",\"Paperclash.transfer(address,uint256)\",\"Paperclash.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":139,\"foundry.toml\":21,\"remappings.txt\":2,\"src/Paperclash.sol\":20,\"test/Paperclash.invariant.t.sol\":122,\"test/Paperclash.t.sol\":482},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":382,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":209,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Paperclash.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d185748d889620d2a1ebaa1b806707588f0acd9696839506e5b9e509786e92c6","verifiedTreeHash":"0d74b144d428d638bee3ba8d560527db7ab6e19b","verifierVersion":"0.1.0+f3653923"},{"checks":[{"durationMs":1506,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.43s\nCompiler run successful!\n","passed":true},{"durationMs":11730,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/Paperclash.t.sol:PaperclashTest\n[PASS] testFuzz_ArbitraryRecipientGetsExactAmount(address,uint256) (runs: 512, μ: 99752, ~: 99909)\nLogs:\n  Bound result 773514815805195823924095852\n\n[PASS] testFuzz_InsufficientAllowanceRevertsWithoutChanges(uint256,uint256) (runs: 512, μ: 127793, ~: 128439)\nLogs:\n  Bound result 2\n  Bound result 874396463175265487335237077\n\n[PASS] testFuzz_OverdrawRevertsAndPreservesBalances(uint256,uint256) (runs: 512, μ: 142012, ~: 142360)\nLogs:\n  Bound result 12059403040371851\n  Bound result 78612899076400\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 512, μ: 96787, ~: 96922)\nLogs:\n  Bound result 180923338414242955203045720\n\n[PASS] testFuzz_TransferFromAccountsForAllowance(uint256,uint256) (runs: 512, μ: 167000, ~: 169696)\nLogs:\n  Bound result 9488\n  Bound result 9\n\n[PASS] test_AllowanceCanBeReplacedAndRevoked() (gas: 180503)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 93623)\n[PASS] test_ApproveMayExceedCurrentBalance() (gas: 78414)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 12291)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 174275)\n[PASS] test_Create2FactoryReceivesEverythingWithoutExternalConfiguration() (gas: 237230)\n[PASS] test_DeployerCannotMoveHolderTokensWithoutApproval() (gas: 98256)\n[PASS] test_EntireBalanceCanMove() (gas: 78306)\n[PASS] test_EntireSupplyBelongsToDeployer() (gas: 69568)\n[PASS] test_ExactAllowanceCanBeSpentOnlyOnce() (gas: 166701)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenBalanceIsInsufficient() (gas: 113661)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenRecipientIsZero() (gas: 108814)\n[PASS] test_InfiniteAllowanceIsUnchangedAndCanBeRevoked() (gas: 245149)\n[PASS] test_LaunchDistributionClaimsAndTradingTransfersAreExact() (gas: 409308)\n[PASS] test_MetadataAndSocialLink() (gas: 49683)\n[PASS] test_NativeEthIsRejected() (gas: 40127)\n[PASS] test_NoMintBurnAdminOrMetadataMutationEntryPoints() (gas: 1679315)\n[PASS] test_RevertWhenApproverIsZero() (gas: 33098)\n[PASS] test_RevertWhenCallerHasNoAllowanceEvenIfAnotherSpenderDoes() (gas: 108072)\n[PASS] test_RevertWhenSpenderIsZero() (gas: 32905)\n[PASS] test_RevertWhenTransferAmountIsUintMax() (gas: 45155)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 55187)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 120594)\n[PASS] test_RevertWhenTransferFromSenderIsZero() (gas: 37838)\n[PASS] test_RevertWhenTransferRecipientIsZero() (gas: 50188)\n[PASS] test_RevertWhenTransferSenderIsZero() (gas: 33122)\n[PASS] test_RevertWhenZeroTransferRecipientIsZero() (gas: 32907)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54208)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 96197)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 167362)\n[PASS] test_TransferFromOwnBalanceStillRequiresAllowance() (gas: 38442)\n[PASS] test_TransferFromToSameAccountStillConsumesAllowance() (gas: 110145)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73333)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 63892)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 183.04ms (771.38ms CPU time)\n\nRan 13 tests for test/Paperclash.properties.t.sol:PaperclashPropertiesTest\n[PASS] testFuzz_ApprovalReplacementIsIdempotentAndIsolated(uint256,uint256) (runs: 1000, μ: 462421, ~: 463280)\n[PASS] testFuzz_FailedDelegatedOverdrawRestoresEveryAllowance(uint256,uint256,uint256,bool) (runs: 1000, μ: 313205, ~: 311222)\nLogs:\n  Bound result 12799240\n  Bound result 31040582215443758537834322748657937002034471914714551365\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n\n[PASS] testFuzz_FailedZeroRecipientTransferRestoresAllowance(uint256,uint256) (runs: 1000, μ: 178890, ~: 179445)\nLogs:\n  Bound result 18428137761636588\n\n[PASS] testFuzz_RepeatedRoundTripsPreserveBothHolders(uint256,uint256,uint8) (runs: 1000, μ: 1583089, ~: 1428677)\nLogs:\n  Bound result 14\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_ReturnedTokensDoNotRestoreSpentAllowance(uint256) (runs: 1000, μ: 329397, ~: 328811)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_SplitDelegatedTransfersEqualOneSpend(uint256,uint256,uint256) (runs: 1000, μ: 397862, ~: 400175)\nLogs:\n  Bound result 42000000000000000000\n  Bound result 101\n  Bound result 115792089237316195423570985008687907853269984665640564039415584007913129639954\n\n[PASS] testFuzz_SplitTransfersEqualOneTransfer(uint256,uint256) (runs: 1000, μ: 272861, ~: 274313)\nLogs:\n  Bound result 4\n  Bound result 0\n\n[PASS] test_HolderCanUseSelfApprovalButCannotReuseIt() (gas: 215387)\n[PASS] test_InfiniteApprovalCannotOverdrawAndWorksAgainAfterRefill() (gas: 409404)\n[PASS] test_LargestFiniteAllowanceDecrementsAfterReplacingInfiniteApproval() (gas: 280632)\n[PASS] test_OneBaseUnitCanBeMovedApprovedAndReturned() (gas: 419115)\n[PASS] test_SelfTransfersStillRejectAnOverdraw() (gas: 195578)\n[PASS] test_ZeroDelegatedTransferEmitsTransferAndPreservesExistingAllowance() (gas: 175893)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 183.08ms (1.21s CPU time)\n\nRan 2 tests for test/Paperclash.invariant.t.sol:PaperclashInvariantTest\n[PASS]\nPaperclashInvariantTest invariants:\n[PASS] invariant_AllAllowancesMatchTheModel\n[PASS] invariant_MetadataNeverChanges\n[PASS] invariant_SupplyIsFixedAndAllBalancesMatchTheModel\n PaperclashInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+--------------------+-------+---------+----------╮\n| Contract          | Selector           | Calls | Reverts | Discards |\n+=====================================================================+\n| PaperclashHandler | approve            | 4192  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | invalidApproval    | 4146  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | invalidTransfer    | 4139  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | revoke             | 4029  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | roundTrip          | 4150  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | transfer           | 4079  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | transferFrom       | 3962  | 0       | 0        |\n|-------------------+--------------------+-------+---------+----------|\n| PaperclashHandler | transferFromToZero | 4071  | 0       | 0        |\n╰-------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 84152321478307644903844815546003245832466246\n  Bound result 2704\n  Bound result 277403835586309328463198096081265133407816\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 32845192696942817001243437362861082892068797925875092\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 40000000000000000000\n  Bound result 11258886646823222346658552\n  Bound result 2\n  Bound result 3480\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639575298344230831135476303746\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 9947\n  Bound result 0\n  Bound result 0\n  Bound result 102823614767264391327285752622018313889814176072683466439253364551147558086182\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 930894927847094427519928219\n  Bound result 266\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 0\n  Bound result 4104\n  Bound result 0\n  Bound result 1\n  Bound result 10866681772859682373063636\n  Bound result 548\n  Bound result 2\n  Bound result 60000000000000000000\n  Bound result 7870\n  Bound result 115792089237316195423570985008687907853269984665640552780612937184690782981389\n  Bound result 815\n  Bound result 15\n  Bound result 86707706345916\n  Bound result 1\n  Bound result 3\n  Bound result 6713\n  Bound result 11\n  Bound result 1000000000000000000000000000\n  Bound result 498\n  Bound result 2350\n  Bound result 18\n  Bound result 6846\n  Bound result 0\n  Bound result 0\n  Bound result 68\n  Bound result 4553\n  Bound result 0\n  Bound result 486\n  Bound result 0\n\n[PASS] test_HandlerExercisesStatefulBoundaries() (gas: 13369685)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 1\n  Bound result 999999999999999999999999999\n  Bound result 999999999999999999999999999\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.63s (11.64s CPU time)\n\nRan 3 test suites in 11.63s (12.00s CPU time): 54 tests passed, 0 failed, 0 skipped (54 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Paperclash.approve(address,uint256)\",\"Paperclash.transfer(address,uint256)\",\"Paperclash.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":139,\"foundry.toml\":21,\"remappings.txt\":2,\"src/Paperclash.sol\":20,\"test/PROPERTIES.md\":60,\"test/Paperclash.invariant.t.sol\":255,\"test/Paperclash.properties.t.sol\":239,\"test/Paperclash.t.sol\":482},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f232a0e180a52a90a340b2de7b0152af1d4dfcd4de3494cf2d4199e248f6262b","verifiedTreeHash":"6ca36a9d98fc847d2bdb39bc1a6bf6523785ea66","verifierVersion":"0.1.0+f3653923"}]}