{"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":"f739e5f6-6d8c-4bd4-b092-177d083d0463","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"e8795b85b03cd548208fe9e240679eb492ebfe91b51255c3ce6ce4ae58ad520a","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":"2e787be8e492b4c694ccc5163247870c1be516a6e4492e5d84f66c260357532c","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":"06c09bea3c1ea9528ef4e5fddf0024525291754787553167cd6636e03fdd1618","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":"a096d5035f1e1e69d5dede2ff2ee6744ea156e40776a8a81396a53b0108bfb8b","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":"fe3d0f43732c75c576a1ae9e1d7e026fd23696d12df964a868c479d44ccf9423","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":"e5a2c04d81756490873b55392e53b24f28e30c4ce0773efaffffbb6ac1bcfe45","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"6c736ac0fe12f50233381148183949bcd082cb85dd0ea355be3661bbbd7575ad","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"4f5350924ede57b958e5213cf79e059ca68d0a062f1adfdc173d5057c46eb36f","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Drift Pebble (DPBL).\nToken name: Drift Pebble\nToken symbol: DPBL\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"92948593deab1a2500869062549bdd173642359d90292417e3a8aa03f555f657","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f739e5f6-6d8c-4bd4-b092-177d083d0463","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1417-drift-pebble"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52611","feedbackHash":"9505dfb3e4ee4430dcf78d6d85d5630f930248f6a9c57d4dd6686222c94c1fad","nodeKey":"audit_economics","submissionHash":"e8795b85b03cd548208fe9e240679eb492ebfe91b51255c3ce6ce4ae58ad520a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52603","feedbackHash":"a71581ce212604c5f3b1cc359c8ab4fd18dbeecbe2105c5e2d3838b6ce335e76","nodeKey":"audit_flow","submissionHash":"2e787be8e492b4c694ccc5163247870c1be516a6e4492e5d84f66c260357532c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52680","feedbackHash":"99e7ac95ad6caa99ccd424cb615d45b31eb65fae355a067ea82ed69af5d09ed9","nodeKey":"audit_judge","submissionHash":"06c09bea3c1ea9528ef4e5fddf0024525291754787553167cd6636e03fdd1618","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52255","feedbackHash":"9c641eb6331258ce68c1ff1d2dae3868baf858c75df7feff0c549813d41dae37","nodeKey":"audit_math","submissionHash":"a096d5035f1e1e69d5dede2ff2ee6744ea156e40776a8a81396a53b0108bfb8b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52479","feedbackHash":"ff221b9724da22d8b569592c64ef17bd29b27b61a35d89631cb9756bf59e6401","nodeKey":"audit_permissions","submissionHash":"fe3d0f43732c75c576a1ae9e1d7e026fd23696d12df964a868c479d44ccf9423","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51568","feedbackHash":"e98d99e39dee6361a3e74adfbead0855871551d8e2a62b1dd1119e530171e4dd","nodeKey":"build_contract_project","submissionHash":"e5a2c04d81756490873b55392e53b24f28e30c4ce0773efaffffbb6ac1bcfe45","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52211","feedbackHash":"2b677f27ca0a70aa7a4d95007428e8b7d4ccc136ed8767d8d86f88966e35ff99","nodeKey":"manifest","submissionHash":"6c736ac0fe12f50233381148183949bcd082cb85dd0ea355be3661bbbd7575ad","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51570","feedbackHash":"17671b483704b460d0d3e775243542ba79e038ca079e08d6249cfae786348008","nodeKey":"write_foundry_tests","submissionHash":"4f5350924ede57b958e5213cf79e059ca68d0a062f1adfdc173d5057c46eb36f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5a92cedeb78726a387ae66d6e9afc2dbee4475382abed9df6c2804b9305fd4ff","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d7e6877fd9e388bb","findings":[{"citation":"resolved","description":"Reproduced the audit_math specialist's finding. The dependency manifest states that all 30 vendored forge-std files are unmodified copies from the v1.9.7 archive whose SHA-256 it records. Downloading that archive (its SHA-256 matches the recorded 45157353ab49...ee94) and comparing file by file shows 23 byte-identical files and 7 that differ: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. For each of the 7, stripping all whitespace from both sides yields identical content, so the difference is a formatter pass only. forge-std is test-only and does not enter DriftPebble's creation or runtime bytecode, so the deployed token is unaffected. The 6 vendored OpenZeppelin v5.4.0 files (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol, LICENSE) were also compared and are byte-identical to the upstream archive (SHA-256 b89829be48bc...50d1 matches line 5), so the token's inherited transfer, approve and transferFrom logic is exactly the audited upstream code. Impact is limited to provenance: an offline verifier reconciling the tree against the stated 'unmodified' claim sees hashes that do not match. Fix: restore the 7 files from the archive, or reword line 11 to say the files were reformatted with forge fmt. No other specialist reported a finding, so there was nothing to merge.","line":11,"path":"DEPENDENCIES.md","reproduction":"curl -sSL -o fs.tgz https://codeload.github.com/foundry-rs/forge-std/tar.gz/refs/tags/v1.9.7; sha256sum fs.tgz -> 45157353ab49eab01d294565866731e599b32401757229689ee459aa26b7ee94 (matches DEPENDENCIES.md line 10). tar -xzf fs.tgz. For each f in lib/forge-std: cmp f forge-std-1.9.7/f. Expected per line 11: 30 of 30 identical. Actual: 23 identical, 7 differ (src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol). For each of the 7, `tr -d ' \\t\\r\\n' < file | sha256sum` is equal on both sides, so the differences are whitespace only. Same procedure on the OpenZeppelin v5.4.0 archive: all 6 vendored files byte-identical.","severity":"info","snippet":"  - 30 unmodified files copied; the Solidity `src/` tree and both licenses.","title":"DEPENDENCIES.md claims the vendored forge-std v1.9.7 files are unmodified, but 7 of 30 differ from the upstream archive (whitespace-only reformatting)"}],"hash":"06c09bea3c1ea9528ef4e5fddf0024525291754787553167cd6636e03fdd1618","nodeId":"800354ca-ff65-4780-827f-c99625cc5986","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome:** The Drift Pebble token is sound. It is an unmodified OpenZeppelin v5.4.0 ERC-20 with a parameterless constructor that mints the full supply to the deployer. I kept one informational finding and found nothing new.\n\n**Specialist findings settled**\n\n- **audit_math (info) kept.** I downloaded the forge-std v1.9.7 archive, confirmed its checksum matches the one recorded in DEPENDENCIES.md, and compared file by file. Seven of thirty vendored files differ from upstream, and all seven are identical once whitespace is stripped. The provenance line at DEPENDENCIES.md:11 is therefore inaccurate. The token's bytecode is unaffected since forge-std is test-only.\n- **OpenZeppelin provenance verified.** All six vendored OpenZeppelin files are byte-identical to the v5.4.0 archive, so the inherited transfer, approve and transferFrom logic is exactly the audited upstream code.\n- The economics, permissions and flow specialists and the independent tester reported nothing, so there were no duplicates to merge.\n\n**My own pass**\n\n- All three entry points hold. They are the stock OpenZeppelin implementations with the standard revert paths on zero addresses, insufficient balance and insufficient allowance.\n- The ABI exposes no mint, burn, owner, pause or blacklist function.\n- The runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The manifest is consistent with the code: empty constructor arguments, 18 decimals, and a total supply equal to what the constructor mints.\n- Bytecode sizes are far under the factory's limits.\n- The existing test suite of 49 tests passes, including fuzz and invariant runs.\n- Both static-analysis leads were checked. Slither reported nothing, and aderyn's large-literal note concerns a readable `1_000_000_000 * 10 ** 18` constant that equals the manifest supply.\n\n**Deliverable:** `.imd-findings.json` holds the one info finding with its reproduction, plus coverage rows for all three entry points and three additional invariants. No source or configuration files were changed.","treeHash":null,"usage":{"cachedInputTokens":369991,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":6866,"runtime":"claude","turns":8,"wallClockMs":140298}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7e64d4917fa814e6","findings":[],"hash":"2e787be8e492b4c694ccc5163247870c1be516a6e4492e5d84f66c260357532c","nodeId":"20d3ed03-b05d-4679-9552-6a3aaf47862c","outcome":"completed","summary":"The findings file is on disk, excluded from git by the harness's own rule, and no tracked file changed. The review is complete.\n\n**Result: no defects found in Drift Pebble.** The report at `.imd-findings.json` holds an empty finding list and ten coverage rows, one for each of the three listed entry points plus the constructor, the periphery, the runtime bytecode and the launch invariants.\n\n**What I covered, by guide:**\n\n- **Execution Trace.** Traced approve, transfer and transferFrom through OpenZeppelin's `_approve`, `_transfer`, `_update` and `_spendAllowance`. Every failure path reverts atomically. The only sentinel paths are `address(0)` rejection and the infinite `uint256.max` allowance, both standard and documented in the README. A transferFrom with a zero sender reverts inside the allowance step, so there is no mint route.\n- **Periphery.** The only base code is the vendored OpenZeppelin ERC20 closure. I downloaded the v5.4.0 archive, confirmed its hash matches DEPENDENCIES.md, and compared all six vendored files byte for byte. They are identical to upstream. No libraries, assembly or storage-context hazards exist.\n- **First Principles.** The constructor mints exactly 10^27 once to msg.sender with no arguments or immutables, so a CREATE2 deployment from the factory leaves the whole supply at the factory. Decimals are 18. No owner, pause, blocklist, burn or mint entry point exists, and the token has no receive or fallback.\n\n**Checks run.** The project's 33 tests pass and `forge fmt --check` is clean. My scratch tests confirmed the zero-sender path, self-transfer with infinite allowance, exact 10% and 90% custody flows with swap-shaped round trips, CREATE2 deployment from a probe, and an opcode scan showing no DELEGATECALL, CALLCODE, SELFDESTRUCT, external calls or PUSH0 in the runtime. The scratch directory was removed afterwards.\n\n**Leads dismissed.** The aderyn large-numeric-literal note is a style remark on a compile-time constant that equals the manifest supply. Slither reported nothing. The standard ERC-20 approve race is inherent to the specification and is documented in the README, so it is not reported as a defect.\n\n**Not reached.** I could not run the protected Uniswap v4 harness because its factory libraries and v4-core are not in this tree. The custody and swap-shaped flows were verified with plain transfers instead, which is sufficient for a token with no fee, exemption or callback logic.","treeHash":null,"usage":{"cachedInputTokens":649513,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13601,"runtime":"claude","turns":31,"wallClockMs":219976}},{"artifacts":[],"attempt":1,"bundleHash":"f3718c605ee4eb9f73ee42677a6f7ce5e239080d7192168cf38fc59856b3bfb3","device":"493095393c4a2a74","findings":[],"hash":"4f5350924ede57b958e5213cf79e059ca68d0a062f1adfdc173d5057c46eb36f","nodeId":"e21d5373-b2cf-4705-bb4d-955602bc49d2","outcome":"completed","summary":"Added failure-path and boundary tests, strengthened stateful invariants, and corrected administrative call probes. All changes are under `test/`.\n\nOffline `forge build` and `forge test` pass: 49 tests, including 8,000 fuzz cases and 32,768 invariant calls.\n\nNo implementation defects found.","treeHash":"1f1baf419758688854a9b9aa9c37033001c194e4","usage":{"cachedInputTokens":1029248,"inputTokens":87843,"model":"gpt-6-astra","outputTokens":13554,"runtime":"codex","turns":5,"wallClockMs":489527}},{"artifacts":[],"attempt":1,"bundleHash":"674b777ea8b8fc379a0cbdd5f701833d4de1af08163306b323fdd3cac413996b","device":"26d42bb29b53b9d8","findings":[],"hash":"6c736ac0fe12f50233381148183949bcd082cb85dd0ea355be3661bbbd7575ad","nodeId":"5d7b0f39-5863-4a9d-83a0-83665e250a24","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/f739e5f6-6d8c-4bd4-b092-177d083d0463/5d7b0f39-5863-4a9d-83a0-83665e250a24/launch.json) matching DriftPebble’s constructor, supply, and required pool/economics values.\n\nManifest consistency checks passed. `forge build` succeeded; `forge test` passed all 33 tests. Only `launch.json` changed outside permitted scratch artifacts.","treeHash":"2eb7c81f02fa797f12f89a8793d3ef4d34eb07ea","usage":{"cachedInputTokens":209664,"inputTokens":25138,"model":"gpt-6-astra","outputTokens":2243,"runtime":"codex","turns":3,"wallClockMs":84914}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e06554fd2816f9d7","findings":[{"citation":"resolved","description":"The dependency manifest claims the vendored forge-std tree is a byte-for-byte copy of the v1.9.7 archive (SHA-256 45157353ab49...ee94). Downloading that archive (its checksum matches the one in DEPENDENCIES.md) and comparing file by file shows 23 identical files and 7 that differ: src/StdAssertions.sol, src/Vm.sol, src/StdJson.sol, src/StdToml.sol, src/console.sol, src/interfaces/IMulticall3.sol, src/interfaces/IERC7540.sol. Stripping all whitespace from both sides yields identical content for each, so the difference is a formatter pass (long signatures re-wrapped, e.g. Vm.getDeployment and console.CONSOLE_ADDRESS), not a semantic change. forge-std is test-only and does not enter the token's runtime or creation bytecode, so there is no effect on the deployed DriftPebble contract. The OpenZeppelin v5.4.0 files (all 6) are byte-identical to upstream, so the arithmetic paths the token inherits are exactly the audited upstream ones. Reported because an offline verifier reconciling the tree against the stated provenance will see hashes that do not match the 'unmodified' claim. Fix: either restore the 7 files from the archive or change the wording to say the files were reformatted with forge fmt.","line":11,"path":"DEPENDENCIES.md","reproduction":"curl -sSL -o fs.tgz https://codeload.github.com/foundry-rs/forge-std/tar.gz/refs/tags/v1.9.7; sha256sum fs.tgz  -> 45157353ab49eab01d294565866731e599b32401757229689ee459aa26b7ee94 (matches DEPENDENCIES.md). tar -xzf fs.tgz; cmp forge-std-1.9.7/src/Vm.sol lib/forge-std/src/Vm.sol -> differ. sha256 upstream Vm.sol = 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1, vendored Vm.sol = a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15. Expected per DEPENDENCIES.md line 11: all 30 files identical. Actual: 7 files differ; `tr -d ' \\t\\r\\n' < file | sha256sum` is equal on both sides for every one of the 7, so the diffs are whitespace only.","severity":"info","snippet":"  - 30 unmodified files copied; the Solidity `src/` tree and both licenses.","title":"DEPENDENCIES.md states forge-std v1.9.7 files are unmodified, but 7 of the 30 vendored files differ from the upstream archive (whitespace-only reformatting)"}],"hash":"a096d5035f1e1e69d5dede2ff2ee6744ea156e40776a8a81396a53b0108bfb8b","nodeId":"8893cd0d-67eb-4bcf-970c-764a5a4d7ca3","outcome":"completed","summary":"The review is complete. The findings file is written, validated, and the working tree holds only that deliverable.\n\n**Outcome:** no math, boundary, or numerical-gap defect in Drift Pebble. One info-level provenance discrepancy is reported.\n\n**What I checked in the assigned area**\n\n- **Math Precision.** The contract's only arithmetic is the compile-time constant for one billion tokens at 18 decimals. It equals exactly 10^27, matching the manifest supply, and is minted once in the constructor. The inherited OpenZeppelin paths guard every unchecked subtraction with the bound they rely on. There is no division, rounding, downcast, or decimal mixing anywhere.\n- **Boundary.** No external calls, no payable function, no receive or fallback, no bytes decoding. Native value and unknown selectors revert. I walked every zero-address sentinel on all three entry points, plus max-uint amounts, the infinite-allowance sentinel against max minus one, and self-transfers through the unchecked block. A scratch probe of 15 tests passed, then was removed.\n- **Numerical Gap.** The 10 percent and 90 percent launch split divides 10^27 with no residue. The 2,500 IMD opening cap puts the pool tick near plus or minus 129,000 whichever way the pair sorts, well inside Uniswap v4's range. The pool share fits in the int128 and uint128 types the pool uses.\n\n**Provenance check.** The vendored OpenZeppelin v5.4.0 files are byte-identical to the upstream archive, so the arithmetic the token inherits is exactly upstream's. Seven forge-std files differ from the archive by whitespace-only reformatting, which contradicts the \"unmodified\" claim in the dependency notes. That is the single reported finding, severity info, with the file hashes as reproduction. It is test-only and does not touch the deployed bytecode.\n\n**Coverage.** All three entry points are recorded as holds, with six additional invariant and dependency rows. The existing suite of 33 tests, including the 128-run stateful invariants, passes.","treeHash":null,"usage":{"cachedInputTokens":682213,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":15399,"runtime":"claude","turns":25,"wallClockMs":252653}},{"artifacts":[],"attempt":1,"bundleHash":"295b9b31be8d74460209fd7fa7e080144e6cdd1552683491cc338158a18dc09b","device":"3111534b6da56538","findings":[],"hash":"e5a2c04d81756490873b55392e53b24f28e30c4ce0773efaffffbb6ac1bcfe45","nodeId":"42555196-ea93-4507-8726-27a74c45ac08","outcome":"completed","summary":"Implemented Drift Pebble (DPBL): 1,000,000,000 tokens, 18 decimals, minted once to the deployer. Includes vendored dependencies, success/failure tests, fuzz tests, invariants, and deployment documentation.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test` passed: 33 tests.\n- `forge fmt --check` passed.\n\nOffline verification with an empty environment also passed.","treeHash":"995bff1292ea249342a4f547991010596712111d","usage":{"cachedInputTokens":466560,"inputTokens":66564,"model":"gpt-6-astra","outputTokens":14380,"runtime":"codex","turns":5,"wallClockMs":381361}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a4ad9be53991100","findings":[],"hash":"e8795b85b03cd548208fe9e240679eb492ebfe91b51255c3ce6ce4ae58ad520a","nodeId":"f908b5a8-68c7-484d-bbe0-878726394f14","outcome":"completed","summary":"The findings file is in place at the repository root and is deliberately excluded from git by the harness's own exclude list, so the working tree stays clean. The review is complete.\n\n**Result: no defects found in the assigned area.** The review covered the Economic Security, Invariant and Flow Gap guides against `src/DriftPebble.sol`, and every entry point holds.\n\nWhat I verified:\n\n- **Source is minimal.** The token is an unmodified OpenZeppelin v5.4.0 ERC-20 plus a constructor that mints the fixed supply to the caller. I downloaded the upstream v5.4.0 archive and confirmed its hash matches the one recorded in the dependency notes, and all five vendored files are byte-identical to upstream.\n- **Supply and mint.** The constant equals the stated supply exactly, is minted once to msg.sender under CREATE2 so the factory holds it all, and nothing else can mint or burn. This also closes the aderyn large-literal lead.\n- **Conservation invariant.** I fuzzed transfers to arbitrary addresses, including the token itself and the factory, and the sum of balances always equals total supply.\n- **Flow exactness.** Round trips through distributor and pool-custody addresses return the exact amount, and the direct transfer path and the allowance path produce identical end states. With no fee, tax, exemption, callback or external dependency, the launch flows and swaps cannot arrive short.\n- **Allowance accounting.** Finite allowances cannot be over-spent, failed transfers roll back allowance and balance together, and no privileged address bypasses allowance checks.\n- **Privileged surfaces.** No owner, pause, freeze, seize, upgrade or forbidden opcodes exist. The project's own 33 tests also pass.\n\nThe report lists seven coverage rows: one per entry point, plus the constructor, the supply invariant, launch flows and the privileged-hand checks. The scratch probe tests were deleted after running, and no repository file was changed.","treeHash":null,"usage":{"cachedInputTokens":710749,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":9135,"runtime":"claude","turns":17,"wallClockMs":134353}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dfa08759ca0424de","findings":[],"hash":"fe3d0f43732c75c576a1ae9e1d7e026fd23696d12df964a868c479d44ccf9423","nodeId":"6bcbfeea-9316-4b12-ade9-d146d00b7ecf","outcome":"completed","summary":"The review is complete. No defects were found in the Access Control, Trust Gap and Asymmetry area, and the findings file records an empty list with seven coverage rows.\n\n**What was reviewed**\n\n- `src/DriftPebble.sol` is a 17-line constructor-only specialization of OpenZeppelin's ERC20. It mints 10^27 units once to msg.sender and adds no roles, modifiers, initializer, owner, hooks or fallback.\n- The five vendored OpenZeppelin files were fetched from the upstream v5.4.0 tag and compared byte for byte. All are identical, so no backdoor entered through the dependency.\n- The compiled ABI exposes only the nine ERC-20 functions plus the supply constant. An independent opcode scan of the runtime bytecode found no CALL, DELEGATECALL, CALLCODE, STATICCALL, CREATE or SELFDESTRUCT.\n- The project's own 33 tests pass, and the project files pass the formatter check.\n\n**Checks run for the three guides**\n\n- Access control: every state-changing entry point is scoped to msg.sender or to an explicit allowance. A scratch fuzz test over 512 unknown selectors reverted from both the factory and a stranger with no state change, and 512 fuzzed callers without allowance could not move a holder's balance.\n- Asymmetry: transfer and transferFrom write the same balance slots in the same direction and differ only by the allowance decrement. There is no admin variant, no exemption branch and no privileged path that treats the factory, distributor or PoolManager differently from a holder.\n- Trust gap: there is no privileged actor at all, so none of the four seams exist. The only asymmetric party is the factory as initial holder of the full supply, which is the launch design rather than a defect.\n\n**Leads not promoted**\n\n- The aderyn large-numeric-literal line is the supply constant. It evaluates to exactly 10^27, matching the manifest supply in the README.\n- The standard ERC-20 approve replacement race exists as in every OpenZeppelin token. It is inherent to the standard, documented in the README, and not a defect in this contract.\n\nThe scratch test lives under test/scratch/, which is gitignored and not kept. No tracked file was changed.","treeHash":null,"usage":{"cachedInputTokens":800174,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":14134,"runtime":"claude","turns":33,"wallClockMs":209280}}],"verification":[{"checks":[{"durationMs":1390,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.29s\nCompiler run successful!\n","passed":true},{"durationMs":11001,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/DriftPebble.t.sol:DriftPebbleTest\n[PASS] testFuzz_transferAboveBalanceAlwaysReverts(uint256) (runs: 1000, μ: 72323, ~: 72662)\nLogs:\n  Bound result 19402102807138752731180729982143117512027944684756438\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1000, μ: 98121, ~: 98531)\nLogs:\n  Bound result 597910469007878909024701802570340924222565074502\n  Bound result 19037093560000506466896788\n\n[PASS] testFuzz_transferFromAboveAllowanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 128465, ~: 128842)\nLogs:\n  Bound result 854\n  Bound result 3714247999\n\n[PASS] testFuzz_transferFromDeliversExactlyAndSpendsAllowance(uint256,uint256) (runs: 1000, μ: 169624, ~: 170336)\nLogs:\n  Bound result 31045436796627000\n  Bound result 28562038757914800861648382958285056054753850656510880439856190\n\n[PASS] test_approveEmitsEventAndReplacesAllowance() (gas: 139544)\n[PASS] test_approveZeroSpenderReverts() (gas: 40448)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 12419)\n[PASS] test_create2MintsToFactoryAndNotItsCallerOrTransactionOrigin() (gas: 240136)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 98511)\n[PASS] test_emptyAccountCannotTransfer() (gas: 38200)\n[PASS] test_entireSupplyCanMoveAndMoveBack() (gas: 154079)\n[PASS] test_exactAllowanceCanBeSpentOnlyOnce() (gas: 167030)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 194549)\n[PASS] test_launchDistributionAndPoolCustodyTransfersArriveWhole() (gas: 504936)\n[PASS] test_metadataAndEntireInitialSupply() (gas: 112809)\n[PASS] test_noMintBurnOrAdministrativeEntryPoints() (gas: 1815169)\n[PASS] test_revocationStopsSpender() (gas: 121508)\n[PASS] test_runtimeHasNoDelegationOrSelfdestruct() (gas: 1132672)\n[PASS] test_selfTransferFromConsumesAllowanceWithoutChangingBalance() (gas: 112439)\n[PASS] test_selfTransferPreservesBalance() (gas: 54155)\n[PASS] test_transferAboveBalanceRevertsAtomically() (gas: 57984)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 96308)\n[PASS] test_transferFromEmitsEventAndConsumesFiniteAllowance() (gas: 167067)\n[PASS] test_transferFromInsufficientAllowancePreservesState() (gas: 120907)\n[PASS] test_transferFromInsufficientBalanceRollsBackAllowance() (gas: 126570)\n[PASS] test_transferFromZeroRecipientRollsBackAllowance() (gas: 119149)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 174474)\n[PASS] test_transferToZeroRevertsWithoutBurning() (gas: 50446)\n[PASS] test_unapprovedCallerCannotUseAnotherSpendersAllowance() (gas: 110412)\n[PASS] test_zeroAmountTransferToZeroAlsoReverts() (gas: 33141)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73460)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78825)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 63.16ms (256.45ms CPU time)\n\nRan 16 tests for test/DriftPebble.edge.t.sol:DriftPebbleEdgeTest\n[PASS] testFuzz_failedSpendCanSucceedAfterFunding(uint256,uint256,bool) (runs: 1000, μ: 320971, ~: 320785)\nLogs:\n  Bound result 7975\n  Bound result 999999999999999999999992179\n\n[PASS] testFuzz_replacingInfiniteApprovalEnforcesNewLimit(uint256) (runs: 1000, μ: 281098, ~: 281386)\nLogs:\n  Bound result 952289485139491383381931919\n\n[PASS] testFuzz_splitTransfersEqualSingleTransfer(uint256,uint256) (runs: 1000, μ: 209644, ~: 210934)\nLogs:\n  Bound result 891702112985899613038541458\n  Bound result 0\n\n[PASS] testFuzz_transferRoundTripPreservesBalancesAndApprovals(uint256,uint256) (runs: 1000, μ: 256325, ~: 256814)\nLogs:\n  Bound result 434890289647\n\n[PASS] test_approvalCanPrecedeFundingAndIsIsolatedByOwnerAndSpender() (gas: 308768)\n[PASS] test_maximumDelegatedTransferCannotOverflowOrSpendAllowance() (gas: 134864)\n[PASS] test_maximumMinusOneIsFiniteAllowance() (gas: 190516)\n[PASS] test_maximumTransferFailsWithoutArithmeticPanic() (gas: 68512)\n[PASS] test_oneSmallestUnitTransfersWithoutRounding() (gas: 154541)\n[PASS] test_originCannotAuthorizeAnUnapprovedCaller() (gas: 234046)\n[PASS] test_ownerCallingTransferFromStillNeedsSelfAllowance() (gas: 200972)\n[PASS] test_selfTransfersStillCheckBalance() (gas: 151543)\n[PASS] test_spenderCanBeRecipientAndSpendEntireSupply() (gas: 196297)\n[PASS] test_transferFromZeroCannotMintEvenForZeroAmount() (gas: 146817)\n[PASS] test_zeroApprovalStillRejectsZeroSpender() (gas: 116024)\n[PASS] test_zeroDelegatedTransferStillRejectsZeroRecipient() (gas: 170690)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 63.13ms (243.61ms CPU time)\n\nRan 1 test for test/DriftPebble.invariant.t.sol:DriftPebbleInvariantTest\n[PASS]\nDriftPebbleInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_metadataRemainsFixed\n[PASS] invariant_supplyAndBalancesMatchModel\n DriftPebbleInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------------+----------------------------+-------+---------+----------╮\n| Contract           | Selector                   | Calls | Reverts | Discards |\n+==============================================================================+\n| DriftPebbleHandler | approve                    | 2967  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | approveAndSpend            | 2979  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | rejectSpendAboveAllowance  | 3043  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | rejectSpendAboveBalance    | 2922  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | rejectTransferAboveBalance | 2982  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | rejectZeroRecipient        | 2952  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | rejectZeroSpender          | 2920  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | revokeAndRejectSpend       | 3021  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | transfer                   | 3062  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | transferAll                | 2965  | 0       | 0        |\n|--------------------+----------------------------+-------+---------+----------|\n| DriftPebbleHandler | transferFrom               | 2955  | 0       | 0        |\n╰--------------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1751\n  Bound result 1426\n  Bound result 0\n  Bound result 11\n  Bound result 0\n  Bound result 10\n  Bound result 1751\n  Bound result 7754\n  Bound result 0\n  Bound result 3\n  Bound result 82919621486892984055028950\n  Bound result 123000000000000000000\n  Bound result 0\n  Bound result 7806\n  Bound result 4\n  Bound result 18\n  Bound result 15\n  Bound result 635\n  Bound result 2492612712258672623291\n  Bound result 0\n  Bound result 10\n  Bound result 8143\n  Bound result 6739\n  Bound result 10000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665639691545345957533329846465694\n  Bound result 674992851978124652287611291\n  Bound result 2\n  Bound result 123000000000000001763\n  Bound result 56\n  Bound result 41\n  Bound result 10\n  Bound result 0\n  Bound result 51624751709648296618761173758845496100285600680504874499968718880465\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 207314597897337512319866261\n  Bound result 3313\n  Bound result 115792089237316195423570985008687907853269984665639564039580584007913129645794\n  Bound result 6653\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039580584007913129651998\n  Bound result 115792089237316195423570985008687907853269984665640564039334584007913129628503\n  Bound result 0\n  Bound result 4\n  Bound result 115792089237316195423570985008687907853269984665640564039334584007913129639452\n  Bound result 4\n  Bound result 999999876999999999999987948\n  Bound result 912005781\n  Bound result 1112702142\n  Bound result 0\n  Bound result 33961822049764338668\n  Bound result 9462\n  Bound result 2182\n  Bound result 724097510640847214838500024\n  Bound result 115792089237316195423570985008687907853269984665639564039580584007916525375158\n  Bound result 89578865363\n  Bound result 1\n  Bound result 95\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 95\n  Bound result 442\n  Bound result 0\n  Bound result 897380585738952640212771407\n  Bound result 329\n  Bound result 242\n  Bound result 115792089237316195423570985008687907853269984665640564039423622185952944176304\n  Bound result 0\n  Bound result 1303\n  Bound result 7880\n  Bound result 1\n  Bound result 1572\n  Bound result 3957\n  Bound result 16\n  Bound result 11\n  Bound result 346655726824047319996035760837820533492354536785801921409093863823247\n  Bound result 0\n  Bound result 8608\n  Bound result 0\n  Bound result 9\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 1018\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665639564039525507651833500588306\n  Bound result 999999966038178039814522553\n  Bound result 3\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.93s (10.93s CPU time)\n\nRan 3 test suites in 10.93s (11.05s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DriftPebble.approve(address,uint256)\",\"DriftPebble.transfer(address,uint256)\",\"DriftPebble.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":13,\"README.md\":136,\"foundry.toml\":20,\"remappings.txt\":2,\"src/DriftPebble.sol\":17,\"test/DriftPebble.edge.t.sol\":283,\"test/DriftPebble.invariant.t.sol\":249,\"test/DriftPebble.t.sol\":443,\"test/README.md\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4f5350924ede57b958e5213cf79e059ca68d0a062f1adfdc173d5057c46eb36f","verifiedTreeHash":"1f1baf419758688854a9b9aa9c37033001c194e4","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":1058,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 966.67ms\nCompiler run successful!\n","passed":true},{"durationMs":2309,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/DriftPebble.t.sol:DriftPebbleTest\n[PASS] testFuzz_transferAboveBalanceAlwaysReverts(uint256) (runs: 512, μ: 72334, ~: 72662)\nLogs:\n  Bound result 1462717349618417818760467273\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 99797, ~: 100390)\nLogs:\n  Bound result 909207659569928169791687281\n\n[PASS] testFuzz_transferFromAboveAllowanceAlwaysReverts(uint256,uint256) (runs: 512, μ: 128465, ~: 128844)\nLogs:\n  Bound result 286474118442451316062173626\n  Bound result 727100006906955514442195732\n\n[PASS] testFuzz_transferFromDeliversExactlyAndSpendsAllowance(uint256,uint256) (runs: 512, μ: 169662, ~: 170348)\nLogs:\n  Bound result 494390951270630197989563671\n  Bound result 494390951270630197989563671\n\n[PASS] test_approveEmitsEventAndReplacesAllowance() (gas: 139544)\n[PASS] test_approveZeroSpenderReverts() (gas: 40448)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 12419)\n[PASS] test_create2MintsToFactoryAndNotItsCallerOrTransactionOrigin() (gas: 240136)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 98511)\n[PASS] test_emptyAccountCannotTransfer() (gas: 38200)\n[PASS] test_entireSupplyCanMoveAndMoveBack() (gas: 154079)\n[PASS] test_exactAllowanceCanBeSpentOnlyOnce() (gas: 167030)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 194549)\n[PASS] test_launchDistributionAndPoolCustodyTransfersArriveWhole() (gas: 504936)\n[PASS] test_metadataAndEntireInitialSupply() (gas: 112809)\n[PASS] test_noMintBurnOrAdministrativeEntryPoints() (gas: 1432552)\n[PASS] test_revocationStopsSpender() (gas: 121508)\n[PASS] test_runtimeHasNoDelegationOrSelfdestruct() (gas: 1132672)\n[PASS] test_selfTransferFromConsumesAllowanceWithoutChangingBalance() (gas: 112439)\n[PASS] test_selfTransferPreservesBalance() (gas: 54155)\n[PASS] test_transferAboveBalanceRevertsAtomically() (gas: 57984)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 96308)\n[PASS] test_transferFromEmitsEventAndConsumesFiniteAllowance() (gas: 167067)\n[PASS] test_transferFromInsufficientAllowancePreservesState() (gas: 120907)\n[PASS] test_transferFromInsufficientBalanceRollsBackAllowance() (gas: 126570)\n[PASS] test_transferFromZeroRecipientRollsBackAllowance() (gas: 119149)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 174474)\n[PASS] test_transferToZeroRevertsWithoutBurning() (gas: 50446)\n[PASS] test_unapprovedCallerCannotUseAnotherSpendersAllowance() (gas: 110412)\n[PASS] test_zeroAmountTransferToZeroAlsoReverts() (gas: 33141)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73460)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78825)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 13.82ms (65.42ms CPU time)\n\nRan 1 test for test/DriftPebble.invariant.t.sol:DriftPebbleInvariantTest\n[PASS]\nDriftPebbleInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_supplyAndBalancesMatchModel\n DriftPebbleInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| DriftPebbleHandler | approve      | 2728  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| DriftPebbleHandler | transfer     | 2760  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| DriftPebbleHandler | transferFrom | 2704  | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999999999\n  Bound result 2748\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2264\n  Bound result 3824\n  Bound result 2\n  Bound result 0\n  Bound result 454176450656197594235608679\n  Bound result 383\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 242\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 52\n  Bound result 0\n  Bound result 35094358381888176910912513\n  Bound result 1912\n  Bound result 5\n  Bound result 99\n  Bound result 17\n  Bound result 91647098687604811528780222\n  Bound result 1\n  Bound result 105\n  Bound result 6118\n  Bound result 144621072358359015801839256\n  Bound result 242\n  Bound result 1246\n  Bound result 6\n  Bound result 2\n  Bound result 422\n  Bound result 1\n  Bound result 20\n  Bound result 1633\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.23s (2.23s CPU time)\n\nRan 2 test suites in 2.24s (2.25s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":27,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DriftPebble.approve(address,uint256)\",\"DriftPebble.transfer(address,uint256)\",\"DriftPebble.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":13,\"README.md\":136,\"foundry.toml\":20,\"launch.json\":20,\"remappings.txt\":2,\"src/DriftPebble.sol\":17,\"test/DriftPebble.invariant.t.sol\":94,\"test/DriftPebble.t.sol\":434},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6c736ac0fe12f50233381148183949bcd082cb85dd0ea355be3661bbbd7575ad","verifiedTreeHash":"2eb7c81f02fa797f12f89a8793d3ef4d34eb07ea","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":1233,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.11s\nCompiler run successful!\n","passed":true},{"durationMs":2434,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/DriftPebble.t.sol:DriftPebbleTest\n[PASS] testFuzz_transferAboveBalanceAlwaysReverts(uint256) (runs: 512, μ: 72343, ~: 72662)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039473980041965418931035\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 99645, ~: 100022)\nLogs:\n  Bound result 376994623436820449464537388\n\n[PASS] testFuzz_transferFromAboveAllowanceAlwaysReverts(uint256,uint256) (runs: 512, μ: 128463, ~: 128842)\nLogs:\n  Bound result 246018982658152748594358530\n  Bound result 839745201176802248151437593\n\n[PASS] testFuzz_transferFromDeliversExactlyAndSpendsAllowance(uint256,uint256) (runs: 512, μ: 169648, ~: 170372)\nLogs:\n  Bound result 812\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639140\n\n[PASS] test_approveEmitsEventAndReplacesAllowance() (gas: 139544)\n[PASS] test_approveZeroSpenderReverts() (gas: 40448)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 12419)\n[PASS] test_create2MintsToFactoryAndNotItsCallerOrTransactionOrigin() (gas: 240136)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 98511)\n[PASS] test_emptyAccountCannotTransfer() (gas: 38200)\n[PASS] test_entireSupplyCanMoveAndMoveBack() (gas: 154079)\n[PASS] test_exactAllowanceCanBeSpentOnlyOnce() (gas: 167030)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 194549)\n[PASS] test_launchDistributionAndPoolCustodyTransfersArriveWhole() (gas: 504936)\n[PASS] test_metadataAndEntireInitialSupply() (gas: 112809)\n[PASS] test_noMintBurnOrAdministrativeEntryPoints() (gas: 1432552)\n[PASS] test_revocationStopsSpender() (gas: 121508)\n[PASS] test_runtimeHasNoDelegationOrSelfdestruct() (gas: 1132672)\n[PASS] test_selfTransferFromConsumesAllowanceWithoutChangingBalance() (gas: 112439)\n[PASS] test_selfTransferPreservesBalance() (gas: 54155)\n[PASS] test_transferAboveBalanceRevertsAtomically() (gas: 57984)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 96308)\n[PASS] test_transferFromEmitsEventAndConsumesFiniteAllowance() (gas: 167067)\n[PASS] test_transferFromInsufficientAllowancePreservesState() (gas: 120907)\n[PASS] test_transferFromInsufficientBalanceRollsBackAllowance() (gas: 126570)\n[PASS] test_transferFromZeroRecipientRollsBackAllowance() (gas: 119149)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 174474)\n[PASS] test_transferToZeroRevertsWithoutBurning() (gas: 50446)\n[PASS] test_unapprovedCallerCannotUseAnotherSpendersAllowance() (gas: 110412)\n[PASS] test_zeroAmountTransferToZeroAlsoReverts() (gas: 33141)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73460)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78825)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 16.36ms (71.15ms CPU time)\n\nRan 1 test for test/DriftPebble.invariant.t.sol:DriftPebbleInvariantTest\n[PASS]\nDriftPebbleInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_supplyAndBalancesMatchModel\n DriftPebbleInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| DriftPebbleHandler | approve      | 2740  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| DriftPebbleHandler | transfer     | 2768  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| DriftPebbleHandler | transferFrom | 2684  | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 95\n  Bound result 0\n  Bound result 0\n  Bound result 53\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 28\n  Bound result 0\n  Bound result 15\n  Bound result 0\n  Bound result 0\n  Bound result 25\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999999890\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 534555496143382052\n  Bound result 0\n  Bound result 22999999999999999998\n  Bound result 2192\n  Bound result 127\n  Bound result 0\n  Bound result 17529701992875870030\n  Bound result 0\n  Bound result 392896906023275776366494387\n  Bound result 255\n  Bound result 0\n  Bound result 5718\n  Bound result 10000000000000000000\n  Bound result 95\n  Bound result 0\n  Bound result 97\n  Bound result 0\n  Bound result 25\n  Bound result 0\n  Bound result 1000000000\n  Bound result 680\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.35s (2.35s CPU time)\n\nRan 2 test suites in 2.36s (2.37s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DriftPebble.approve(address,uint256)\",\"DriftPebble.transfer(address,uint256)\",\"DriftPebble.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":13,\"README.md\":136,\"foundry.toml\":20,\"remappings.txt\":2,\"src/DriftPebble.sol\":17,\"test/DriftPebble.invariant.t.sol\":94,\"test/DriftPebble.t.sol\":434},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":448,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":986,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/DriftPebble.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e5a2c04d81756490873b55392e53b24f28e30c4ce0773efaffffbb6ac1bcfe45","verifiedTreeHash":"995bff1292ea249342a4f547991010596712111d","verifierVersion":"0.1.0+fb8278c5"}]}