{"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":"583c2a7b-1bfd-4039-93a7-2aec4aba3c44","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"a14cd76e992759747e13e99ca0f207240a2c322da735eceb80cde949362259ca","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"87d1bb62dc44a541ac4fdb55c0d6e0a845788ab98db70bf47676cc7977f80aa9","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"5c5c99a166c3c04ccd57d2e798a955dddd4a65fac4d4ef785f15fd91193b69fe","skillId":"gas-and-size-report","tools":[]},"key":"gas_and_size_report","kind":"code","role":"tests","skillHash":"5c5c99a166c3c04ccd57d2e798a955dddd4a65fac4d4ef785f15fd91193b69fe","skillId":"gas-and-size-report","state":"accepted"}],"objective":"Build BatchNFT, a gas-optimised ERC-721 with ERC721A-style batch minting, and compare it with an OpenZeppelin ERC721 baseline. Do not deploy. BatchNFT: token ids start at 1; mint(uint256 quantity) is public and free, 1 to 20 per call, max supply 10,000. One packed ownership slot (address owner, uint64 startTimestamp) is written per batch; ownerOf walks back to the nearest written slot (at most 19 steps); a transfer writes the moved token's slot and, if the next id exists and its slot is empty, writes that slot with the previous owner, so the rest of the batch keeps its owner. balanceOf is kept per address. Full ERC-721 (approve, setApprovalForAll, transferFrom, safeTransferFrom with onERC721Received, ERC-165), no burn, no enumerable extension; tokenURI returns a fixed base string plus the id. Both mint with no receiver callback and emit one Transfer per id. BaselineNFT: OpenZeppelin ERC721 (vendored by the build step) with the same mint rules, minting each id separately with _mint. Differential test: fuzzed sequences of mints and transfers (first, middle and last id of a batch, self-transfers, approved operators) applied to both contracts give identical ownerOf and balanceOf for every id and address and succeed or revert on the same calls (error data may differ).","parentJobId":null,"planHash":"ef980720d5c5f6a4de3af36f2b7ed1aff4b4072dce01d752eb5e6674654441d3","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"583c2a7b-1bfd-4039-93a7-2aec4aba3c44","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-269-build-batchnft-gas-optimised-erc-721"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51432","feedbackHash":"329be0c57cbae047929f0ca4adc35afb7ae285b05065c725e48bfcf43a9766de","nodeKey":"build_contract_project","submissionHash":"a14cd76e992759747e13e99ca0f207240a2c322da735eceb80cde949362259ca","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51432","feedbackHash":"3a413804f19a6d4bf2708bee652008fb7544fde2791f8bfc4b937a2ba6a8f8f8","nodeKey":"gas_and_size_report","submissionHash":"87d1bb62dc44a541ac4fdb55c0d6e0a845788ab98db70bf47676cc7977f80aa9","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a61a7db4a6bb788e91507103dcc5fce3eeb88bce9e1abd911353a07b46401918","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fde317ac638e3f50439bb810ae5c94ba045e2975e1fadb8a32148a78f3715d1c","device":"03f15d1296244279","findings":[],"hash":"87d1bb62dc44a541ac4fdb55c0d6e0a845788ab98db70bf47676cc7977f80aa9","nodeId":"4bdf1376-0b20-4f0d-83e7-49d9d6302017","outcome":"completed","summary":"Committed. The work is complete and verified.\n\n**Outcome.** The gas and size report is at `artifacts/gas.md`, the snapshot is committed as `.gas-snapshot`, and the full suite passes. I found no size defect and no implementation defect, so no findings file was written.\n\n**Sizes.** No contract exceeds the 24,576-byte deploy limit.\n\n| Contract | Runtime bytes |\n| --- | ---: |\n| BatchNFT | 4,284 |\n| BaselineNFT | 4,173 |\n\n**What I added.** A new test file, `test/GasSnapshot.t.sol`, with one isolated test per public function for each contract from an identical fixture, so every snapshot line names the function it measures. It also has a logging test that measures the assignment's scenarios as single calls with state reverted between them. The existing tests were left as they were.\n\n**Headline numbers, isolated calls.**\n\n| Scenario | BatchNFT | Baseline |\n| --- | ---: | ---: |\n| mint(1) | 60,994 | 61,529 |\n| mint(5) | 68,878 | 161,281 |\n| mint(20) | 98,443 | 535,351 |\n| transfer first of 20 | 74,202 | 48,065 |\n| transfer middle of 20 | 111,228 | 48,065 |\n| transfer last of 20 | 113,294 | 48,065 |\n| ownerOf last of 20 | 51,941 | 7,682 |\n\n**Where BatchNFT costs more.** Every first transfer out of a batch, at 1.5x to 2.4x the baseline, because it pays the ownership walk, a fresh slot write for the moved id, and a back-fill write for the next id. Any owner lookup on an unwritten id, up to 6.8x at 19 steps, and `approve` inherits the same walk. Second transfers of a token cost about 4,000 more. The runtime is 111 bytes larger. Minting 5 and 20 tokens is 57 and 82 percent cheaper, and minting 1 is a wash.\n\n**Verification.** `forge build` is clean, all 115 tests pass, and `forge snapshot --check` passes on repeated full-suite runs. The fuzz lines in the snapshot only shift when a filtered subset is run, which the report notes. The `artifacts/` directory was hidden by a repo-local git exclude rule, so I force-added the report to make sure it is in the commit.","treeHash":"ebe3d9771f6b1fc4b10b2ec79b89809c8c9fe539","usage":{"cachedInputTokens":1099741,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":35189,"runtime":"claude","turns":27,"wallClockMs":557841}},{"artifacts":[],"attempt":1,"bundleHash":"d550af96ae481227aaaec360680e648ef2143d6de94b712f711ad67ae429b58d","device":"03f15d1296244279","findings":[],"hash":"a14cd76e992759747e13e99ca0f207240a2c322da735eceb80cde949362259ca","nodeId":"ede6c44d-e957-4b89-8046-080859b37b1d","outcome":"completed","summary":"Committed on `main` as `8ba40d1`. Everything is in place and verified.\n\n**What was built**\n\n- `src/BatchNFT.sol`: ERC721A-style ERC-721. Ids start at 1, `mint(quantity)` is public and free for 1 to 20 tokens up to a 10,000 cap. One packed slot (owner plus uint64 timestamp) is written per batch. `ownerOf` walks back at most 19 slots. A transfer writes the moved token's slot and back-fills the next id with the previous slot data when that id is minted and still empty. Full approvals, both `safeTransferFrom` overloads with the receiver check, ERC-165, `tokenURI` as base string plus id, no burn, no enumerable extension.\n- `src/BaselineNFT.sol`: OpenZeppelin ERC721 with the same mint rules, one `_mint` per id.\n- `lib/`: OpenZeppelin Contracts v5.1.0 subset and forge-std v1.9.4 vendored as plain files. No submodules, so the offline verifier can build.\n- `README.md`: design, storage model, parity decisions with OpenZeppelin, gas table, assumptions, deployment parameters, and operational responsibilities.\n\n**Checks run**\n\n| Check | Result |\n| --- | --- |\n| `forge build` (solc 0.8.26 pinned) | pass |\n| `forge test` | 57 passed, 0 failed |\n| `forge fmt --check` | pass |\n| Differential fuzz at 1500 runs | pass |\n\n**Tests** cover mint boundaries and failure cases, one Transfer event per id, single slot written per batch, first, middle and last transfers with raw-slot checks, no overwrite of a following batch's first slot, approvals and operators, every `safeTransferFrom` failure mode, and a differential fuzz that applies identical sequences to both contracts and compares `ownerOf`, `balanceOf`, `getApproved`, `isApprovedForAll`, and success versus revert per call. A mutation check confirmed the differential test fails immediately when the back-fill is broken.\n\n**Gas** for `mint(20)` is roughly 94k on BatchNFT against 531k on the baseline. The first transfer out of a batch costs more on BatchNFT, which the README documents as the expected trade-off.\n\n**Noted assumptions**: minting is unrestricted with no owner role, base URI is immutable after deployment, and the contracts target the Cancun EVM. No deploy script was requested and none was written.","treeHash":"cf67962326cc62e653f82e1c3a14afb6037690bf","usage":{"cachedInputTokens":1262135,"inputTokens":770,"model":"claude-fable-5-1","outputTokens":42525,"runtime":"claude","turns":25,"wallClockMs":503413}}],"verification":[{"checks":[{"durationMs":2045,"exitCode":0,"name":"build","output":"Compiling 45 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.98s\nCompiler run successful!\n","passed":true},{"durationMs":365,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/Gas.t.sol:GasComparisonTest\n[PASS] test_gas_mint() (gas: 851635)\nLogs:\n  mint(1)   BatchNFT / Baseline: 56890 57413\n  mint(5)   BatchNFT / Baseline: 33574 125965\n  mint(20)  BatchNFT / Baseline: 63139 500035\n\n[PASS] test_gas_ownerOfWalk() (gas: 680999)\nLogs:\n  ownerOf first / last-of-20 / baseline: 1371 43440 1181\n\n[PASS] test_gas_transferPositionsInBatch() (gas: 830815)\nLogs:\n  transfer first  BatchNFT / Baseline: 36216 12079\n  transfer middle BatchNFT / Baseline: 67028 7279\n  transfer last   BatchNFT / Baseline: 49168 7279\n  transfer again    BatchNFT / Baseline: 5180 5227\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.13ms (773.97µs CPU time)\n\nRan 4 tests for test/GasSnapshot.t.sol:GasReportLogTest\n[PASS] test_gasReport_mint() (gas: 879404)\nLogs:\n  mint(1)  warm balance     BatchNFT / Baseline: 39790 40325\n  mint(5)                   BatchNFT / Baseline: 47674 140077\n  mint(20)                  BatchNFT / Baseline: 77239 514147\n\n[PASS] test_gasReport_ownerOf() (gas: 71839)\nLogs:\n  ownerOf first of 20       BatchNFT / Baseline: 9881 7682\n  ownerOf last of 20        BatchNFT / Baseline: 43441 3182\n\n[PASS] test_gasReport_transferFromPositionsInBatch() (gas: 330040)\nLogs:\n  transferFrom first of 20  BatchNFT / Baseline: 52262 26125\n  transferFrom middle of 20 BatchNFT / Baseline: 89288 26125\n  transferFrom last of 20   BatchNFT / Baseline: 91354 26125\n\n[PASS] test_gasReport_transferFromSlotAlreadyWritten() (gas: 121527)\nLogs:\n  transferFrom slot written BatchNFT / Baseline: 5173 5227\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.15ms (789.49µs CPU time)\n\nRan 26 tests for test/GasSnapshot.t.sol:BaselineNFTGasTest\n[PASS] test_gas_MAX_BATCH() (gas: 5492)\n[PASS] test_gas_MAX_SUPPLY() (gas: 5535)\n[PASS] test_gas_START_TOKEN_ID() (gas: 5449)\n[PASS] test_gas_approve() (gas: 39437)\n[PASS] test_gas_balanceOf() (gas: 9889)\n[PASS] test_gas_getApproved() (gas: 10083)\n[PASS] test_gas_isApprovedForAll() (gas: 12365)\n[PASS] test_gas_mint_1() (gas: 45608)\n[PASS] test_gas_mint_1_coldBalance() (gas: 62623)\n[PASS] test_gas_mint_20() (gas: 519386)\n[PASS] test_gas_mint_5() (gas: 145293)\n[PASS] test_gas_name() (gas: 8727)\n[PASS] test_gas_ownerOf_firstOfBatch() (gas: 7902)\n[PASS] test_gas_ownerOf_lastOfBatch() (gas: 7893)\n[PASS] test_gas_safeTransferFrom_toEOA() (gas: 36281)\n[PASS] test_gas_safeTransferFrom_withData_toReceiver() (gas: 166133)\n[PASS] test_gas_setApprovalForAll() (gas: 36958)\n[PASS] test_gas_supportsInterface() (gas: 5748)\n[PASS] test_gas_symbol() (gas: 8727)\n[PASS] test_gas_tokenURI() (gas: 12011)\n[PASS] test_gas_totalSupply() (gas: 7644)\n[PASS] test_gas_transferFrom_byApprovedAddress() (gas: 35917)\n[PASS] test_gas_transferFrom_byOperator() (gas: 37648)\n[PASS] test_gas_transferFrom_firstOfBatch() (gas: 33409)\n[PASS] test_gas_transferFrom_lastOfBatch() (gas: 33343)\n[PASS] test_gas_transferFrom_middleOfBatch() (gas: 33397)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 1.19ms (938.26µs CPU time)\n\nRan 28 tests for test/GasSnapshot.t.sol:BatchNFTGasTest\n[PASS] test_gas_MAX_BATCH() (gas: 5492)\n[PASS] test_gas_MAX_SUPPLY() (gas: 5535)\n[PASS] test_gas_START_TOKEN_ID() (gas: 5471)\n[PASS] test_gas_approve() (gas: 83457)\n[PASS] test_gas_balanceOf() (gas: 9976)\n[PASS] test_gas_getApproved() (gas: 10024)\n[PASS] test_gas_isApprovedForAll() (gas: 12365)\n[PASS] test_gas_mint_1() (gas: 45052)\n[PASS] test_gas_mint_1_coldBalance() (gas: 62089)\n[PASS] test_gas_mint_20() (gas: 82457)\n[PASS] test_gas_mint_5() (gas: 52891)\n[PASS] test_gas_name() (gas: 8727)\n[PASS] test_gas_ownerOf_firstOfBatch() (gas: 10119)\n[PASS] test_gas_ownerOf_lastOfBatch() (gas: 52154)\n[PASS] test_gas_ownershipOf_lastOfBatch() (gas: 52365)\n[PASS] test_gas_rawOwnershipSlot() (gas: 7916)\n[PASS] test_gas_safeTransferFrom_toEOA() (gas: 97362)\n[PASS] test_gas_safeTransferFrom_withData_toReceiver() (gas: 227212)\n[PASS] test_gas_setApprovalForAll() (gas: 36919)\n[PASS] test_gas_supportsInterface() (gas: 5764)\n[PASS] test_gas_symbol() (gas: 8838)\n[PASS] test_gas_tokenURI() (gas: 12128)\n[PASS] test_gas_totalSupply() (gas: 7519)\n[PASS] test_gas_transferFrom_byApprovedAddress() (gas: 85967)\n[PASS] test_gas_transferFrom_byOperator() (gas: 98886)\n[PASS] test_gas_transferFrom_firstOfBatch() (gas: 57507)\n[PASS] test_gas_transferFrom_lastOfBatch() (gas: 96644)\n[PASS] test_gas_transferFrom_middleOfBatch() (gas: 94543)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 5.07ms (1.77ms CPU time)\n\nRan 6 tests for test/BaselineNFT.t.sol:BaselineNFTTest\n[PASS] test_metadata() (gas: 22777)\n[PASS] test_mint_doesNotCallReceiverHook() (gas: 356260)\n[PASS] test_mint_idsStartAtOneAndEmitOneTransferPerId() (gas: 161018)\n[PASS] test_mint_respectsMaxSupply() (gas: 250360960)\n[PASS] test_mint_revertsOnZeroAndAboveMaxBatch() (gas: 13308)\n[PASS] test_ownerOf_revertsForUnminted() (gas: 11055)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 229.13ms (24.32ms CPU time)\n\nRan 45 tests for test/BatchNFT.t.sol:BatchNFTTest\n[PASS] testFuzz_ownerOfResolvesWholeBatch(uint8,uint8) (runs: 256, μ: 165764, ~: 164455)\nLogs:\n  Bound result 11\n  Bound result 5\n\n[PASS] test_approve_byOperatorForAll() (gas: 123543)\n[PASS] test_approve_emitsAndStores() (gas: 104307)\n[PASS] test_approve_revertsForNonOwner() (gas: 72769)\n[PASS] test_approve_revertsForNonexistent() (gas: 15770)\n[PASS] test_balanceOf_unknownAddressIsZero() (gas: 12921)\n[PASS] test_balanceOf_zeroAddressReverts() (gas: 8855)\n[PASS] test_getApproved_revertsForNonexistent() (gas: 11035)\n[PASS] test_metadata() (gas: 24180)\n[PASS] test_mint_consecutiveBatchesFromDifferentMinters() (gas: 264332)\n[PASS] test_mint_doesNotCallReceiverHook() (gas: 337095)\n[PASS] test_mint_idsStartAtOneAndEmitOneTransferPerId() (gas: 107490)\n[PASS] test_mint_respectsMaxSupply() (gas: 31951309)\n[PASS] test_mint_revertsAboveMaxBatch() (gas: 11299)\n[PASS] test_mint_revertsOnZeroQuantity() (gas: 11264)\n[PASS] test_mint_writesOnlyFirstSlotOfBatch() (gas: 270990)\n[PASS] test_ownerOf_revertsForZeroAndUnminted() (gas: 77600)\n[PASS] test_safeTransfer_bubblesReceiverRevert() (gas: 182276)\n[PASS] test_safeTransfer_revertsForContractWithoutHook() (gas: 133369)\n[PASS] test_safeTransfer_revertsOnWrongMagic() (gas: 178968)\n[PASS] test_safeTransfer_silentRevertBecomesNonReceiverError() (gas: 173296)\n[PASS] test_safeTransfer_threeArgOverloadUsesEmptyData() (gas: 437988)\n[PASS] test_safeTransfer_toAcceptingReceiver_passesArguments() (gas: 537253)\n[PASS] test_safeTransfer_toEOA() (gas: 125993)\n[PASS] test_safeTransfer_unauthorisedRevertsBeforeHook() (gas: 342507)\n[PASS] test_setApprovalForAll_zeroOperatorReverts() (gas: 11467)\n[PASS] test_supportsInterface() (gas: 14458)\n[PASS] test_tokenURI() (gas: 75895)\n[PASS] test_tokenURI_revertsForNonexistent() (gas: 78048)\n[PASS] test_transfer_approvalIsPerToken() (gas: 110126)\n[PASS] test_transfer_backToBackTransfersOfSameToken() (gas: 145642)\n[PASS] test_transfer_byApprovedAddress_clearsApproval() (gas: 165769)\n[PASS] test_transfer_byOperatorForAll() (gas: 181774)\n[PASS] test_transfer_firstOfBatch_backfillsNextSlot() (gas: 155289)\n[PASS] test_transfer_lastOfBatch_doesNotOverwriteNextBatchStart() (gas: 184421)\n[PASS] test_transfer_lastOfBatch_doesNotWriteBeyondMinted() (gas: 197573)\n[PASS] test_transfer_middleOfBatch() (gas: 165178)\n[PASS] test_transfer_nextSlotAlreadyWrittenIsLeftAlone() (gas: 186994)\n[PASS] test_transfer_revertsForNonexistentToken() (gas: 70305)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 66021)\n[PASS] test_transfer_revertsWhenFromIsNotOwner() (gas: 70962)\n[PASS] test_transfer_revertsWhenUnauthorised() (gas: 77598)\n[PASS] test_transfer_selfTransfer() (gas: 105505)\n[PASS] test_transfer_updatesTimestampForMovedToken() (gas: 126767)\n[PASS] test_transfer_walkNeverExceedsNineteenSteps() (gas: 343449)\nSuite result: ok. 45 passed; 0 failed; 0 skipped; finished in 229.13ms (22.26ms CPU time)\n\nRan 3 tests for test/Differential.t.sol:DifferentialTest\n[PASS] testFuzz_differential(uint256[]) (runs: 256, μ: 4164258, ~: 3677912)\n[PASS] testFuzz_differentialLongSequence(uint256,uint8) (runs: 256, μ: 4886504, ~: 2270626)\nLogs:\n  Bound result 1\n\n[PASS] test_differential_scriptedScenario() (gas: 7605512)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 285.25ms (538.68ms CPU time)\n\nRan 7 test suites in 286.30ms (752.05ms CPU time): 115 tests passed, 0 failed, 0 skipped (115 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"87d1bb62dc44a541ac4fdb55c0d6e0a845788ab98db70bf47676cc7977f80aa9","verifiedTreeHash":"ebe3d9771f6b1fc4b10b2ec79b89809c8c9fe539","verifierVersion":"0.1.0+ff982c0f"},{"checks":[{"durationMs":1834,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.76s\nCompiler run successful!\n","passed":true},{"durationMs":381,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/Gas.t.sol:GasComparisonTest\n[PASS] test_gas_mint() (gas: 851635)\nLogs:\n  mint(1)   BatchNFT / Baseline: 56890 57413\n  mint(5)   BatchNFT / Baseline: 33574 125965\n  mint(20)  BatchNFT / Baseline: 63139 500035\n\n[PASS] test_gas_ownerOfWalk() (gas: 680999)\nLogs:\n  ownerOf first / last-of-20 / baseline: 1371 43440 1181\n\n[PASS] test_gas_transferPositionsInBatch() (gas: 830815)\nLogs:\n  transfer first  BatchNFT / Baseline: 36216 12079\n  transfer middle BatchNFT / Baseline: 67028 7279\n  transfer last   BatchNFT / Baseline: 49168 7279\n  transfer again    BatchNFT / Baseline: 5180 5227\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.77ms (1.43ms CPU time)\n\nRan 45 tests for test/BatchNFT.t.sol:BatchNFTTest\n[PASS] testFuzz_ownerOfResolvesWholeBatch(uint8,uint8) (runs: 256, μ: 165764, ~: 164455)\nLogs:\n  Bound result 11\n  Bound result 5\n\n[PASS] test_approve_byOperatorForAll() (gas: 123543)\n[PASS] test_approve_emitsAndStores() (gas: 104307)\n[PASS] test_approve_revertsForNonOwner() (gas: 72769)\n[PASS] test_approve_revertsForNonexistent() (gas: 15770)\n[PASS] test_balanceOf_unknownAddressIsZero() (gas: 12921)\n[PASS] test_balanceOf_zeroAddressReverts() (gas: 8855)\n[PASS] test_getApproved_revertsForNonexistent() (gas: 11035)\n[PASS] test_metadata() (gas: 24180)\n[PASS] test_mint_consecutiveBatchesFromDifferentMinters() (gas: 264332)\n[PASS] test_mint_doesNotCallReceiverHook() (gas: 337095)\n[PASS] test_mint_idsStartAtOneAndEmitOneTransferPerId() (gas: 107490)\n[PASS] test_mint_respectsMaxSupply() (gas: 31951309)\n[PASS] test_mint_revertsAboveMaxBatch() (gas: 11299)\n[PASS] test_mint_revertsOnZeroQuantity() (gas: 11264)\n[PASS] test_mint_writesOnlyFirstSlotOfBatch() (gas: 270990)\n[PASS] test_ownerOf_revertsForZeroAndUnminted() (gas: 77600)\n[PASS] test_safeTransfer_bubblesReceiverRevert() (gas: 182276)\n[PASS] test_safeTransfer_revertsForContractWithoutHook() (gas: 133369)\n[PASS] test_safeTransfer_revertsOnWrongMagic() (gas: 178968)\n[PASS] test_safeTransfer_silentRevertBecomesNonReceiverError() (gas: 173296)\n[PASS] test_safeTransfer_threeArgOverloadUsesEmptyData() (gas: 437988)\n[PASS] test_safeTransfer_toAcceptingReceiver_passesArguments() (gas: 537253)\n[PASS] test_safeTransfer_toEOA() (gas: 125993)\n[PASS] test_safeTransfer_unauthorisedRevertsBeforeHook() (gas: 342507)\n[PASS] test_setApprovalForAll_zeroOperatorReverts() (gas: 11467)\n[PASS] test_supportsInterface() (gas: 14458)\n[PASS] test_tokenURI() (gas: 75895)\n[PASS] test_tokenURI_revertsForNonexistent() (gas: 78048)\n[PASS] test_transfer_approvalIsPerToken() (gas: 110126)\n[PASS] test_transfer_backToBackTransfersOfSameToken() (gas: 145642)\n[PASS] test_transfer_byApprovedAddress_clearsApproval() (gas: 165769)\n[PASS] test_transfer_byOperatorForAll() (gas: 181774)\n[PASS] test_transfer_firstOfBatch_backfillsNextSlot() (gas: 155289)\n[PASS] test_transfer_lastOfBatch_doesNotOverwriteNextBatchStart() (gas: 184421)\n[PASS] test_transfer_lastOfBatch_doesNotWriteBeyondMinted() (gas: 197573)\n[PASS] test_transfer_middleOfBatch() (gas: 165178)\n[PASS] test_transfer_nextSlotAlreadyWrittenIsLeftAlone() (gas: 186994)\n[PASS] test_transfer_revertsForNonexistentToken() (gas: 70305)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 66021)\n[PASS] test_transfer_revertsWhenFromIsNotOwner() (gas: 70962)\n[PASS] test_transfer_revertsWhenUnauthorised() (gas: 77598)\n[PASS] test_transfer_selfTransfer() (gas: 105505)\n[PASS] test_transfer_updatesTimestampForMovedToken() (gas: 126767)\n[PASS] test_transfer_walkNeverExceedsNineteenSteps() (gas: 343449)\nSuite result: ok. 45 passed; 0 failed; 0 skipped; finished in 18.70ms (35.19ms CPU time)\n\nRan 6 tests for test/BaselineNFT.t.sol:BaselineNFTTest\n[PASS] test_metadata() (gas: 22777)\n[PASS] test_mint_doesNotCallReceiverHook() (gas: 356260)\n[PASS] test_mint_idsStartAtOneAndEmitOneTransferPerId() (gas: 161018)\n[PASS] test_mint_respectsMaxSupply() (gas: 250360960)\n[PASS] test_mint_revertsOnZeroAndAboveMaxBatch() (gas: 13308)\n[PASS] test_ownerOf_revertsForUnminted() (gas: 11055)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 275.81ms (42.88ms CPU time)\n\nRan 3 tests for test/Differential.t.sol:DifferentialTest\n[PASS] testFuzz_differential(uint256[]) (runs: 256, μ: 4164258, ~: 3677912)\n[PASS] testFuzz_differentialLongSequence(uint256,uint8) (runs: 256, μ: 4886504, ~: 2270626)\nLogs:\n  Bound result 1\n\n[PASS] test_differential_scriptedScenario() (gas: 7605512)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 290.07ms (543.29ms CPU time)\n\nRan 4 test suites in 291.08ms (586.35ms CPU time): 57 tests passed, 0 failed, 0 skipped (57 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a14cd76e992759747e13e99ca0f207240a2c322da735eceb80cde949362259ca","verifiedTreeHash":"cf67962326cc62e653f82e1c3a14afb6037690bf","verifierVersion":"0.1.0+ff982c0f"}]}