{"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":"b7ca1133-f529-4bdd-be70-5c190d37f8a5","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2b8faa0757c3c07eee78d854c6adc88c77150ff876b61ed1b673f81e80d9b8d0","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"6ac2f11fa0a49017d3d4c90076f949d713f82d8ef0da47b7611a1bda34f55d18","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"b588831a07b313eed215b2dca3a27d62ed35297dea1386c3431928eaa6bf0a10","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"eef63ee70ac6b67765a99d6114c2b7b65ce7bd469e1aa765e481716db77e7aca","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d1fd78af4ee7767e63a4ec378d462563a00f3cc2e89791cc376b424d7b64cc3b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"4bb34226ba791f901224815ef5eee4401af94569d528b027859c29e062eb6ba4","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"4486a75f9ad8a38883ac114fb7a4c7208021e4c778e7b06a64e6a64bb018a051","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"48d5ee7abb8d43a024633bf089b80e196050b558aef722367580ae885d4d214b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: paperbird (PAPERBIR).\nToken name: paperbird\nToken symbol: PAPERBIR\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: X:x.com/paperbird_lol\nwebsite：paperbird.lol\n🐣 a flappy bird inspired frontend","parentJobId":null,"planHash":"deb2d14c95dd2034347fadec2785ade5960d1f5a2d6e8c9c0fb9fd011109cb2b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"b7ca1133-f529-4bdd-be70-5c190d37f8a5","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2161-paperbird"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52286","feedbackHash":"a038d7655d6196683212c05e9d9bf8600ce719db03b689768e4f33587f64d984","nodeKey":"audit_economics","submissionHash":"2b8faa0757c3c07eee78d854c6adc88c77150ff876b61ed1b673f81e80d9b8d0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52137","feedbackHash":"451c434f53ff359018f3b106e0151db18dbe549da97cda7207da708d503929ba","nodeKey":"audit_flow","submissionHash":"6ac2f11fa0a49017d3d4c90076f949d713f82d8ef0da47b7611a1bda34f55d18","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50952","feedbackHash":"6bf5cbb5f124c0b8e4fcb5c676abec680eeead03ebff1351bc36cfbd474258f2","nodeKey":"audit_judge","submissionHash":"b588831a07b313eed215b2dca3a27d62ed35297dea1386c3431928eaa6bf0a10","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51298","feedbackHash":"bb69c3f7814c73336f26d240311ee72f858752afd69b6498ac4968c0e16dd2b8","nodeKey":"audit_math","submissionHash":"eef63ee70ac6b67765a99d6114c2b7b65ce7bd469e1aa765e481716db77e7aca","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52130","feedbackHash":"d3c7345fe60b9c5a37c7caf73d3e318670f122ee75f12aaf03d29c0c7f7e7d0d","nodeKey":"audit_permissions","submissionHash":"d1fd78af4ee7767e63a4ec378d462563a00f3cc2e89791cc376b424d7b64cc3b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51382","feedbackHash":"8885c482ea2c28089cd54846a690d9a1aa351d001d308419afcb9e1b9171ce7d","nodeKey":"build_contract_project","submissionHash":"4bb34226ba791f901224815ef5eee4401af94569d528b027859c29e062eb6ba4","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52277","feedbackHash":"2032851c8bfb7f5b60986fb58aaa8d42fab69a61362210179f8e8d11f636c502","nodeKey":"manifest","submissionHash":"4486a75f9ad8a38883ac114fb7a4c7208021e4c778e7b06a64e6a64bb018a051","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51141","feedbackHash":"7abd1146f4d6c421d0ce396e9ff790bb5afa3ac70d941603b30ee81a7447aa02","nodeKey":"write_foundry_tests","submissionHash":"48d5ee7abb8d43a024633bf089b80e196050b558aef722367580ae885d4d214b","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d8f438bdd6394c88ea4dec25f01f3fa38e5ddd6bc0462e9dc9a0b07a2df619cd","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fcb71e606c933181","findings":[],"hash":"2b8faa0757c3c07eee78d854c6adc88c77150ff876b61ed1b673f81e80d9b8d0","nodeId":"90252ac0-2396-4a7d-bfab-934c54693bca","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree has no other changes.\n\n**Result: no defects found.** `.imd-findings.json` holds an empty findings list and 11 coverage rows, one for each of the six entry points plus the invariants and dependency checks I ran.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides**\n\n- **The token has no custom logic** beyond a one-time constructor mint of exactly 1e27 units to the deployer and a `decimals()` override returning 18. No owner, minter, pause, blocklist, fee, hook or upgrade path exists, so the floor's prohibited privileged calls have nothing to reach.\n- **Dependency integrity.** I downloaded the upstream OpenZeppelin v5.4.0 release and compared all 226 vendored contract files byte for byte. They are identical, so the inherited ERC20, Burnable and Permit behaviour is the audited upstream code.\n- **Launch flow conservation.** A scratch test replayed the launch as the factory performs it: 10% to the distributor, claims draining it to zero, 60% seed, a trader round trip, and the 30% remainder. Every leg moved exactly the stated amount and total supply was unchanged.\n- **Invariants.** A stateful fuzz run over transfer, approve, transferFrom, burn and burnFrom with six actors holding the whole supply kept sum of balances equal to total supply, and total supply equal to the initial mint minus recorded burns, for the full run.\n- **Holder protection.** The deployer (the factory at launch) cannot `burnFrom` or `transferFrom` a holder without an allowance. A permit grants only the signed value, cannot be replayed, and `burnFrom` beyond it reverts.\n- **Static analysis lead.** The aderyn large-numeric-literal note on line 36 is a compile-time constant verified equal to 1e27 by the existing tests. It is stylistic, not a defect.\n\n**Not reachable in this review.** No `launch.json` exists yet, so the manifest could not be inspected. The Uniswap v4 protected floor test could not be executed locally because v4-core is not vendored. The plain-transfer simulation covers the same value flows, and the README's economics (poolBps 6000, 800 IMD opening cap, remainder address) match the job and are not encoded in the token.","treeHash":null,"usage":{"cachedInputTokens":870733,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":14217,"runtime":"claude","turns":24,"wallClockMs":256671}},{"artifacts":[],"attempt":1,"bundleHash":"5c7c20e03bd7bf892d59e760d5dac77c48b4a0b789788e46adb3407889196106","device":"06c32862bedacb46","findings":[],"hash":"4486a75f9ad8a38883ac114fb7a4c7208021e4c778e7b06a64e6a64bb018a051","nodeId":"34de0695-66e2-4b5e-bd9a-12e9d9a8a5d5","outcome":"completed","summary":"Created `launch.json` matching `PaperbirdToken`, its exact supply, empty constructor arguments, and required pool and economics values.\n\n`forge build` succeeded. All 37 tests passed with the supplied fuzz seed. Only `launch.json` changed.","treeHash":"f47b1f5bc0bb90a31dd22ff30a5feaf804584bab","usage":{"cachedInputTokens":137121,"inputTokens":33903,"model":"gpt-6.1-sol","outputTokens":2080,"runtime":"codex","turns":3,"wallClockMs":44473}},{"artifacts":[],"attempt":1,"bundleHash":"d090227f4e21a0e26ad192dd9791d2ffdbda642a05545b055abb3df6a1672b93","device":"7d454e6cee88c390","findings":[],"hash":"48d5ee7abb8d43a024633bf089b80e196050b558aef722367580ae885d4d214b","nodeId":"27d881f6-55d1-4e18-a990-c2224e3ef04d","outcome":"completed","summary":"I added two test files to the existing suite and found no defects in the token. All 65 tests pass (`forge build` and `forge test` with the verifier's fuzz seed, 0 failed, 0 skipped). The only new files are the two tests below. Nothing was left outside `test/`, and I didn't write a findings file because there was nothing to report.\n\n**`test/PaperbirdToken.invariant.t.sol`** runs random call sequences against the token. A handler contract calls `transfer`, `approve`, `transferFrom`, `burn`, `burnFrom`, `permit` and time jumps, using five accounts. It keeps its own record of what every balance, allowance and permit counter should be. It also makes calls that ought to fail on purpose (amounts one over the limit, a reused or expired permit, the wrong signer) and checks that each one reverts and changes nothing. After every step it checks that:\n- all balances add up to the total supply;\n- the supply equals 1,000,000,000 minus what was burned, and never goes above it;\n- each balance, allowance and permit counter matches the handler's record;\n- no tokens end up at the token itself, the handler, the test contract or the zero address;\n- name, symbol and decimals never change.\n\nA final check confirms each run actually changed state, so the checks aren't passing on nothing. It ran 256 runs of 64 calls each (16,384 calls); the run counts are set inside the test file.\n\n**`test/PaperbirdToken.edges.t.sol`** adds 27 tests for limits and failure cases the existing tests didn't cover:\n- **Amounts:** moving the whole supply, one more than the supply, and the maximum possible number; a 1-wei transfer; burning the whole supply and then having nothing left to move.\n- **Allowances:** an unlimited allowance used for `burnFrom`; `burnFrom` beyond the balance; approving again replaces the old amount rather than adding to it; revoking an allowance; spending an allowance down to exactly zero; `transferFrom` to the zero address leaves the allowance untouched.\n- **Permit (signed approvals):** a signature used at exactly its deadline still works; one naming the zero address as spender is rejected without using up the signer's counter; altered, garbage or zero-owner signatures are rejected; a signature for another deployment doesn't work; the signing domain details are correct.\n- **Launch flows:** the 10% swarm share, the pool seed and the remainder each arrive in full, and payouts out of the distributor arrive in full.\n- **Fuzz tests:** random inputs for `burnFrom`, transfers between other accounts, and permit.\n\nThe token is a plain OpenZeppelin ERC-20 with burning and permit, and it has no owner. Burning can only shrink the supply, and `burnFrom` needs the holder's approval, so nobody else can burn or move a holder's tokens. I left the existing tests as they were.","treeHash":"7056640eda8dae7995fdec14b137eaaeb388da2f","usage":{"cachedInputTokens":521828,"inputTokens":22,"model":"claude-opus-5-5","outputTokens":17808,"runtime":"claude","turns":13,"wallClockMs":193175}},{"artifacts":[],"attempt":1,"bundleHash":"de7189999757e414c0f8a31d0cac64063c7e31388419546bf75281576fce4c3d","device":"85f29f4c09dba910","findings":[],"hash":"4bb34226ba791f901224815ef5eee4401af94569d528b027859c29e062eb6ba4","nodeId":"d15de7ba-e94f-43ff-9cc5-df91eec43716","outcome":"completed","summary":"Done. The paperbird token project is built, verified and committed on `main` as commit `bab49d5`.\n\n**What was delivered**\n\n- `src/PaperbirdToken.sol`: a fixed-supply ERC-20 named `paperbird`, symbol `PAPERBIR`, 18 decimals. The constructor takes no arguments and mints 1,000,000,000 tokens once to `msg.sender`, which is the IMD factory at launch. It composes OpenZeppelin v5.4.0 `ERC20`, `ERC20Burnable` and `ERC20Permit`. There is no owner, mint, pause, blocklist, fee or upgrade path, so the supply can only ever shrink and no privileged hand can move or freeze a holder. The Solidity name is 14 characters, within the manifest's limit.\n- `test/PaperbirdToken.t.sol` and `test/DeployPaperbird.t.sol`: 37 tests covering metadata, the one-time mint, exact transfers, allowances, burn and burnFrom, permit success and failure paths (expired, wrong signer, replay, wrong chain), a sweep of mint and privileged-call selectors that must all revert, an opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT, and four fuzz properties.\n- `script/DeployPaperbird.s.sol`: a review-only script whose `deploy()` function is tested directly. It reads no environment and takes no configuration.\n- `foundry.toml` pins `solc = \"0.8.26\"`, `bytecode_hash = \"none\"`, cancun, optimizer on, ffi off, no filesystem permissions.\n- `lib/`: forge-std v1.9.7 and OpenZeppelin v5.4.0 vendored as ordinary files from release tarballs. No submodules.\n- `README.md`: assumptions, the launch's deployment parameters and economics, an empty \"After launch\" section, and operational responsibilities.\n\n**Checks**\n\n`forge build`, `forge test` with the verifier's fuzz seed, and `forge fmt --check` all pass. A scratch test replicating the floor's flow (CREATE2 from an etched factory, 10% to the distributor and claimed whole, the privileged-call sweep from the factory) also passed before I removed it.\n\n**One sandbox artefact to know about**\n\nThe sandbox bind-mounted a nested `lib/openzeppelin-contracts/.gitmodules` read-only during the initial `forge install`, so it cannot be deleted. It is not staged or committed, and git only honours the root `.gitmodules`, which this repository does not have. The commit contains no submodule entries.\n\n**Open item for the requester**\n\nBurning was included as a holder-only convenience. If a strictly constant supply is preferred, removing `ERC20Burnable` is a one-line change, noted in the README.","treeHash":"916d5d91cb81c920ce4112497c50ebbce779838e","usage":{"cachedInputTokens":1528408,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":30817,"runtime":"claude","turns":33,"wallClockMs":415320}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c4617da5f1fd5ce8","findings":[{"citation":"resolved","description":"Not a defect in the contract: this is the standard ERC-2612 behaviour of OpenZeppelin v5.4.0 ERC20Permit (verified byte-identical to the npm release). permit() is callable by anyone with a valid signature and consumes the owner's nonce. A signature seen in the mempool can be submitted first by a third party; the allowance is then set correctly, but the owner's own later submission of the same signature reverts with ERC2612InvalidSigner because the nonce moved. If the frontend (the brief's gasless-approval use case) sends permit and the dependent action in one transaction, that transaction reverts even though the approval already exists. Mitigation belongs to the frontend/integrator: before submitting, read allowance(owner, spender) and skip permit when it already covers the value, or submit the dependent call in a way that does not revert when permit fails. No funds are at risk and no holder balance can be moved by this; the token needs no change.","line":17,"path":"src/PaperbirdToken.sol","reproduction":"State: token deployed; owner signs Permit(owner, spender=0x1, value=5, nonce=0, deadline=now+1h). Step 1: a third party (0xBAD) calls permit(owner, 0x1, 5, deadline, v, r, s) -> succeeds, allowance(owner,0x1)=5, nonces(owner)=1. Step 2: owner submits the identical permit(...) call -> reverts (recovered signer != owner since nonce is now 1). Expected by an integrator bundling permit+action: success; actual: revert, although allowance is already 5. Reproduced in a scratch Foundry test (test_permitFrontRunMakesSecondSubmissionRevert) against the current tree.","severity":"info","snippet":"    ///      - ERC-2612 `permit` is included so a frontend (the flappy-bird site) can collect gasless approvals\n    ///        with a signature instead of a separate approve transaction.","title":"permit() can be front-run by a relayer; a frontend that bundles permit with a follow-up action must tolerate the permit reverting while the allowance is already set"}],"hash":"6ac2f11fa0a49017d3d4c90076f949d713f82d8ef0da47b7611a1bda34f55d18","nodeId":"2602c7f4-3daf-4f7d-9442-9e3075359b7d","outcome":"completed","summary":"The review is complete and the findings file is written. No defects were found in the assigned area.\n\n**Result:** `.imd-findings.json` holds one informational note and ten coverage rows. All six verifier-listed entry points are marked `holds`. The repository tree is unchanged apart from that file, and the scratch test and download directory were removed.\n\n**What I checked, per guide:**\n\n- **Execution Trace.** Traced approve, transfer, transferFrom, burn, burnFrom and permit from entry to final state through OpenZeppelin's `_update`, `_approve` and `_spendAllowance`. Every value-moving path moves exactly the stated amount with no fee, hook or callback. Failure paths revert cleanly and leave allowances untouched, including burnFrom when the allowance check passes but the balance check fails. The launch flow was emulated from a CREATE2 factory-like deployer: the whole supply lands on the deployer, the swarm share arrives whole and is claimable whole, and supply stays constant.\n- **Periphery.** Diffed the vendored OpenZeppelin and forge-std sources against the published 5.4.0 and 1.9.7 releases. Every Solidity file is byte-identical. Only documentation files differ. The base contracts the token trusts are therefore genuine.\n- **First Principles.** Checked constructor assumptions: no arguments, no external calls, supply constant evaluates to exactly 1e27, mint goes to msg.sender once. Checked permit edge cases: inclusive deadline, nonce consumed once, high-s and zero-owner signatures rejected, EIP-712 domain name matches `name()` and is bound to chain id and contract address. Unknown selectors and plain ether transfers revert.\n\n**The one note, severity info:** permit can be front-run by any relayer. The allowance is then set correctly, but the owner's own resubmission reverts because the nonce moved. This is standard ERC-2612 behaviour, not a contract defect. It matters only if the flappy-bird frontend bundles permit with a dependent action in one transaction. The frontend should read the allowance first and skip permit when it already covers the value.\n\n**Static-analysis leads:** Slither reported nothing. Aderyn's large-numeric-literal lead at line 36 is the supply constant, which evaluates correctly, so it is not a finding.\n\n**Not reached:** no launch.json exists yet, since the manifest step has not run. The README's intended values match the brief and the example manifest, and the contract name and empty constructor argument list are schema-valid.","treeHash":null,"usage":{"cachedInputTokens":586551,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":14454,"runtime":"claude","turns":26,"wallClockMs":203232}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ce6eaff570c608ab","findings":[{"citation":"resolved","description":"Reproduced the audit_flow specialist's note; it is the only specialist finding and nothing else was reported by the other three areas or the test writer, so there is nothing to merge. PaperbirdToken inherits OpenZeppelin v5.4.0 ERC20Permit unchanged (the vendored lib/openzeppelin-contracts/contracts tree was diffed against the upstream v5.4.0 release and is byte-identical apart from the omitted mocks directory). permit() is permissionless by design: any caller holding a valid signature may submit it, which consumes the owner's nonce. The allowance is set correctly and no funds move, but a second submission of the same signature (for example by the owner's own frontend transaction that bundles permit with a follow-up action) reverts with ERC2612InvalidSigner because the nonce has advanced. This is the documented ERC-2612 behaviour and not a defect in the token; the mitigation belongs to the frontend: read allowance(owner, spender) before sending permit and skip it when already covered, or make the dependent call tolerant of a reverting permit. No holder balance can be moved or frozen through this path. Kept at info as a trust/integration note for the brief's gasless-approval use case; the contract needs no change.","line":24,"path":"src/PaperbirdToken.sol","reproduction":"State: PaperbirdToken deployed by 0xFAC7; owner = vm.addr(0xA11CE) signs Permit(owner, spender=0x1, value=5, nonce=0, deadline=block.timestamp+1h) over DOMAIN_SEPARATOR(). Step 1: vm.prank(0xBAD); token.permit(owner, 0x1, 5, deadline, v, r, s) -> succeeds; allowance(owner,0x1)=5, nonces(owner)=1. Step 2: vm.prank(owner); token.permit(owner, 0x1, 5, deadline, v, r, s) -> reverts (ERC2612InvalidSigner: recovered signer != owner since the struct hash now uses nonce 1); allowance(owner,0x1) remains 5. Expected by a bundling integrator: step 2 succeeds; actual: step 2 reverts although the approval exists. Run as test/scratch/PermitFrontRun.t.sol::test_permitFrontRunMakesSecondSubmissionRevert against the current tree: passes, confirming the behaviour.","severity":"info","snippet":"contract PaperbirdToken is ERC20, ERC20Burnable, ERC20Permit {","title":"permit() signatures can be submitted by anyone first; an integrator bundling permit with a dependent call must tolerate the permit reverting while the allowance is already set (standard ERC-2612, no c"}],"hash":"b588831a07b313eed215b2dca3a27d62ed35297dea1386c3431928eaa6bf0a10","nodeId":"7be7f792-b257-4983-a96d-dedac88474da","outcome":"completed","summary":"The review is complete and the findings file is written. No tracked file was changed, and the scratch test directory was removed.\n\n**Outcome:** the paperbird token has no defect that opens a revision. The findings file holds one info-level note and a full coverage record.\n\n**What I verified**\n\n- The project builds and all 65 of its own tests pass, including the invariant suite.\n- The vendored OpenZeppelin tree is byte-identical to the upstream v5.4.0 release apart from the omitted mocks directory. forge-std matches v1.9.7 exactly.\n- The constructor mints 1e27 minor units once to msg.sender, which equals the manifest's totalSupply. Decimals, name, symbol, empty constructorArgs and the 14-character contract name all agree with launch.json.\n- Creation and runtime bytecode are well under the size limits. A runtime opcode scan found no DELEGATECALL, CALLCODE, SELFDESTRUCT or CREATE.\n- All six state-changing entry points were traced through the OpenZeppelin code and marked holds, except permit, which carries the info note below. A deployer calling burnFrom or transferFrom on a holder without allowance reverts and moves nothing, so the protected floor's privileged-hand probes cannot touch a holder.\n\n**Specialist findings**\n\n- The audit_flow note on permit front-running was the only specialist finding, so there was nothing to merge. I reproduced it in a scratch test: a relayer submits the owner's signature first, the allowance is set, and the owner's identical resubmission reverts because the nonce advanced. This is standard ERC-2612 behaviour, not a contract defect. I kept it at info with the reproduction as guidance for the frontend, which should read the allowance before sending permit.\n- The aderyn large-numeric-literal lead is style only and was dropped.\n\n**Next:** nothing is outstanding for the author. The launch can proceed to the following worker step.","treeHash":null,"usage":{"cachedInputTokens":499385,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12172,"runtime":"claude","turns":21,"wallClockMs":229848}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1c29c7c6e4cf57eb","findings":[],"hash":"d1fd78af4ee7767e63a4ec378d462563a00f3cc2e89791cc376b424d7b64cc3b","nodeId":"99f553e7-c425-40be-b60f-cb890379fe98","outcome":"completed","summary":"I found no access-control, trust-gap or asymmetry defects in `src/PaperbirdToken.sol` that I could back up with a reproduction. `.imd-findings.json` holds an empty findings list and a coverage record marking all 6 entry points `holds`, plus 2 invariant rows. I changed no project files. A clean review does not prove there are no defects.\n\n**What I checked:**\n- **Who holds power after deployment:** nobody. The contract has no owner, role system, setter, mint function, pause, blocklist, fee or upgrade path. The constructor takes no arguments, gives out no role, and mints the 1e27 supply once to `msg.sender` (the factory at launch).\n- **`burnFrom`:** it is the only function on the floor's list of privileged calls, and it checks the caller's allowance before burning. A call from the factory against a holder who never approved it reverts with `ERC20InsufficientAllowance`, so the factory cannot burn anyone's balance.\n- **`burn`, `approve`, `transfer`, `transferFrom`:** all are unmodified OpenZeppelin v5.4.0. Each only touches the caller's own balance, or an allowance the owner granted. No address skips the allowance check, and transfers move exactly the amount sent, so the launch flows (factory to distributor, distributor to claimants, pool seed and swaps) arrive whole.\n- **`permit`:** it checks the deadline, uses up a per-owner nonce, rebuilds its signing domain if the chain id or contract address changes, and rejects malformed signatures and a zero signer.\n- **Vendored OpenZeppelin:** I spot-read the key internals and found no edits. That was a read, not a byte-for-byte comparison with upstream.\n\n**Leads I dropped:**\n- The aderyn \"large numeric literal\" warning is just the supply constant `1_000_000_000 * 10 ** 18`.\n- Front-running a permit, and the classic approve race, are known properties of any ERC-20 with permit, not defects in this code.\n\nThe repo's existing suite passes (37 tests, `forge test`). I couldn't run the floor's protected tests because they import harness files that aren't in this repo; I traced their `burnFrom` and privileged-call checks by reading them instead.","treeHash":null,"usage":{"cachedInputTokens":327287,"inputTokens":16,"model":"claude-opus-5-5","outputTokens":4413,"runtime":"claude","turns":8,"wallClockMs":65444}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2d027bc56749d95c","findings":[],"hash":"eef63ee70ac6b67765a99d6114c2b7b65ce7bd469e1aa765e481716db77e7aca","nodeId":"d1b7d534-14ed-4a20-b22e-b5c6e8c843c2","outcome":"completed","summary":"The review is complete. No defects were found in the assigned area, and the report is written to `.imd-findings.json` with an empty findings list and ten coverage rows.\n\n**What I checked (Math Precision, Boundary, Numerical Gap guides)**\n\n- **Custom code surface** is one constant and one override in `src/PaperbirdToken.sol`. The supply literal evaluates to 1e27 at compile time, matches the 28-digit manifest value, and sits below the uint128 and int128 bounds Uniswap v4 uses for liquidity and balance deltas. The aderyn \"large numeric literal\" lead is that correct, named constant, not a defect.\n- **Inherited arithmetic** lives entirely in OpenZeppelin. I confirmed every file in the inheritance closure is byte-identical to the upstream v5.4.0 release archive, then traced each unchecked block: every one is preceded by the checked comparison that makes it safe.\n- **Boundary enumeration** found no external calls, no payable or fallback paths, no bytes decoding, and only OpenZeppelin's zero-address mint/burn arms as sentinel branches, all of which are guarded.\n- **Edge inputs exercised** in a scratch Foundry test (since removed): full-balance transfer, balance+1 and max-uint transfer, self-transfer, zero-value transferFrom without allowance, max and max-minus-one allowance on burnFrom, burning the entire supply to zero, permit at an inclusive deadline and at max deadline, permit for the zero owner, upper-half s and v=0 signatures, the EIP-712 domain hand-computed, and a fuzzed sum-of-balances invariant. All ten passed.\n\n**Coverage record**\n\nAll six listed entry points are marked `holds`, plus four invariant rows covering the supply constant, the mint-once property, the boundary enumeration, and the dependency integrity check.\n\n**Notes for the judge, not findings**\n\n- Zero-value `transferFrom` succeeds without an allowance and emits a Transfer event from any address. This is ERC-20 conformant OpenZeppelin behaviour and moves nothing.\n- A permit with deadline set to max never expires. This is standard ERC-2612 and the README already tells the frontend to use short deadlines.\n\nThe working tree is clean apart from the report file, and the existing 37-test suite still passes.","treeHash":null,"usage":{"cachedInputTokens":961309,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":18142,"runtime":"claude","turns":33,"wallClockMs":255168}}],"verification":[{"checks":[{"durationMs":1906,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.77s\nCompiler run successful!\n","passed":true},{"durationMs":174,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployPaperbird.t.sol:DeployPaperbirdTest\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1129491)\n[PASS] test_deployMintsTheSupplyToTheScriptsCaller() (gas: 2518033)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 21.20ms (664.08µs CPU time)\n\nRan 35 tests for test/PaperbirdToken.t.sol:PaperbirdTokenTest\n[PASS] testFuzz_burnNeverGrowsSupply(uint256,uint256) (runs: 256, μ: 127959, ~: 128530)\nLogs:\n  Bound result 483653449542462225977699645\n  Bound result 258726096073763617934637013\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93169, ~: 93542)\nLogs:\n  Bound result 6000000000000000000\n\n[PASS] testFuzz_transferFromNeverExceedsAllowance(uint256,uint256) (runs: 256, μ: 112563, ~: 124190)\nLogs:\n  Bound result 483653449542462225977699645\n  Bound result 204953356713203625353002753\n\n[PASS] testFuzz_transferRevertsBeyondBalance(uint256,uint256) (runs: 256, μ: 92985, ~: 93261)\nLogs:\n  Bound result 949736746502368853320830699\n  Bound result 965242601309068411512323598\n\n[PASS] test_approveRevertsForTheZeroSpender() (gas: 30805)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 63325)\n[PASS] test_burnFromRevertsWithoutAllowance() (gas: 101949)\n[PASS] test_burnFromSpendsAllowance() (gas: 169744)\n[PASS] test_burnRevertsBeyondBalance() (gas: 32796)\n[PASS] test_burnShrinksSupplyAndBalance() (gas: 112857)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 5969)\n[PASS] test_constructorMintsTheWholeSupplyToTheDeployerOnce() (gas: 30577)\n[PASS] test_deployerCannotBurnAHoldersTokens() (gas: 91560)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 28368)\n[PASS] test_metadata() (gas: 40566)\n[PASS] test_noMintEntryPointExists() (gas: 308674)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 317883)\n[PASS] test_permitCannotBeReplayed() (gas: 133635)\n[PASS] test_permitIsBoundToThisChainAndContract() (gas: 70097)\n[PASS] test_permitRevertsAfterTheDeadline() (gas: 50268)\n[PASS] test_permitRevertsForTheWrongSigner() (gas: 77509)\n[PASS] test_permitSetsAllowanceFromASignature() (gas: 120406)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 5396004)\n[PASS] test_tokenDoesNotAcceptEther() (gas: 37485)\n[PASS] test_transferDoesNotCallBackIntoTheReceiver() (gas: 156327)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 80763)\n[PASS] test_transferFromRevertsWhenOwnerBalanceIsInsufficient() (gas: 86350)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 33496)\n[PASS] test_transferFromSpendsAllowance() (gas: 140696)\n[PASS] test_transferMovesExactlyWhatWasSent() (gas: 89770)\n[PASS] test_transferOfZeroSucceeds() (gas: 43247)\n[PASS] test_transferRevertsToTheZeroAddress() (gas: 30795)\n[PASS] test_transferRevertsWhenBalanceIsInsufficient() (gas: 85663)\n[PASS] test_transferToSelfIsANoOp() (gas: 40880)\n[PASS] test_unlimitedAllowanceIsNotDecremented() (gas: 115988)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 21.27ms (145.33ms CPU time)\n\nRan 2 test suites in 22.04ms (42.46ms CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":76,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PaperbirdToken.approve(address,uint256)\",\"PaperbirdToken.burn(uint256)\",\"PaperbirdToken.burnFrom(address,uint256)\",\"PaperbirdToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"PaperbirdToken.transfer(address,uint256)\",\"PaperbirdToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":11,\"README.md\":118,\"foundry.toml\":24,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployPaperbird.s.sol\":28,\"src/PaperbirdToken.sol\":47,\"test/DeployPaperbird.t.sol\":34,\"test/PaperbirdToken.t.sol\":438},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4486a75f9ad8a38883ac114fb7a4c7208021e4c778e7b06a64e6a64bb018a051","verifiedTreeHash":"f47b1f5bc0bb90a31dd22ff30a5feaf804584bab","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":3565,"exitCode":0,"name":"build","output":"Compiling 46 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.43s\nCompiler run successful!\n","passed":true},{"durationMs":16057,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployPaperbird.t.sol:DeployPaperbirdTest\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1129491)\n[PASS] test_deployMintsTheSupplyToTheScriptsCaller() (gas: 2518033)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 36.86ms (658.03µs CPU time)\n\nRan 27 tests for test/PaperbirdToken.edges.t.sol:PaperbirdTokenEdgesTest\n[PASS] testFuzz_burnFromRespectsAllowanceAndBalance(uint256,uint256,uint256) (runs: 256, μ: 151996, ~: 141666)\n[PASS] testFuzz_launchFlowsArriveExact(uint256) (runs: 256, μ: 336649, ~: 337321)\n[PASS] testFuzz_permitSetsExactlyTheSignedValue(uint256,uint256) (runs: 256, μ: 165292, ~: 165603)\n[PASS] testFuzz_transferBetweenThirdParties(address,address,uint256,uint256) (runs: 256, μ: 140472, ~: 136206)\n[PASS] test_allowanceSpentExactlyToZero() (gas: 145051)\n[PASS] test_approveOverwritesRatherThanAdds() (gas: 90739)\n[PASS] test_approveToZeroRevokes() (gas: 105879)\n[PASS] test_burnFromRevertsBeyondBalanceEvenWithAllowance() (gas: 82983)\n[PASS] test_burnFromTheZeroAddressReverts() (gas: 33172)\n[PASS] test_burnFromWithUnlimitedAllowanceKeepsTheAllowance() (gas: 108778)\n[PASS] test_burnOfZeroIsANoOp() (gas: 42016)\n[PASS] test_burnTheWholeSupplyLeavesZero() (gas: 108595)\n[PASS] test_eip712Domain() (gas: 23788)\n[PASS] test_oneWeiTransfer() (gas: 75914)\n[PASS] test_permitAtExactlyTheDeadlineSucceeds() (gas: 100159)\n[PASS] test_permitForTheZeroOwnerCannotBeForged() (gas: 64383)\n[PASS] test_permitSignedForAnotherDeploymentFails() (gas: 68385)\n[PASS] test_permitThenTransferFrom() (gas: 216474)\n[PASS] test_permitToTheZeroSpenderReverts() (gas: 76297)\n[PASS] test_permitWithGarbageSignatureReverts() (gas: 59598)\n[PASS] test_permitWithMalleableHighSReverts() (gas: 66761)\n[PASS] test_selfAllowanceIsStillRequiredForTransferFrom() (gas: 33588)\n[PASS] test_transferFromOfZeroWithoutAllowanceSucceeds() (gas: 56832)\n[PASS] test_transferFromToTheZeroAddressReverts() (gas: 91334)\n[PASS] test_transferOfMaxUintReverts() (gas: 33655)\n[PASS] test_transferOfOneWeiMoreThanTheSupplyReverts() (gas: 33552)\n[PASS] test_transferOfTheWholeSupply() (gas: 101871)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 36.88ms (98.96ms CPU time)\n\nRan 35 tests for test/PaperbirdToken.t.sol:PaperbirdTokenTest\n[PASS] testFuzz_burnNeverGrowsSupply(uint256,uint256) (runs: 256, μ: 127862, ~: 128530)\nLogs:\n  Bound result 10000\n  Bound result 215\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93238, ~: 93542)\nLogs:\n  Bound result 16593\n\n[PASS] testFuzz_transferFromNeverExceedsAllowance(uint256,uint256) (runs: 256, μ: 112187, ~: 100026)\nLogs:\n  Bound result 483653449542462225977699645\n  Bound result 204953356713203625353002753\n\n[PASS] testFuzz_transferRevertsBeyondBalance(uint256,uint256) (runs: 256, μ: 92992, ~: 93271)\nLogs:\n  Bound result 77119796435747173387403382\n  Bound result 606158739749425014914941598\n\n[PASS] test_approveRevertsForTheZeroSpender() (gas: 30805)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 63325)\n[PASS] test_burnFromRevertsWithoutAllowance() (gas: 101949)\n[PASS] test_burnFromSpendsAllowance() (gas: 169744)\n[PASS] test_burnRevertsBeyondBalance() (gas: 32796)\n[PASS] test_burnShrinksSupplyAndBalance() (gas: 112857)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 5969)\n[PASS] test_constructorMintsTheWholeSupplyToTheDeployerOnce() (gas: 30577)\n[PASS] test_deployerCannotBurnAHoldersTokens() (gas: 91560)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 28368)\n[PASS] test_metadata() (gas: 40566)\n[PASS] test_noMintEntryPointExists() (gas: 308674)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 317883)\n[PASS] test_permitCannotBeReplayed() (gas: 133635)\n[PASS] test_permitIsBoundToThisChainAndContract() (gas: 70097)\n[PASS] test_permitRevertsAfterTheDeadline() (gas: 50268)\n[PASS] test_permitRevertsForTheWrongSigner() (gas: 77509)\n[PASS] test_permitSetsAllowanceFromASignature() (gas: 120406)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 5396004)\n[PASS] test_tokenDoesNotAcceptEther() (gas: 37485)\n[PASS] test_transferDoesNotCallBackIntoTheReceiver() (gas: 156327)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 80763)\n[PASS] test_transferFromRevertsWhenOwnerBalanceIsInsufficient() (gas: 86350)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 33496)\n[PASS] test_transferFromSpendsAllowance() (gas: 140696)\n[PASS] test_transferMovesExactlyWhatWasSent() (gas: 89770)\n[PASS] test_transferOfZeroSucceeds() (gas: 43247)\n[PASS] test_transferRevertsToTheZeroAddress() (gas: 30795)\n[PASS] test_transferRevertsWhenBalanceIsInsufficient() (gas: 85663)\n[PASS] test_transferToSelfIsANoOp() (gas: 40880)\n[PASS] test_unlimitedAllowanceIsNotDecremented() (gas: 115988)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 36.89ms (82.76ms CPU time)\n\nRan 1 test for test/PaperbirdToken.invariant.t.sol:PaperbirdInvariantTest\n[PASS]\nPaperbirdInvariantTest invariants:\n[PASS] invariant_allowancesAndNoncesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_metadataIsFixed\n[PASS] invariant_noTokensLeakOutsideTheActors\n[PASS] invariant_sumOfBalancesEqualsTotalSupply\n[PASS] invariant_supplyIsInitialMinusBurned\n PaperbirdInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+--------------+-------+---------+----------╮\n| Contract         | Selector     | Calls | Reverts | Discards |\n+==============================================================+\n| PaperbirdHandler | approve      | 2257  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| PaperbirdHandler | burn         | 2306  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| PaperbirdHandler | burnFrom     | 2423  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| PaperbirdHandler | permit       | 2259  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| PaperbirdHandler | transfer     | 2386  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| PaperbirdHandler | transferFrom | 2417  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| PaperbirdHandler | warp         | 2336  | 0       | 0        |\n╰------------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.89s (15.89s CPU time)\n\nRan 4 test suites in 15.90s (16.01s CPU time): 65 tests passed, 0 failed, 0 skipped (65 total tests)\n","passed":true},{"durationMs":79,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PaperbirdToken.approve(address,uint256)\",\"PaperbirdToken.burn(uint256)\",\"PaperbirdToken.burnFrom(address,uint256)\",\"PaperbirdToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"PaperbirdToken.transfer(address,uint256)\",\"PaperbirdToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":11,\"README.md\":118,\"foundry.toml\":24,\"remappings.txt\":2,\"script/DeployPaperbird.s.sol\":28,\"src/PaperbirdToken.sol\":47,\"test/DeployPaperbird.t.sol\":34,\"test/PaperbirdToken.edges.t.sol\":387,\"test/PaperbirdToken.invariant.t.sol\":308,\"test/PaperbirdToken.t.sol\":438},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"48d5ee7abb8d43a024633bf089b80e196050b558aef722367580ae885d4d214b","verifiedTreeHash":"7056640eda8dae7995fdec14b137eaaeb388da2f","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":1073,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 999.67ms\nCompiler run successful!\n","passed":true},{"durationMs":88,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployPaperbird.t.sol:DeployPaperbirdTest\n[PASS] test_creationCodeTakesNoConstructorArguments() (gas: 1129491)\n[PASS] test_deployMintsTheSupplyToTheScriptsCaller() (gas: 2518033)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.60ms (460.23µs CPU time)\n\nRan 35 tests for test/PaperbirdToken.t.sol:PaperbirdTokenTest\n[PASS] testFuzz_burnNeverGrowsSupply(uint256,uint256) (runs: 256, μ: 127959, ~: 128530)\nLogs:\n  Bound result 3000000000000000000\n  Bound result 10216\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93169, ~: 93542)\nLogs:\n  Bound result 6000000000000000000\n\n[PASS] testFuzz_transferFromNeverExceedsAllowance(uint256,uint256) (runs: 256, μ: 112563, ~: 124190)\nLogs:\n  Bound result 483653449542462225977699645\n  Bound result 204953356713203625353002753\n\n[PASS] testFuzz_transferRevertsBeyondBalance(uint256,uint256) (runs: 256, μ: 92985, ~: 93261)\nLogs:\n  Bound result 949736746502368853320830699\n  Bound result 965242601309068411512323598\n\n[PASS] test_approveRevertsForTheZeroSpender() (gas: 30805)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 63325)\n[PASS] test_burnFromRevertsWithoutAllowance() (gas: 101949)\n[PASS] test_burnFromSpendsAllowance() (gas: 169744)\n[PASS] test_burnRevertsBeyondBalance() (gas: 32796)\n[PASS] test_burnShrinksSupplyAndBalance() (gas: 112857)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 5969)\n[PASS] test_constructorMintsTheWholeSupplyToTheDeployerOnce() (gas: 30577)\n[PASS] test_deployerCannotBurnAHoldersTokens() (gas: 91560)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 28368)\n[PASS] test_metadata() (gas: 40566)\n[PASS] test_noMintEntryPointExists() (gas: 308674)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 317883)\n[PASS] test_permitCannotBeReplayed() (gas: 133635)\n[PASS] test_permitIsBoundToThisChainAndContract() (gas: 70097)\n[PASS] test_permitRevertsAfterTheDeadline() (gas: 50268)\n[PASS] test_permitRevertsForTheWrongSigner() (gas: 77509)\n[PASS] test_permitSetsAllowanceFromASignature() (gas: 120406)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 5396004)\n[PASS] test_tokenDoesNotAcceptEther() (gas: 37485)\n[PASS] test_transferDoesNotCallBackIntoTheReceiver() (gas: 156327)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 80763)\n[PASS] test_transferFromRevertsWhenOwnerBalanceIsInsufficient() (gas: 86350)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 33496)\n[PASS] test_transferFromSpendsAllowance() (gas: 140696)\n[PASS] test_transferMovesExactlyWhatWasSent() (gas: 89770)\n[PASS] test_transferOfZeroSucceeds() (gas: 43247)\n[PASS] test_transferRevertsToTheZeroAddress() (gas: 30795)\n[PASS] test_transferRevertsWhenBalanceIsInsufficient() (gas: 85663)\n[PASS] test_transferToSelfIsANoOp() (gas: 40880)\n[PASS] test_unlimitedAllowanceIsNotDecremented() (gas: 115988)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 13.16ms (47.57ms CPU time)\n\nRan 2 test suites in 13.82ms (20.76ms CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PaperbirdToken.approve(address,uint256)\",\"PaperbirdToken.burn(uint256)\",\"PaperbirdToken.burnFrom(address,uint256)\",\"PaperbirdToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"PaperbirdToken.transfer(address,uint256)\",\"PaperbirdToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":11,\"README.md\":118,\"foundry.toml\":24,\"remappings.txt\":2,\"script/DeployPaperbird.s.sol\":28,\"src/PaperbirdToken.sol\":47,\"test/DeployPaperbird.t.sol\":34,\"test/PaperbirdToken.t.sol\":438},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1349,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":395,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PaperbirdToken.sol:36: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4bb34226ba791f901224815ef5eee4401af94569d528b027859c29e062eb6ba4","verifiedTreeHash":"916d5d91cb81c920ce4112497c50ebbce779838e","verifierVersion":"0.1.0+745c1db4"}]}